conf.h 15 KB
Newer Older
1
/*  Copyright (C) 2019 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
2 3 4 5 6 7 8 9 10 11 12 13

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
14
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
15 16 17 18 19 20
*/

#pragma once

#include <sys/socket.h>

21
#include "knot/conf/base.h"
22
#include "knot/conf/schema.h"
23

24 25
#define CONF_XFERS	10

26
/*! Configuration remote getter output. */
27
typedef struct {
28
	/*! Target socket address. */
29
	struct sockaddr_storage addr;
30
	/*! Local outgoing socket address. */
31
	struct sockaddr_storage via;
32
	/*! TSIG key. */
33 34 35
	knot_tsig_key_t key;
} conf_remote_t;

36
/*! Configuration section iterator. */
37
typedef struct {
38
	/*! Item description. */
39
	const yp_item_t *item;
40
	/*! Namedb iterator. */
41
	knot_db_iter_t *iter;
42
	/*! Key0 database code. */
43 44
	uint8_t key0_code;
	// Public items.
45 46
	/*! Iterator return code. */
	int code;
47 48
} conf_iter_t;

49
/*! Configuration module getter output. */
50
typedef struct {
51
	/*! Module name. */
52
	yp_name_t *name;
53
	/*! Module id data. */
54
	uint8_t *data;
55
	/*! Module id data length. */
56 57 58
	size_t len;
} conf_mod_id_t;

59
/*!
60
 * Gets the configuration item value of the section without identifiers.
61
 *
62 63 64 65
 * \param[in] conf       Configuration.
 * \param[in] txn        Configuration DB transaction.
 * \param[in] key0_name  Section name.
 * \param[in] key1_name  Item name.
66 67 68
 *
 * \return Item value.
 */
69
conf_val_t conf_get_txn(
70
	conf_t *conf,
71
	knot_db_txn_t *txn,
72 73 74
	const yp_name_t *key0_name,
	const yp_name_t *key1_name
);
75 76 77 78 79 80 81
static inline conf_val_t conf_get(
	conf_t *conf,
	const yp_name_t *key0_name,
	const yp_name_t *key1_name)
{
	return conf_get_txn(conf, &conf->read_txn, key0_name, key1_name);
}
82

83
/*!
84
 * Gets the configuration item value of the section with identifiers (raw version).
85
 *
86 87 88 89
 * \param[in] conf        Configuration.
 * \param[in] txn         Configuration DB transaction.
 * \param[in] key0_name   Section name.
 * \param[in] key1_name   Item name.
90
 * \param[in] id          Section identifier (raw value).
91
 * \param[in] id_len      Length of the section identifier.
92 93 94
 *
 * \return Item value.
 */
95 96
conf_val_t conf_rawid_get_txn(
	conf_t *conf,
97
	knot_db_txn_t *txn,
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
	const yp_name_t *key0_name,
	const yp_name_t *key1_name,
	const uint8_t *id,
	size_t id_len
);
static inline conf_val_t conf_rawid_get(
	conf_t *conf,
	const yp_name_t *key0_name,
	const yp_name_t *key1_name,
	const uint8_t *id,
	size_t id_len)
{
	return conf_rawid_get_txn(conf, &conf->read_txn, key0_name, key1_name,
	                          id, id_len);
}

114
/*!
115
 * Gets the configuration item value of the section with identifiers.
116
 *
117 118 119 120
 * \param[in] conf        Configuration.
 * \param[in] txn         Configuration DB transaction.
 * \param[in] key0_name   Section name.
 * \param[in] key1_name   Item name.
121
 * \param[in] id          Section identifier (output of a config getter).
122 123 124
 *
 * \return Item value.
 */
125
conf_val_t conf_id_get_txn(
126
	conf_t *conf,
127
	knot_db_txn_t *txn,
128 129 130 131
	const yp_name_t *key0_name,
	const yp_name_t *key1_name,
	conf_val_t *id
);
132 133 134 135 136 137 138 139
static inline conf_val_t conf_id_get(
	conf_t *conf,
	const yp_name_t *key0_name,
	const yp_name_t *key1_name,
	conf_val_t *id)
{
	return conf_id_get_txn(conf, &conf->read_txn, key0_name, key1_name, id);
}
140

141
/*!
142
 * Gets the configuration item value of the module section.
143
 *
144 145 146 147
 * \param[in] conf       Configuration.
 * \param[in] txn        Configuration DB transaction.
 * \param[in] key1_name  Item name.
 * \param[in] mod_id     Module identifier.
148 149 150
 *
 * \return Item value.
 */
151
conf_val_t conf_mod_get_txn(
152
	conf_t *conf,
153
	knot_db_txn_t *txn,
154 155 156
	const yp_name_t *key1_name,
	const conf_mod_id_t *mod_id
);
157 158 159 160 161 162 163
static inline conf_val_t conf_mod_get(
	conf_t *conf,
	const yp_name_t *key1_name,
	const conf_mod_id_t *mod_id)
{
	return conf_mod_get_txn(conf, &conf->read_txn, key1_name, mod_id);
}
164

165
/*!
166
 * Gets the configuration item value of the zone section.
167 168 169
 *
 * \note A possibly associated template is taken into account.
 *
170 171 172 173
 * \param[in] conf        Configuration.
 * \param[in] txn         Configuration DB transaction.
 * \param[in] key1_name   Item name.
 * \param[in] dname Zone  name.
174 175 176
 *
 * \return Item value.
 */
177
conf_val_t conf_zone_get_txn(
178
	conf_t *conf,
179
	knot_db_txn_t *txn,
180 181 182
	const yp_name_t *key1_name,
	const knot_dname_t *dname
);
183 184 185 186 187 188 189
static inline conf_val_t conf_zone_get(
	conf_t *conf,
	const yp_name_t *key1_name,
	const knot_dname_t *dname)
{
	return conf_zone_get_txn(conf, &conf->read_txn, key1_name, dname);
}
190

191
/*!
192
 * Gets the configuration item value of the default template.
193
 *
194 195 196
 * \param[in] conf       Configuration.
 * \param[in] txn        Configuration DB transaction.
 * \param[in] key1_name  Item name.
197 198 199
 *
 * \return Item value.
 */
200
conf_val_t conf_default_get_txn(
201
	conf_t *conf,
202
	knot_db_txn_t *txn,
203 204
	const yp_name_t *key1_name
);
205 206 207 208 209 210
static inline conf_val_t conf_default_get(
	conf_t *conf,
	const yp_name_t *key1_name)
{
	return conf_default_get_txn(conf, &conf->read_txn, key1_name);
}
211

212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
/*!
 * Checks the configuration section for the identifier (raw version).
 *
 * \param[in] conf        Configuration.
 * \param[in] txn         Configuration DB transaction.
 * \param[in] key0_name   Section name.
 * \param[in] id          Section identifier (raw value).
 * \param[in] id_len      Length of the section identifier.
 *
 * \return True if exists.
 */
bool conf_rawid_exists_txn(
	conf_t *conf,
	knot_db_txn_t *txn,
	const yp_name_t *key0_name,
	const uint8_t *id,
	size_t id_len
);
static inline bool conf_rawid_exists(
	conf_t *conf,
	const yp_name_t *key0_name,
	const uint8_t *id,
	size_t id_len)
{
	return conf_rawid_exists_txn(conf, &conf->read_txn, key0_name, id, id_len);
}

/*!
 * Checks the configuration section for the identifier.
 *
 * \param[in] conf        Configuration.
 * \param[in] txn         Configuration DB transaction.
 * \param[in] key0_name   Section name.
 * \param[in] id          Section identifier (output of a config getter).
 *
 * \return True if exists.
 */
bool conf_id_exists_txn(
	conf_t *conf,
	knot_db_txn_t *txn,
	const yp_name_t *key0_name,
	conf_val_t *id
);
static inline bool conf_id_exists(
	conf_t *conf,
	const yp_name_t *key0_name,
	conf_val_t *id)
{
	return conf_id_exists_txn(conf, &conf->read_txn, key0_name, id);
}

263 264 265
/*!
 * Gets the number of section identifiers.
 *
266 267 268
 * \param[in] conf       Configuration.
 * \param[in] txn        Configuration DB transaction.
 * \param[in] key0_name  Section name.
269 270 271
 *
 * \return Number of identifiers.
 */
272
size_t conf_id_count_txn(
273
	conf_t *conf,
274
	knot_db_txn_t *txn,
275 276
	const yp_name_t *key0_name
);
277 278 279 280 281 282
static inline size_t conf_id_count(
	conf_t *conf,
	const yp_name_t *key0_name)
{
	return conf_id_count_txn(conf, &conf->read_txn, key0_name);
}
283

284 285 286
/*!
 * Gets a configuration section iterator.
 *
287 288 289
 * \param[in] conf       Configuration.
 * \param[in] txn        Configuration DB transaction.
 * \param[in] key0_name  Section name.
290 291 292
 *
 * \return Section iterator.
 */
293
conf_iter_t conf_iter_txn(
294
	conf_t *conf,
295
	knot_db_txn_t *txn,
296 297
	const yp_name_t *key0_name
);
298 299 300 301 302 303
static inline conf_iter_t conf_iter(
	conf_t *conf,
	const yp_name_t *key0_name)
{
	return conf_iter_txn(conf, &conf->read_txn, key0_name);
}
304

305 306 307
/*!
 * Moves the configuration section iterator to the next identifier.
 *
308 309
 * \param[in] conf  Configuration.
 * \param[in] iter  Configuration iterator.
310
 */
311 312 313 314 315
void conf_iter_next(
	conf_t *conf,
	conf_iter_t *iter
);

316 317 318
/*!
 * Gets the current iterator value (identifier).
 *
319 320
 * \param[in] conf  Configuration.
 * \param[in] iter  Configuration iterator.
321 322 323
 *
 * \return Section identifier.
 */
324 325 326 327 328
conf_val_t conf_iter_id(
	conf_t *conf,
	conf_iter_t *iter
);

329
/*!
330
 * Deletes the section iterator.
331
 *
332 333 334
 * This function should be called when the iterating is early interrupted,
 * otherwise this is done automaticaly at KNOT_EOF.
 *
335 336
 * \param[in] conf  Configuration.
 * \param[in] iter  Configuration iterator.
337
 */
338 339 340 341 342
void conf_iter_finish(
	conf_t *conf,
	conf_iter_t *iter
);

343
/*!
344
 * Prepares the value for the direct access.
345
 *
346
 * The following access is through val->len and val->data.
347
 *
348
 * \param[in] val  Item value.
349
 */
350
void conf_val(
351 352 353
	conf_val_t *val
);

354
/*!
355
 * Moves to the next value of a multi-valued item.
356
 *
357
 * \param[in] val  Item value.
358
 */
359 360 361 362
void conf_val_next(
	conf_val_t *val
);

363 364 365 366 367 368 369 370 371
/*!
 * Resets to the first value of a multi-valued item.
 *
 * \param[in] val Item value.
 */
void conf_val_reset(
	conf_val_t *val
);

372 373 374
/*!
 * Gets the number of values if multivalued item.
 *
375
 * \param[in] val  Item value.
376 377 378 379 380 381 382 383 384 385
 *
 * \return Number of values.
 */
size_t conf_val_count(
	conf_val_t *val
);

/*!
 * Checks if two item values are equal.
 *
386 387
 * \param[in] val1  First item value.
 * \param[in] val2  Second item value.
388 389 390 391 392 393 394 395
 *
 * \return true if equal, false if not.
 */
bool conf_val_equal(
	conf_val_t *val1,
	conf_val_t *val2
);

396 397 398
/*!
 * Gets the numeric value of the item.
 *
399
 * \param[in] val  Item value.
400 401 402
 *
 * \return Integer.
 */
403 404 405 406
int64_t conf_int(
	conf_val_t *val
);

407 408 409
/*!
 * Gets the boolean value of the item.
 *
410
 * \param[in] val  Item value.
411 412 413
 *
 * \return Boolean.
 */
414 415 416 417
bool conf_bool(
	conf_val_t *val
);

418 419 420
/*!
 * Gets the option value of the item.
 *
421
 * \param[in] val  Item value.
422 423 424
 *
 * \return Option id.
 */
425 426 427 428
unsigned conf_opt(
	conf_val_t *val
);

429 430 431
/*!
 * Gets the string value of the item.
 *
432
 * \param[in] val  Item value.
433 434 435
 *
 * \return String pointer.
 */
436 437 438 439
const char* conf_str(
	conf_val_t *val
);

440 441 442
/*!
 * Gets the dname value of the item.
 *
443
 * \param[in] val  Item value.
444 445 446
 *
 * \return Dname pointer.
 */
447 448 449 450
const knot_dname_t* conf_dname(
	conf_val_t *val
);

451 452 453
/*!
 * Gets the length-prefixed data value of the item.
 *
454 455
 * \param[in] val   Item value.
 * \param[out] len  Output length.
456 457 458 459 460 461
 *
 * \return Data pointer.
 */
const uint8_t* conf_bin(
	conf_val_t *val,
	size_t *len
462 463
);

464 465 466
/*!
 * Gets the generic data value of the item.
 *
467 468
 * \param[in] val   Item value.
 * \param[out] len  Output length.
469 470 471 472 473 474 475 476 477 478 479
 *
 * \return Data pointer.
 */
const uint8_t* conf_data(
	conf_val_t *val,
	size_t *len
);

/*!
 * Gets the socket address value of the item.
 *
480 481
 * \param[in] val            Item value.
 * \param[in] sock_base_dir  Path prefix for a relative UNIX socket location.
482 483 484
 *
 * \return Socket address.
 */
485 486 487 488 489
struct sockaddr_storage conf_addr(
	conf_val_t *val,
	const char *sock_base_dir
);

490 491 492
/*!
 * Gets the socket address range value of the item.
 *
493 494 495
 * \param[in] val            Item value.
 * \param[out] max_ss Upper  address bound or AF_UNSPEC family if not specified.
 * \param[out] prefix_len    Network subnet prefix length or -1 if not specified.
496 497 498 499
 *
 * \return Socket address.
 */
struct sockaddr_storage conf_addr_range(
500
	conf_val_t *val,
501 502
	struct sockaddr_storage *max_ss,
	int *prefix_len
503 504
);

505 506 507 508 509 510 511 512 513 514 515 516 517
/*!
 * Checks the address if matches given address range/network block.
 *
 * \param[in] range  Address range/network block.
 * \param[in] addr   Address to check.
 *
 * \return True if matches.
 */
bool conf_addr_range_match(
	conf_val_t *range,
	const struct sockaddr_storage *addr
);

518 519 520 521 522
/*!
 * Gets the absolute string value of the item.
 *
 * \note The result must be explicitly deallocated.
 *
523 524
 * \param[in] val       Item value.
 * \param[in] base_dir  Path prefix for a relative string.
525 526 527
 *
 * \return Absolute path string pointer.
 */
Daniel Salzman's avatar
Daniel Salzman committed
528 529 530 531 532
char* conf_abs_path(
	conf_val_t *val,
	const char *base_dir
);

533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551
/*!
 * Ensures empty 'default' identifier value.
 *
 * \param[in] val  Item value.
 *
 * \return Empty item value.
 */
static inline void conf_id_fix_default(conf_val_t *val)
{
	if (val->code != KNOT_EOK) {
		conf_val_t empty = {
			.item = val->item,
			.code = KNOT_EOK
		};

		*val = empty;
	}
}

552 553 554
/*!
 * Gets the module identifier value of the item.
 *
555
 * \param[in] val  Item value.
556 557 558
 *
 * \return Module identifier.
 */
Daniel Salzman's avatar
Daniel Salzman committed
559
conf_mod_id_t* conf_mod_id(
560 561 562
	conf_val_t *val
);

563
/*!
564
 * Destroys the module identifier.
565
 *
566
 * \param[in] mod_id  Module identifier.
567
 */
Daniel Salzman's avatar
Daniel Salzman committed
568 569 570 571
void conf_free_mod_id(
	conf_mod_id_t *mod_id
);

572 573 574 575 576
/*!
 * Gets the absolute zone file path.
 *
 * \note The result must be explicitly deallocated.
 *
577 578 579
 * \param[in] conf  Configuration.
 * \param[in] txn   Configuration DB transaction.
 * \param[in] zone  Zone name.
580 581 582
 *
 * \return Absolute zonef ile path string pointer.
 */
583
char* conf_zonefile_txn(
584
	conf_t *conf,
585
	knot_db_txn_t *txn,
586 587
	const knot_dname_t *zone
);
588 589 590 591 592 593
static inline char* conf_zonefile(
	conf_t *conf,
	const knot_dname_t *zone)
{
	return conf_zonefile_txn(conf, &conf->read_txn, zone);
}
594

595
/*!
596 597 598
 * Gets the absolute directory path for a database.
 *
 * e.g. Journal, KASP db, Timers
599 600 601
 *
 * \note The result must be explicitly deallocated.
 *
602 603
 * \param[in] conf  Configuration.
 * \param[in] txn   Configuration DB transaction.
604
 *
605
 * \return Absolute database path string pointer.
606
 */
607 608 609 610
char* conf_db_txn(conf_t *conf,
	knot_db_txn_t *txn,
	const yp_name_t *db_type);
static inline char* conf_db(
611
	conf_t *conf,
612
	const yp_name_t *db_type)
613
{
614
	return conf_db_txn(conf, &conf->read_txn, db_type);
615 616
}

617 618 619
/*!
 * Gets the configured number of UDP threads.
 *
620 621
 * \param[in] conf  Configuration.
 * \param[in] txn   Configuration DB transaction.
622 623 624
 *
 * \return Number of threads.
 */
625 626
size_t conf_udp_threads_txn(
	conf_t *conf,
627
	knot_db_txn_t *txn
628
);
629 630 631 632 633
static inline size_t conf_udp_threads(
	conf_t *conf)
{
	return conf_udp_threads_txn(conf, &conf->read_txn);
}
634

635 636 637
/*!
 * Gets the configured number of TCP threads.
 *
638 639
 * \param[in] conf  Configuration.
 * \param[in] txn   Configuration DB transaction.
640 641 642
 *
 * \return Number of threads.
 */
643 644
size_t conf_tcp_threads_txn(
	conf_t *conf,
645
	knot_db_txn_t *txn
646
);
647 648 649 650 651
static inline size_t conf_tcp_threads(
	conf_t *conf)
{
	return conf_tcp_threads_txn(conf, &conf->read_txn);
}
652

653 654 655
/*!
 * Gets the configured number of worker threads.
 *
656 657
 * \param[in] conf  Configuration.
 * \param[in] txn   Configuration DB transaction.
658 659 660
 *
 * \return Number of threads.
 */
661 662
size_t conf_bg_threads_txn(
	conf_t *conf,
663
	knot_db_txn_t *txn
664
);
665 666 667 668 669
static inline size_t conf_bg_threads(
	conf_t *conf)
{
	return conf_bg_threads_txn(conf, &conf->read_txn);
}
670

671 672 673
/*!
 * Gets the configured user and group identifiers.
 *
674 675 676 677
 * \param[in] conf  Configuration.
 * \param[in] txn   Configuration DB transaction.
 * \param[out] uid  User identifier.
 * \param[out] gid  Group identifier.
678 679 680
 *
 * \return Knot error code.
 */
681
int conf_user_txn(
682
	conf_t *conf,
683
	knot_db_txn_t *txn,
684 685 686
	int *uid,
	int *gid
);
687 688 689 690 691 692 693
static inline int conf_user(
	conf_t *conf,
	int *uid,
	int *gid)
{
	return conf_user_txn(conf, &conf->read_txn, uid, gid);
}
694

695 696 697
/*!
 * Gets the remote parameters for the given identifier.
 *
698 699 700
 * \param[in] conf   Configuration.
 * \param[in] txn    Configuration DB transaction.
 * \param[in] id     Remote identifier.
Daniel Salzman's avatar
Daniel Salzman committed
701
 * \param[in] index  Remote index (counted from 0).
702 703 704
 *
 * \return Remote parameters.
 */
705
conf_remote_t conf_remote_txn(
706
	conf_t *conf,
707
	knot_db_txn_t *txn,
708 709
	conf_val_t *id,
	size_t index
710
);
711 712
static inline conf_remote_t conf_remote(
	conf_t *conf,
713 714
	conf_val_t *id,
	size_t index)
715
{
716
	return conf_remote_txn(conf, &conf->read_txn, id, index);
717 718

}