2 * Amanda, The Advanced Maryland Automatic Network Disk Archiver
3 * Copyright (c) 1991-2000 University of Maryland at College Park
6 * Permission to use, copy, modify, distribute, and sell this software and its
7 * documentation for any purpose is hereby granted without fee, provided that
8 * the above copyright notice appear in all copies and that both that
9 * copyright notice and this permission notice appear in supporting
10 * documentation, and that the name of U.M. not be used in advertising or
11 * publicity pertaining to distribution of the software without specific,
12 * written prior permission. U.M. makes no representations about the
13 * suitability of this software for any purpose. It is provided "as is"
14 * without express or implied warranty.
16 * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
18 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
20 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
21 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 * Author: James da Silva, Systems Design and Analysis Group
24 * Computer Science Department
25 * University of Maryland at College Park
28 * $Id: conffile.h,v 1.72 2006/07/26 15:17:37 martinea Exp $
30 * interface for config file reading code
39 #define CONFFILE_NAME "amanda.conf"
88 CNF_AMRECOVER_CHECK_LABEL,
89 CNF_AMRECOVER_CHANGER,
100 CNF_DEBUG_AMIDXTAPED,
114 CNF_DEBUG_SENDBACKUP,
115 CNF_RESERVED_UDP_PORT,
116 CNF_RESERVED_TCP_PORT,
117 CNF_UNRESERVED_TCP_PORT,
122 CONF_UNKNOWN, CONF_ANY, CONF_COMMA,
123 CONF_LBRACE, CONF_RBRACE, CONF_NL,
124 CONF_END, CONF_IDENT, CONF_INT,
125 CONF_LONG, CONF_AM64, CONF_BOOL,
126 CONF_REAL, CONF_STRING, CONF_TIME,
129 /* config parameters */
130 CONF_INCLUDEFILE, CONF_ORG, CONF_MAILTO,
131 CONF_DUMPUSER, CONF_TAPECYCLE, CONF_TAPEDEV,
132 CONF_CHNGRDEV, CONF_CHNGRFILE, CONF_LABELSTR,
133 CONF_BUMPPERCENT, CONF_BUMPSIZE, CONF_BUMPDAYS,
134 CONF_BUMPMULT, CONF_ETIMEOUT, CONF_DTIMEOUT,
135 CONF_CTIMEOUT, CONF_TAPEBUFS, CONF_TAPELIST,
136 CONF_DISKFILE, CONF_INFOFILE, CONF_LOGDIR,
137 CONF_LOGFILE, CONF_DISKDIR, CONF_DISKSIZE,
138 CONF_INDEXDIR, CONF_NETUSAGE, CONF_INPARALLEL,
139 CONF_DUMPORDER, CONF_TIMEOUT, CONF_TPCHANGER,
140 CONF_RUNTAPES, CONF_DEFINE, CONF_DUMPTYPE,
141 CONF_TAPETYPE, CONF_INTERFACE, CONF_PRINTER,
142 CONF_AUTOFLUSH, CONF_RESERVE, CONF_MAXDUMPSIZE,
143 CONF_COLUMNSPEC, CONF_AMRECOVER_DO_FSF, CONF_AMRECOVER_CHECK_LABEL,
144 CONF_AMRECOVER_CHANGER, CONF_LABEL_NEW_TAPES, CONF_USETIMESTAMPS,
146 CONF_TAPERALGO, CONF_FIRST, CONF_FIRSTFIT,
147 CONF_LARGEST, CONF_LARGESTFIT, CONF_SMALLEST,
148 CONF_LAST, CONF_DISPLAYUNIT, CONF_RESERVED_UDP_PORT,
149 CONF_RESERVED_TCP_PORT, CONF_UNRESERVED_TCP_PORT,
152 CONF_KRB5KEYTAB, CONF_KRB5PRINCIPAL,
155 CONF_COMMENT, CONF_DIRECTORY, CONF_USE,
159 /*COMMENT,*/ CONF_PROGRAM, CONF_DUMPCYCLE,
160 CONF_RUNSPERCYCLE, CONF_MAXCYCLE, CONF_MAXDUMPS,
161 CONF_OPTIONS, CONF_PRIORITY, CONF_FREQUENCY,
162 CONF_INDEX, CONF_MAXPROMOTEDAY, CONF_STARTTIME,
163 CONF_COMPRESS, CONF_ENCRYPT, CONF_AUTH,
164 CONF_STRATEGY, CONF_ESTIMATE, CONF_SKIP_INCR,
165 CONF_SKIP_FULL, CONF_RECORD, CONF_HOLDING,
166 CONF_EXCLUDE, CONF_INCLUDE, CONF_KENCRYPT,
167 CONF_IGNORE, CONF_COMPRATE, CONF_TAPE_SPLITSIZE,
168 CONF_SPLIT_DISKBUFFER, CONF_FALLBACK_SPLITSIZE,CONF_SRVCOMPPROG,
169 CONF_CLNTCOMPPROG, CONF_SRV_ENCRYPT, CONF_CLNT_ENCRYPT,
170 CONF_SRV_DECRYPT_OPT, CONF_CLNT_DECRYPT_OPT, CONF_AMANDAD_PATH,
171 CONF_CLIENT_USERNAME,
174 /*COMMENT,*/ CONF_BLOCKSIZE, CONF_FILE_PAD,
175 CONF_LBL_TEMPL, CONF_FILEMARK, CONF_LENGTH,
176 CONF_SPEED, CONF_READBLOCKSIZE,
179 CONF_CONF, CONF_INDEX_SERVER, CONF_TAPE_SERVER,
180 CONF_SSH_KEYS, CONF_GNUTAR_LIST_DIR, CONF_AMANDATES,
182 /* protocol config */
183 CONF_REP_TRIES, CONF_CONNECT_TRIES, CONF_REQ_TRIES,
186 CONF_DEBUG_AMANDAD, CONF_DEBUG_AMIDXTAPED, CONF_DEBUG_AMINDEXD,
187 CONF_DEBUG_AMRECOVER, CONF_DEBUG_AUTH, CONF_DEBUG_EVENT,
188 CONF_DEBUG_HOLDING, CONF_DEBUG_PROTOCOL, CONF_DEBUG_PLANNER,
189 CONF_DEBUG_DRIVER, CONF_DEBUG_DUMPER, CONF_DEBUG_CHUNKER,
190 CONF_DEBUG_TAPER, CONF_DEBUG_SELFCHECK, CONF_DEBUG_SENDSIZE,
191 CONF_DEBUG_SENDBACKUP,
193 /* network interface */
194 /* COMMENT, */ /* USE, */
196 /* dump options (obsolete) */
197 CONF_EXCLUDE_FILE, CONF_EXCLUDE_LIST,
199 /* compress, estimate, encryption */
200 CONF_NONE, CONF_FAST, CONF_BEST,
201 CONF_SERVER, CONF_CLIENT, CONF_CALCSIZE,
205 CONF_NEVER, CONF_AUTO, CONF_REQUIRED,
208 CONF_LOW, CONF_MEDIUM, CONF_HIGH,
211 CONF_SKIP, CONF_STANDARD, CONF_NOFULL,
212 CONF_NOINC, CONF_HANOI, CONF_INCRONLY,
215 CONF_LIST, CONF_EFILE, CONF_APPEND,
219 CONF_AMINFINITY, CONF_MULT1, CONF_MULT7,
220 CONF_MULT1K, CONF_MULT1M, CONF_MULT1G,
223 CONF_ATRUE, CONF_AFALSE,
228 /* internal types and variables */
238 CONFTYPE_TIME, /* hhmm */
254 /* Compression types */
256 COMP_NONE, /* No compression */
257 COMP_FAST, /* Fast compression on client */
258 COMP_BEST, /* Best compression on client */
259 COMP_CUST, /* Custom compression on client */
260 COMP_SERVER_FAST, /* Fast compression on server */
261 COMP_SERVER_BEST, /* Best compression on server */
262 COMP_SERVER_CUST /* Custom compression on server */
265 /* Encryption types */
267 ENCRYPT_NONE, /* No encryption */
268 ENCRYPT_CUST, /* Custom encryption on client */
269 ENCRYPT_SERV_CUST /* Custom encryption on server */
272 /* holdingdisk types */
274 HOLD_NEVER, /* Always direct to tape */
275 HOLD_AUTO, /* If possible */
276 HOLD_REQUIRED /* Always to holding disk */
277 } dump_holdingdisk_t;
279 typedef struct { /* token table entry */
290 typedef struct exinclude_s {
296 typedef struct val_s {
307 exinclude_t exinclude;
314 typedef struct s_conf_var {
317 void (*read_function) (struct s_conf_var *, val_t*);
319 void (*validate) (struct s_conf_var *, val_t *);
322 typedef enum tapetype_e {
326 TAPETYPE_READBLOCKSIZE,
334 typedef struct tapetype_s {
335 struct tapetype_s *next;
339 val_t value[TAPETYPE_TAPETYPE];
342 #define tapetype_get(tapetype, field) (tapetype->field)
343 #define tapetype_get_name(tapetype) tapetype->name
344 #define tapetype_get_seen(tapetype) tapetype->seen
345 #define tapetype_get_comment(tapetype) get_conftype_string(&tapetype->value[TAPETYPE_COMMENT])
346 #define tapetype_get_lbl_templ(tapetype) get_conftype_string(&tapetype->value[TAPETYPE_LBL_TEMPL])
347 #define tapetype_get_blocksize(tapetype) get_conftype_size (&tapetype->value[TAPETYPE_BLOCKSIZE])
348 #define tapetype_get_readblocksize(tapetype) get_conftype_size (&tapetype->value[TAPETYPE_READBLOCKSIZE])
349 #define tapetype_get_length(tapetype) get_conftype_am64 (&tapetype->value[TAPETYPE_LENGTH])
350 #define tapetype_get_filemark(tapetype) get_conftype_am64 (&tapetype->value[TAPETYPE_FILEMARK])
351 #define tapetype_get_speed(tapetype) get_conftype_int (&tapetype->value[TAPETYPE_SPEED])
352 #define tapetype_get_file_pad(tapetype) get_conftype_bool (&tapetype->value[TAPETYPE_FILE_PAD])
354 /* Dump strategies */
355 #define DS_SKIP 0 /* Don't do any dumps at all */
356 #define DS_STANDARD 1 /* Standard (0 1 1 1 1 2 2 2 ...) */
357 #define DS_NOFULL 2 /* No full's (1 1 1 ...) */
358 #define DS_NOINC 3 /* No inc's (0 0 0 ...) */
359 #define DS_4 4 /* ? (0 1 2 3 4 5 6 7 8 9 10 11 ...) */
360 #define DS_5 5 /* ? (0 1 1 1 1 1 1 1 1 1 1 1 ...) */
361 #define DS_HANOI 6 /* Tower of Hanoi (? ? ? ? ? ...) */
362 #define DS_INCRONLY 7 /* Forced fulls (0 1 1 2 2 FORCE0 1 1 ...) */
364 /* Estimate strategies */
365 #define ES_CLIENT 0 /* client estimate */
366 #define ES_SERVER 1 /* server estimate */
367 #define ES_CALCSIZE 2 /* calcsize estimate */
370 #define ALGO_FIRSTFIT 1
371 #define ALGO_LARGEST 2
372 #define ALGO_LARGESTFIT 3
373 #define ALGO_SMALLEST 4
376 typedef enum dumptype_e {
379 DUMPTYPE_SRVCOMPPROG,
380 DUMPTYPE_CLNTCOMPPROG,
381 DUMPTYPE_SRV_ENCRYPT,
382 DUMPTYPE_CLNT_ENCRYPT,
383 DUMPTYPE_AMANDAD_PATH,
384 DUMPTYPE_CLIENT_USERNAME,
386 DUMPTYPE_SECURITY_DRIVER,
392 DUMPTYPE_MAXPROMOTEDAY,
393 DUMPTYPE_BUMPPERCENT,
402 DUMPTYPE_SRV_DECRYPT_OPT,
403 DUMPTYPE_CLNT_DECRYPT_OPT,
405 DUMPTYPE_TAPE_SPLITSIZE,
406 DUMPTYPE_FALLBACK_SPLITSIZE,
407 DUMPTYPE_SPLIT_DISKBUFFER,
411 DUMPTYPE_HOLDINGDISK,
418 typedef struct dumptype_s {
419 struct dumptype_s *next;
423 val_t value[DUMPTYPE_DUMPTYPE];
426 #define dumptype_get_name(dumptype) dumptype->name
427 #define dumptype_get_seen(dumptype) dumptype->seen
428 #define dumptype_get_comment(dumptype) get_conftype_string (&dumptype->value[DUMPTYPE_COMMENT])
429 #define dumptype_get_program(dumptype) get_conftype_string (&dumptype->value[DUMPTYPE_PROGRAM])
430 #define dumptype_get_srvcompprog(dumptype) get_conftype_string (&dumptype->value[DUMPTYPE_SRVCOMPPROG])
431 #define dumptype_get_clntcompprog(dumptype) get_conftype_string (&dumptype->value[DUMPTYPE_CLNTCOMPPROG])
432 #define dumptype_get_srv_encrypt(dumptype) get_conftype_string (&dumptype->value[DUMPTYPE_SRV_ENCRYPT])
433 #define dumptype_get_clnt_encrypt(dumptype) get_conftype_string (&dumptype->value[DUMPTYPE_CLNT_ENCRYPT])
434 #define dumptype_get_amandad_path(dumptype) get_conftype_string (&dumptype->value[DUMPTYPE_AMANDAD_PATH])
435 #define dumptype_get_client_username(dumptype) get_conftype_string (&dumptype->value[DUMPTYPE_CLIENT_USERNAME])
436 #define dumptype_get_ssh_keys(dumptype) get_conftype_string (&dumptype->value[DUMPTYPE_SSH_KEYS])
437 #define dumptype_get_security_driver(dumptype) get_conftype_string (&dumptype->value[DUMPTYPE_SECURITY_DRIVER])
438 #define dumptype_get_exclude(dumptype) get_conftype_exinclude(&dumptype->value[DUMPTYPE_EXCLUDE])
439 #define dumptype_get_include(dumptype) get_conftype_exinclude(&dumptype->value[DUMPTYPE_INCLUDE])
440 #define dumptype_get_priority(dumptype) get_conftype_priority (&dumptype->value[DUMPTYPE_PRIORITY])
441 #define dumptype_get_dumpcycle(dumptype) get_conftype_int (&dumptype->value[DUMPTYPE_DUMPCYCLE])
442 #define dumptype_get_maxcycle(dumptype) get_conftype_int (&dumptype->value[DUMPTYPE_MAXCYCLE])
443 #define dumptype_get_frequency(dumptype) get_conftype_int (&dumptype->value[DUMPTYPE_FREQUENCY])
444 #define dumptype_get_maxdumps(dumptype) get_conftype_int (&dumptype->value[DUMPTYPE_MAXDUMPS])
445 #define dumptype_get_maxpromoteday(dumptype) get_conftype_int (&dumptype->value[DUMPTYPE_MAXPROMOTEDAY])
446 #define dumptype_get_bumppercent(dumptype) get_conftype_int (&dumptype->value[DUMPTYPE_BUMPPERCENT])
447 #define dumptype_get_bumpsize(dumptype) get_conftype_am64 (&dumptype->value[DUMPTYPE_BUMPSIZE])
448 #define dumptype_get_bumpdays(dumptype) get_conftype_int (&dumptype->value[DUMPTYPE_BUMPDAYS])
449 #define dumptype_get_bumpmult(dumptype) get_conftype_real (&dumptype->value[DUMPTYPE_BUMPMULT])
450 #define dumptype_get_starttime(dumptype) get_conftype_time (&dumptype->value[DUMPTYPE_STARTTIME])
451 #define dumptype_get_strategy(dumptype) get_conftype_strategy (&dumptype->value[DUMPTYPE_STRATEGY])
452 #define dumptype_get_estimate(dumptype) get_conftype_estimate (&dumptype->value[DUMPTYPE_ESTIMATE])
453 #define dumptype_get_compress(dumptype) get_conftype_compress (&dumptype->value[DUMPTYPE_COMPRESS])
454 #define dumptype_get_encrypt(dumptype) get_conftype_encrypt (&dumptype->value[DUMPTYPE_ENCRYPT])
455 #define dumptype_get_srv_decrypt_opt(dumptype) get_conftype_string (&dumptype->value[DUMPTYPE_SRV_DECRYPT_OPT])
456 #define dumptype_get_clnt_decrypt_opt(dumptype) get_conftype_string (&dumptype->value[DUMPTYPE_CLNT_DECRYPT_OPT])
457 #define dumptype_get_comprate(dumptype) dumptype->value[DUMPTYPE_COMPRATE].v.rate
458 #define dumptype_get_tape_splitsize(dumptype) get_conftype_am64 (&dumptype->value[DUMPTYPE_TAPE_SPLITSIZE])
459 #define dumptype_get_fallback_splitsize(dumptype) get_conftype_am64 (&dumptype->value[DUMPTYPE_FALLBACK_SPLITSIZE])
460 #define dumptype_get_split_diskbuffer(dumptype) get_conftype_string (&dumptype->value[DUMPTYPE_SPLIT_DISKBUFFER])
461 #define dumptype_get_record(dumptype) get_conftype_bool (&dumptype->value[DUMPTYPE_RECORD])
462 #define dumptype_get_skip_incr(dumptype) get_conftype_bool (&dumptype->value[DUMPTYPE_SKIP_INCR])
463 #define dumptype_get_skip_full(dumptype) get_conftype_bool (&dumptype->value[DUMPTYPE_SKIP_FULL])
464 #define dumptype_get_to_holdingdisk(dumptype) get_conftype_hold (&dumptype->value[DUMPTYPE_HOLDINGDISK])
465 #define dumptype_get_kencrypt(dumptype) get_conftype_bool (&dumptype->value[DUMPTYPE_KENCRYPT])
466 #define dumptype_get_ignore(dumptype) get_conftype_bool (&dumptype->value[DUMPTYPE_IGNORE])
467 #define dumptype_get_index(dumptype) get_conftype_bool (&dumptype->value[DUMPTYPE_INDEX])
469 /* A network interface */
470 typedef enum interface_e {
477 typedef struct interface_s {
478 struct interface_s *next;
482 val_t value[INTER_INTER];
484 unsigned long curusage; /* current usage */
487 #define interface_get_name(interface) interface->name
488 #define interface_get_seen(interface) interface->seen
489 #define interface_get_comment(interface) get_conftype_string(&interface->value[INTER_COMMENT])
490 #define interface_get_maxusage(interface) get_conftype_int (&interface->value[INTER_MAXUSAGE])
493 typedef enum holdingdisk_e {
501 typedef struct holdingdisk_s {
502 struct holdingdisk_s *next;
506 val_t value[HOLDING_HOLDING];
508 void *up; /* generic user pointer */
512 #define holdingdisk_get_name(holdingdisk) (holdingdisk)->name
513 #define holdingdisk_get_seen(holdingdisk) (holdingdisk)->seen
514 #define holdingdisk_get_comment(holdingdisk) get_conftype_string(&(holdingdisk)->value[HOLDING_COMMENT])
515 #define holdingdisk_get_diskdir(holdingdisk) get_conftype_string(&(holdingdisk)->value[HOLDING_DISKDIR])
516 #define holdingdisk_get_disksize(holdingdisk) get_conftype_am64 (&(holdingdisk)->value[HOLDING_DISKSIZE])
517 #define holdingdisk_get_chunksize(holdingdisk) get_conftype_am64 (&(holdingdisk)->value[HOLDING_CHUNKSIZE])
519 /* for each column we define some values on how to
520 * format this column element
523 char *Name; /* column name */
524 int PrefixSpace; /* the blank space to print before this
525 * column. It is used to get the space
528 int Width; /* the width of the column itself */
529 int Precision; /* the precision if its a float */
530 int MaxWidth; /* if set, Width will be recalculated
531 * to the space needed */
532 char *Format; /* the printf format string for this
535 char *Title; /* the title to use for this column */
539 /* predeclare local functions */
541 int get_conftype_int (val_t *);
542 long get_conftype_long (val_t *);
543 off_t get_conftype_am64 (val_t *);
544 double get_conftype_real (val_t *);
545 char *get_conftype_string (val_t *);
546 char *get_conftype_ident (val_t *);
547 time_t get_conftype_time (val_t *);
548 ssize_t get_conftype_size (val_t *);
549 sl_t *get_conftype_sl (val_t *);
550 int get_conftype_bool (val_t *);
551 int get_conftype_hold (val_t *);
552 int get_conftype_compress (val_t *);
553 int get_conftype_encrypt (val_t *);
554 int get_conftype_estimate (val_t *);
555 int get_conftype_strategy (val_t *);
556 int get_conftype_taperalgo(val_t *);
557 int get_conftype_priority (val_t *);
558 float *get_conftype_rate (val_t *);
559 exinclude_t get_conftype_exinclude(val_t *);
560 int *get_conftype_intrange (val_t *);
562 void command_overwrite(command_option_t *command_options, t_conf_var *overwrite_var,
563 keytab_t *keytab, val_t *valarray, char *prefix);
565 void free_new_argv(int new_argc, char **new_argv);
566 /* this corresponds to the normal output of amanda, but may
567 * be adapted to any spacing as you like.
569 extern ColumnInfo ColumnData[];
571 extern char *config_name;
572 extern char *config_dir;
574 extern int debug_amandad;
575 extern int debug_amidxtaped;
576 extern int debug_amindexd;
577 extern int debug_amrecover;
578 extern int debug_auth;
579 extern int debug_event;
580 extern int debug_holding;
581 extern int debug_protocol;
582 extern int debug_planner;
583 extern int debug_driver;
584 extern int debug_dumper;
585 extern int debug_chunker;
586 extern int debug_taper;
587 extern int debug_selfcheck;
588 extern int debug_sendsize;
589 extern int debug_sendbackup;
591 extern holdingdisk_t *holdingdisks;
592 extern int num_holdingdisks;
594 void parse_conf(int parse_argc, char **parse_argv, int *new_argc,
596 char **get_config_options(int);
597 void report_bad_conf_arg(void);
598 void free_server_config(void);
600 int read_conffile(char *filename);
602 #define CLIENTCONFFILE_NAME "client.conf"
604 int add_client_conf(confparm_t parm, char *value);
605 int read_clientconf(char *filename);
606 char *generic_client_get_security_conf(char *, void *);
608 int getconf_seen(confparm_t parameter);
609 int getconf_boolean(confparm_t parameter);
610 int getconf_int(confparm_t parameter);
611 long getconf_long(confparm_t parameter);
612 ssize_t getconf_size(confparm_t parameter);
613 time_t getconf_time(confparm_t parameter);
614 off_t getconf_am64(confparm_t parameter);
615 double getconf_real(confparm_t parameter);
616 char *getconf_str(confparm_t parameter);
617 int getconf_taperalgo(confparm_t parameter);
618 int *getconf_intrange(confparm_t parameter);
619 char *getconf_byname(char *confname);
620 char *getconf_list(char *listname);
621 dumptype_t *lookup_dumptype(char *identifier);
622 dumptype_t *read_dumptype(char *name, FILE *from, char *fname, int *linenum);
623 tapetype_t *lookup_tapetype(char *identifier);
624 holdingdisk_t *lookup_holdingdisk(char *identifier);
625 interface_t *lookup_interface(char *identifier);
626 holdingdisk_t *getconf_holdingdisks(void);
627 long int getconf_unit_divisor(void);
628 void dump_configuration(char *filename);
629 int ColumnDataCount(void);
630 int StringToColumn(char *s);
631 char LastChar(char *s);
632 int SetColumDataFromString(ColumnInfo* ci, char *s, char **errstr);
633 ssize_t getconf_readblocksize(void);
635 /* this is in securityconf.h */
636 char *generic_get_security_conf(char *, void *);
637 #endif /* ! CONFFILE_H */