remote.c File Reference
#include "config.h"
#include <ctype.h>
#include "daemon/remote.h"
#include "daemon/worker.h"
#include "daemon/daemon.h"
#include "daemon/stats.h"
#include "daemon/cachedump.h"
#include "util/log.h"
#include "util/config_file.h"
#include "util/net_help.h"
#include "util/module.h"
#include "services/listen_dnsport.h"
#include "services/cache/rrset.h"
#include "services/cache/infra.h"
#include "services/mesh.h"
#include "services/localzone.h"
#include "services/authzone.h"
#include "services/rpz.h"
#include "util/storage/slabhash.h"
#include "util/fptr_wlist.h"
#include "util/data/dname.h"
#include "validator/validator.h"
#include "validator/val_kcache.h"
#include "validator/val_kentry.h"
#include "validator/val_anchor.h"
#include "iterator/iterator.h"
#include "iterator/iter_fwd.h"
#include "iterator/iter_hints.h"
#include "iterator/iter_delegpt.h"
#include "services/outbound_list.h"
#include "services/outside_network.h"
#include "sldns/str2wire.h"
#include "sldns/parseutil.h"
#include "sldns/wire2str.h"
#include "sldns/sbuffer.h"

Data Structures

struct  del_info
 Local info for deletion functions. More...
struct  infra_arg
 structure for argument data for dump infra host More...
struct  ratelimit_list_arg
 struct for user arg ratelimit list More...


#define SQ   "="
 what to put on statistics lines between var and value, ": " or "="
#define ip_ratelimit_list_arg   ratelimit_list_arg


static void timeval_subtract (struct timeval *d, const struct timeval *end, const struct timeval *start)
 subtract timers and the values do not overflow or become negative
static void timeval_divide (struct timeval *avg, const struct timeval *sum, long long d)
 divide sum of timers to get average
static int remote_setup_ctx (struct daemon_remote *rc, struct config_file *cfg)
struct daemon_remotedaemon_remote_create (struct config_file *cfg)
 Create new remote control state for the daemon. More...
void daemon_remote_clear (struct daemon_remote *rc)
 remote control state to clear up. More...
void daemon_remote_delete (struct daemon_remote *rc)
 remote control state to delete. More...
static int add_open (const char *ip, int nr, struct listen_port **list, int noproto_is_err, struct config_file *cfg)
 Add and open a new control port. More...
struct listen_portdaemon_remote_open_ports (struct config_file *cfg)
 Open and create listening ports for remote control. More...
static int accept_open (struct daemon_remote *rc, int fd)
 open accept commpoint
int daemon_remote_open_accept (struct daemon_remote *rc, struct listen_port *ports, struct worker *worker)
 Setup comm points for accepting remote control connections. More...
void daemon_remote_stop_accept (struct daemon_remote *rc)
 Stop accept handlers for TCP (until enabled again) More...
void daemon_remote_start_accept (struct daemon_remote *rc)
 Stop accept handlers for TCP (until enabled again) More...
int remote_accept_callback (struct comm_point *c, void *arg, int err, struct comm_reply *ATTR_UNUSED(rep))
static void state_list_remove_elem (struct rc_state **list, struct comm_point *c)
 delete from list
static void clean_point (struct daemon_remote *rc, struct rc_state *s)
 decrease active count and remove commpoint from busy list
int ssl_print_text (RES *res, const char *text)
static int ssl_print_vmsg (RES *ssl, const char *format, va_list args)
 print text over the ssl connection
int ssl_printf (RES *ssl, const char *format,...)
 printf style printing to the ssl connection
int ssl_read_line (RES *res, char *buf, size_t max)
static char * skipwhite (char *str)
 skip whitespace, return new pointer into string
static void send_ok (RES *ssl)
 send the OK to the control client
static void do_stop (RES *ssl, struct worker *worker)
 do the stop command
static void do_reload (RES *ssl, struct worker *worker, int reuse_cache)
 do the reload command
static void do_verbosity (RES *ssl, char *str)
 do the verbosity command
static int print_stats (RES *ssl, const char *nm, struct ub_stats_info *s)
 print stats from statinfo
static int print_thread_stats (RES *ssl, int i, struct ub_stats_info *s)
 print stats for one thread
static int print_longnum (RES *ssl, const char *desc, size_t x)
 print long number
static int print_mem (RES *ssl, struct worker *worker, struct daemon *daemon, struct ub_stats_info *s)
 print mem stats
static int print_uptime (RES *ssl, struct worker *worker, int reset)
 print uptime stats
static int print_hist (RES *ssl, struct ub_stats_info *s)
 print extended histogram
static int print_ext (RES *ssl, struct ub_stats_info *s, int inhibit_zero)
 print extended stats
static void do_stats (RES *ssl, struct worker *worker, int reset)
 do the stats command
static int parse_arg_name (RES *ssl, char *str, uint8_t **res, size_t *len, int *labs)
 parse commandline argument domain name
static int find_arg2 (RES *ssl, char *arg, char **arg2)
 find second argument, modifies string
static int perform_zone_add (RES *ssl, struct local_zones *zones, char *arg)
 Add a new zone.
static void do_zone_add (RES *ssl, struct local_zones *zones, char *arg)
 Do the local_zone command.
static void do_zones_add (RES *ssl, struct local_zones *zones)
 Do the local_zones command.
static int perform_zone_remove (RES *ssl, struct local_zones *zones, char *arg)
 Remove a zone.
static void do_zone_remove (RES *ssl, struct local_zones *zones, char *arg)
 Do the local_zone_remove command.
static void do_zones_remove (RES *ssl, struct local_zones *zones)
 Do the local_zones_remove command.
static int check_RR_syntax (RES *ssl, char *str, int line)
 check syntax of newly added RR
static int perform_data_add (RES *ssl, struct local_zones *zones, char *arg, int line)
 Add new RR data.
static void do_data_add (RES *ssl, struct local_zones *zones, char *arg)
 Do the local_data command.
static void do_datas_add (RES *ssl, struct local_zones *zones)
 Do the local_datas command.
static int perform_data_remove (RES *ssl, struct local_zones *zones, char *arg)
 Remove RR data.
static void do_data_remove (RES *ssl, struct local_zones *zones, char *arg)
 Do the local_data_remove command.
static void do_datas_remove (RES *ssl, struct local_zones *zones)
 Do the local_datas_remove command.
static void do_view_zone_add (RES *ssl, struct worker *worker, char *arg)
 Add a new zone to view.
static void do_view_zone_remove (RES *ssl, struct worker *worker, char *arg)
 Remove a zone from view.
static void do_view_data_add (RES *ssl, struct worker *worker, char *arg)
 Add new RR data to view.
static void do_view_datas_add (RES *ssl, struct worker *worker, char *arg)
 Add new RR data from stdin to view.
static void do_view_data_remove (RES *ssl, struct worker *worker, char *arg)
 Remove RR data from view.
static void do_view_datas_remove (RES *ssl, struct worker *worker, char *arg)
 Remove RR data from stdin from view.
static void do_lookup (RES *ssl, struct worker *worker, char *arg)
 cache lookup of nameservers
static void do_cache_remove (struct worker *worker, uint8_t *nm, size_t nmlen, uint16_t t, uint16_t c)
 flush something from rrset and msg caches
static void do_flush_type (RES *ssl, struct worker *worker, char *arg)
 flush a type
static void do_flush_stats (RES *ssl, struct worker *worker)
 flush statistics
static void infra_del_host (struct lruhash_entry *e, void *arg)
 callback to delete hosts in infra cache
static void do_flush_infra (RES *ssl, struct worker *worker, char *arg)
 flush infra cache
static void do_flush_requestlist (RES *ssl, struct worker *worker)
 flush requestlist
static void zone_del_rrset (struct lruhash_entry *e, void *arg)
 callback to delete rrsets in a zone
static void zone_del_msg (struct lruhash_entry *e, void *arg)
 callback to delete messages in a zone
static void zone_del_kcache (struct lruhash_entry *e, void *arg)
 callback to delete keys in zone
static void do_flush_zone (RES *ssl, struct worker *worker, char *arg)
 remove all rrsets and keys from zone from cache
static void bogus_del_rrset (struct lruhash_entry *e, void *arg)
 callback to delete bogus rrsets
static void bogus_del_msg (struct lruhash_entry *e, void *arg)
 callback to delete bogus messages
static void bogus_del_kcache (struct lruhash_entry *e, void *arg)
 callback to delete bogus keys
static void do_flush_bogus (RES *ssl, struct worker *worker)
 remove all bogus rrsets, msgs and keys from cache
static void negative_del_rrset (struct lruhash_entry *e, void *arg)
 callback to delete negative and servfail rrsets
static void negative_del_msg (struct lruhash_entry *e, void *arg)
 callback to delete negative and servfail messages
static void negative_del_kcache (struct lruhash_entry *e, void *arg)
 callback to delete negative key entries
static void do_flush_negative (RES *ssl, struct worker *worker)
 remove all negative(NODATA,NXDOMAIN), and servfail messages from cache
static void do_flush_name (RES *ssl, struct worker *w, char *arg)
 remove name rrset from cache
static int ssl_print_name_dp (RES *ssl, const char *str, uint8_t *nm, uint16_t dclass, struct delegpt *dp)
 printout a delegation point info
static int print_root_fwds (RES *ssl, struct iter_forwards *fwds, uint8_t *root)
 print root forwards
static struct delegptparse_delegpt (RES *ssl, char *args, uint8_t *nm)
 parse args into delegpt
static void do_forward (RES *ssl, struct worker *worker, char *args)
 do the status command
static int parse_fs_args (RES *ssl, char *args, uint8_t **nm, struct delegpt **dp, int *insecure, int *prime)
static void do_forward_add (RES *ssl, struct worker *worker, char *args)
 do the forward_add command
static void do_forward_remove (RES *ssl, struct worker *worker, char *args)
 do the forward_remove command
static void do_stub_add (RES *ssl, struct worker *worker, char *args)
 do the stub_add command
static void do_stub_remove (RES *ssl, struct worker *worker, char *args)
 do the stub_remove command
static void do_insecure_add (RES *ssl, struct worker *worker, char *arg)
 do the insecure_add command
static void do_insecure_remove (RES *ssl, struct worker *worker, char *arg)
 do the insecure_remove command
static void do_insecure_list (RES *ssl, struct worker *worker)
static void do_status (RES *ssl, struct worker *worker)
 do the status command
static void get_mesh_age (struct mesh_state *m, char *buf, size_t len, struct module_env *env)
 get age for the mesh state
static void get_mesh_status (struct mesh_area *mesh, struct mesh_state *m, char *buf, size_t len)
 get status of a mesh state
static void do_dump_requestlist (RES *ssl, struct worker *worker)
 do the dump_requestlist command
static void dump_infra_host (struct lruhash_entry *e, void *arg)
 callback for every host element in the infra cache
static void do_dump_infra (RES *ssl, struct worker *worker)
 do the dump_infra command
static void do_log_reopen (RES *ssl, struct worker *worker)
 do the log_reopen command
static void do_auth_zone_reload (RES *ssl, struct worker *worker, char *arg)
 do the auth_zone_reload command
static void do_auth_zone_transfer (RES *ssl, struct worker *worker, char *arg)
 do the auth_zone_transfer command
static void do_set_option (RES *ssl, struct worker *worker, char *arg)
 do the set_option command
void remote_get_opt_ssl (char *line, void *arg)
 routine to printout option values over SSL
static void do_get_option (RES *ssl, struct worker *worker, char *arg)
 do the get_option command
static void do_list_forwards (RES *ssl, struct worker *worker)
 do the list_forwards command
static void do_list_stubs (RES *ssl, struct worker *worker)
 do the list_stubs command
static void do_list_auth_zones (RES *ssl, struct auth_zones *az)
 do the list_auth_zones command
static void do_list_local_zones (RES *ssl, struct local_zones *zones)
 do the list_local_zones command
static void do_list_local_data (RES *ssl, struct worker *worker, struct local_zones *zones)
 do the list_local_data command
static void do_view_list_local_zones (RES *ssl, struct worker *worker, char *arg)
 do the view_list_local_zones command
static void do_view_list_local_data (RES *ssl, struct worker *worker, char *arg)
 do the view_list_local_data command
static void rate_list (struct lruhash_entry *e, void *arg)
 list items in the ratelimit table
static void ip_rate_list (struct lruhash_entry *e, void *arg)
 list items in the ip_ratelimit table
static void do_ratelimit_list (RES *ssl, struct worker *worker, char *arg)
 do the ratelimit_list command
static void do_ip_ratelimit_list (RES *ssl, struct worker *worker, char *arg)
 do the ip_ratelimit_list command
static void do_rpz_enable_disable (RES *ssl, struct worker *worker, char *arg, int enable)
 do the rpz_enable/disable command
static void do_rpz_enable (RES *ssl, struct worker *worker, char *arg)
 do the rpz_enable command
static void do_rpz_disable (RES *ssl, struct worker *worker, char *arg)
 do the rpz_disable command
static void distribute_cmd (struct daemon_remote *rc, RES *ssl, char *cmd)
 tell other processes to execute the command
static int cmdcmp (char *p, const char *cmd, size_t len)
 check for name with end-of-string, space or tab after it
static void execute_cmd (struct daemon_remote *rc, RES *ssl, char *cmd, struct worker *worker)
 execute a remote control command
void daemon_remote_exec (struct worker *worker)
 Handle nonthreaded remote cmd execution. More...
static void handle_req (struct daemon_remote *rc, struct rc_state *s, RES *res)
 handle remote control request
static int remote_handshake_later (struct daemon_remote *rc, struct rc_state *s, struct comm_point *c, int r, int r2)
 handle SSL_do_handshake changes to the file descriptor to wait for later
int remote_control_callback (struct comm_point *c, void *arg, int err, struct comm_reply *ATTR_UNUSED(rep))

Detailed Description

This file contains the remote control functionality for the daemon. The remote control can be performed using either the commandline unbound-control tool, or a TLS capable web browser. The channel is secured using TLSv1, and certificates. Both the server and the client(control tool) have their own keys.

Function Documentation

◆ daemon_remote_create()

struct daemon_remote* daemon_remote_create ( struct config_file cfg)

Create new remote control state for the daemon.

cfgconfig file with key file settings.
new state, or NULL on failure.

References config_file::control_use_cert, log_err(), daemon_remote::max_active, options_remote_is_address(), and config_file::remote_control_enable.

◆ daemon_remote_clear()

void daemon_remote_clear ( struct daemon_remote rc)

remote control state to clear up.

Busy and accept points are closed. Does not delete the rc itself, or the ssl context (with its keys).

rcstate to clear.

References daemon_remote::accept_list, daemon_remote::active, daemon_remote::busy_list, rc_state::c, comm_point_delete(), listen_list_delete(), rc_state::next, rc_state::rc, and daemon_remote::worker.

Referenced by daemon_cleanup(), and daemon_remote_delete().

◆ daemon_remote_delete()

void daemon_remote_delete ( struct daemon_remote rc)

remote control state to delete.

rcstate to delete.

Referenced by daemon_delete().

◆ add_open()

static int add_open ( const char *  ip,
int  nr,
struct listen_port **  list,
int  noproto_is_err,
struct config_file cfg 

Add and open a new control port.

ipip str
nrport nr
listlist head
noproto_is_errif lack of protocol support is an error.
cfgconfig with username for chown of unix-sockets.
false on failure.

References cfg_gid, cfg_uid, create_local_accept_sock(), create_tcp_accept_sock(), listen_port::fd, config_file::ip_dscp, config_file::ip_freebind, config_file::ip_transparent, log_assert, log_err(), listen_port::next, sock_close(), config_file::use_systemd, config_file::username, VERB_QUERY, and verbose().

Referenced by daemon_remote_open_ports().

◆ daemon_remote_open_ports()

struct listen_port* daemon_remote_open_ports ( struct config_file cfg)

Open and create listening ports for remote control.

cfgconfig options.
list of ports or NULL on failure. can be freed with listening_ports_free().

References add_open(), config_del_strarray(), config_file::control_ifs, config_file::control_port, config_file::do_ip4, config_file::do_ip6, config_strlist_head::first, listening_ports_free(), log_assert, config_file::remote_control_enable, and resolve_interface_names().

◆ daemon_remote_open_accept()

int daemon_remote_open_accept ( struct daemon_remote rc,
struct listen_port ports,
struct worker worker 

Setup comm points for accepting remote control connections.

portsalready opened ports.
workerworker with communication base. and links to command channels.
false on error.

References accept_open(), listen_port::fd, log_err(), listen_port::next, and daemon_remote::worker.

◆ daemon_remote_stop_accept()

void daemon_remote_stop_accept ( struct daemon_remote rc)

Stop accept handlers for TCP (until enabled again)


References daemon_remote::accept_list, and listen_list::next.

Referenced by worker_stop_accept().

◆ daemon_remote_start_accept()

void daemon_remote_start_accept ( struct daemon_remote rc)

Stop accept handlers for TCP (until enabled again)


References daemon_remote::accept_list, and listen_list::next.

Referenced by worker_start_accept().

◆ daemon_remote_exec()

void daemon_remote_exec ( struct worker worker)

Handle nonthreaded remote cmd execution.

workerthis worker (the remote worker).

References worker::cmd, execute_cmd(), log_err(), tube_read_msg(), VERB_ALGO, and verbose().