X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=common-src%2Fconffile.h;h=a9a65046cae7aa988d3b6efc2f2dabe049b786ef;hb=109540caa4e37a3663b3dcfb9a205b9609e3f561;hp=a61edd9d2f3c7c9ae5b53761bbc36a7146047bde;hpb=afaa71b3866b46b082b6c895772e15b36d8865fe;p=debian%2Famanda diff --git a/common-src/conffile.h b/common-src/conffile.h index a61edd9..a9a6504 100644 --- a/common-src/conffile.h +++ b/common-src/conffile.h @@ -81,6 +81,15 @@ * this works and it's here. */ +/* A "seen" struct. Rather than allocate strings all over the place, this + * string is in the "parsed_filenames" GSList and will be freed when that + * GSList is freed. This struct should be opaque to other modules. */ +typedef struct seen_s { + char *block; + char *filename; + int linenum; +} seen_t; + /* holdingdisk types */ typedef enum { HOLD_NEVER, /* Always direct to tape */ @@ -111,8 +120,23 @@ typedef enum { ES_CLIENT, /* client estimate */ ES_SERVER, /* server estimate */ ES_CALCSIZE, /* calcsize estimate */ - ES_ES /* sentinel */ + ES_ES /* sentinel */ } estimate_t; +/* A GSlist where each element is a element_t */ +typedef GSList *estimatelist_t; + +typedef enum { + AL_OTHER_CONFIG = 1<<0, + AL_NON_AMANDA = 1<<1, + AL_VOLUME_ERROR = 1<<2, + AL_EMPTY = 1<<3, +} autolabel_enum_t; +typedef int autolabel_set_t; + +typedef struct autolabel_s { + char *template; + autolabel_set_t autolabel; +} autolabel_t; /* Dump strategies */ typedef enum { @@ -133,28 +157,36 @@ typedef enum { ALGO_LARGEST, ALGO_LARGESTFIT, ALGO_SMALLEST, + ALGO_SMALLESTFIT, /* for internal use */ ALGO_LAST, + ALGO_LASTFIT, /* for internal use */ ALGO_ALGO /* sentinel */ } taperalgo_t; /* execute_on types */ -#define EXECUTE_ON_PRE_DLE_AMCHECK 1<<0 -#define EXECUTE_ON_PRE_HOST_AMCHECK 1<<1 -#define EXECUTE_ON_POST_DLE_AMCHECK 1<<2 -#define EXECUTE_ON_POST_HOST_AMCHECK 1<<3 -#define EXECUTE_ON_PRE_DLE_ESTIMATE 1<<4 -#define EXECUTE_ON_PRE_HOST_ESTIMATE 1<<5 -#define EXECUTE_ON_POST_DLE_ESTIMATE 1<<6 -#define EXECUTE_ON_POST_HOST_ESTIMATE 1<<7 -#define EXECUTE_ON_PRE_DLE_BACKUP 1<<8 -#define EXECUTE_ON_PRE_HOST_BACKUP 1<<9 -#define EXECUTE_ON_POST_DLE_BACKUP 1<<10 -#define EXECUTE_ON_POST_HOST_BACKUP 1<<11 -#define EXECUTE_ON_PRE_RECOVER 1<<12 -#define EXECUTE_ON_POST_RECOVER 1<<13 -#define EXECUTE_ON_PRE_LEVEL_RECOVER 1<<14 -#define EXECUTE_ON_POST_LEVEL_RECOVER 1<<15 -#define EXECUTE_ON_INTER_LEVEL_RECOVER 1<<16 +#define EXECUTE_ON_PRE_AMCHECK 1<<0 +#define EXECUTE_ON_PRE_DLE_AMCHECK 1<<1 +#define EXECUTE_ON_PRE_HOST_AMCHECK 1<<2 +#define EXECUTE_ON_POST_AMCHECK 1<<3 +#define EXECUTE_ON_POST_DLE_AMCHECK 1<<4 +#define EXECUTE_ON_POST_HOST_AMCHECK 1<<5 +#define EXECUTE_ON_PRE_ESTIMATE 1<<6 +#define EXECUTE_ON_PRE_DLE_ESTIMATE 1<<7 +#define EXECUTE_ON_PRE_HOST_ESTIMATE 1<<8 +#define EXECUTE_ON_POST_ESTIMATE 1<<9 +#define EXECUTE_ON_POST_DLE_ESTIMATE 1<<10 +#define EXECUTE_ON_POST_HOST_ESTIMATE 1<<11 +#define EXECUTE_ON_PRE_BACKUP 1<<12 +#define EXECUTE_ON_PRE_DLE_BACKUP 1<<13 +#define EXECUTE_ON_PRE_HOST_BACKUP 1<<14 +#define EXECUTE_ON_POST_BACKUP 1<<15 +#define EXECUTE_ON_POST_DLE_BACKUP 1<<16 +#define EXECUTE_ON_POST_HOST_BACKUP 1<<17 +#define EXECUTE_ON_PRE_RECOVER 1<<18 +#define EXECUTE_ON_POST_RECOVER 1<<19 +#define EXECUTE_ON_PRE_LEVEL_RECOVER 1<<20 +#define EXECUTE_ON_POST_LEVEL_RECOVER 1<<21 +#define EXECUTE_ON_INTER_LEVEL_RECOVER 1<<22 typedef int execute_on_t; typedef int execute_where_t; @@ -166,9 +198,14 @@ typedef enum { SEND_AMREPORT_NEVER } send_amreport_t; +typedef enum { + DATA_PATH_AMANDA = 1<<0, + DATA_PATH_DIRECTTCP = 1<<1, +} data_path_t; + typedef struct exinclude_s { - sl_t *sl_list; - sl_t *sl_file; + am_sl_t *sl_list; + am_sl_t *sl_file; int optional; } exinclude_t; @@ -176,10 +213,26 @@ typedef struct { int append; int priority; GSList* values; + seen_t seen; } property_t; typedef GHashTable* proplist_t; -typedef GSList* pp_scriptlist_t; +/* A GSlist where each element is a 'char*' */ +typedef GSList* identlist_t; + +/* part_cache_types */ +typedef enum { + PART_CACHE_TYPE_NONE, + PART_CACHE_TYPE_MEMORY, + PART_CACHE_TYPE_DISK, +} part_cache_type_t; + +/* host_limit */ +typedef struct { + gboolean server; + gboolean same_host; + GSList *match_pats; +} host_limit_t; /* Names for the type of value in a val_t. Mostly for internal use, but useful * for wrapping val_t's, too. */ @@ -195,7 +248,7 @@ typedef enum { CONFTYPE_COMPRESS, CONFTYPE_ENCRYPT, CONFTYPE_HOLDING, - CONFTYPE_ESTIMATE, + CONFTYPE_ESTIMATELIST, CONFTYPE_STRATEGY, CONFTYPE_TAPERALGO, CONFTYPE_PRIORITY, @@ -207,16 +260,18 @@ typedef enum { CONFTYPE_EXECUTE_ON, CONFTYPE_EXECUTE_WHERE, CONFTYPE_SEND_AMREPORT_ON, - CONFTYPE_PP_SCRIPTLIST + CONFTYPE_IDENTLIST, + CONFTYPE_DATA_PATH, + CONFTYPE_AUTOLABEL, + CONFTYPE_PART_CACHE_TYPE, + CONFTYPE_HOST_LIMIT, + CONFTYPE_NO_YES_ALL, } conftype_t; -/* A "seen" struct. Rather than allocate strings all over the place, this - * string is in the "parsed_filenames" GSList and will be freed when that - * GSList is freed. This struct should be opaque to other modules. */ -typedef struct seen_s { - char *filename; - int linenum; -} seen_t; +typedef enum { + CONF_UNIT_NONE, + CONF_UNIT_K, +} confunit_t; /* This should be considered an opaque type for any other modules. The complete * struct is included here to allow quick access via macros. Access it *only* through @@ -233,11 +288,14 @@ typedef struct val_s { exinclude_t exinclude; int intrange[2]; proplist_t proplist; - struct application_s *application; - pp_scriptlist_t pp_scriptlist; + estimatelist_t estimatelist; + identlist_t identlist; + autolabel_t autolabel; + host_limit_t host_limit; } v; seen_t seen; conftype_t type; + confunit_t unit; } val_t; /* Functions to typecheck and extract a particular type of @@ -248,13 +306,15 @@ gint64 val_t_to_int64 (val_t *); float val_t_to_real (val_t *); char *val_t_to_str (val_t *); /* (also converts CONFTYPE_IDENT) */ char *val_t_to_ident (val_t *); /* (also converts CONFTYPE_STR) */ +identlist_t val_t_to_identlist(val_t *); time_t val_t_to_time (val_t *); ssize_t val_t_to_size (val_t *); int val_t_to_boolean (val_t *); +int val_t_to_no_yes_all(val_t *); comp_t val_t_to_compress (val_t *); encrypt_t val_t_to_encrypt (val_t *); dump_holdingdisk_t val_t_to_holding (val_t *); -estimate_t val_t_to_estimate (val_t *); +estimatelist_t val_t_to_estimatelist (val_t *); strategy_t val_t_to_strategy (val_t *); taperalgo_t val_t_to_taperalgo(val_t *); int val_t_to_priority (val_t *); @@ -262,11 +322,14 @@ float *val_t_to_rate (val_t *); /* array of two floats */ exinclude_t val_t_to_exinclude(val_t *); int *val_t_to_intrange (val_t *); /* array of two ints */ proplist_t val_t_to_proplist (val_t *); -struct application_s *val_t_to_application(val_t *); -pp_scriptlist_t val_t_to_pp_scriptlist(val_t *); +char *val_t_to_application(val_t *); execute_on_t val_t_to_execute_on(val_t *); execute_where_t val_t_to_execute_where(val_t *); send_amreport_t val_t_to_send_amreport(val_t *); +data_path_t val_t_to_data_path(val_t *); +autolabel_t val_t_to_autolabel(val_t *); +part_cache_type_t val_t_to_part_cache_type(val_t *); +host_limit_t *val_t_to_host_limit(val_t *); /* Has the given val_t been seen in a configuration file or config overwrite? * @@ -295,13 +358,15 @@ send_amreport_t val_t_to_send_amreport(val_t *); #define val_t__real(val) ((val)->v.r) #define val_t__str(val) ((val)->v.s) #define val_t__ident(val) ((val)->v.s) +#define val_t__identlist(val) ((val)->v.identlist) #define val_t__time(val) ((val)->v.t) #define val_t__size(val) ((val)->v.size) #define val_t__boolean(val) ((val)->v.i) +#define val_t__no_yes_all(val) ((val)->v.i) #define val_t__compress(val) ((val)->v.i) #define val_t__encrypt(val) ((val)->v.i) #define val_t__holding(val) ((val)->v.i) -#define val_t__estimate(val) ((val)->v.i) +#define val_t__estimatelist(val) ((val)->v.estimatelist) #define val_t__strategy(val) ((val)->v.i) #define val_t__taperalgo(val) ((val)->v.i) #define val_t__send_amreport(val) ((val)->v.i) @@ -310,10 +375,14 @@ send_amreport_t val_t_to_send_amreport(val_t *); #define val_t__exinclude(val) ((val)->v.exinclude) #define val_t__intrange(val) ((val)->v.intrange) #define val_t__proplist(val) ((val)->v.proplist) -#define val_t__pp_scriptlist(val) ((val)->v.pp_scriptlist) #define val_t__application(val) ((val)->v.application) #define val_t__execute_on(val) ((val)->v.i) #define val_t__execute_where(val) ((val)->v.i) +#define val_t__data_path(val) ((val)->v.i) +#define val_t__autolabel(val) ((val)->v.autolabel) +#define val_t__part_cache_type(val) ((val)->v.i) +#define val_t__host_limit(val) ((val)->v.host_limit) + /* * Parameters * @@ -330,18 +399,20 @@ typedef enum { CNF_CONF, CNF_INDEX_SERVER, CNF_TAPE_SERVER, + CNF_AMDUMP_SERVER, CNF_AUTH, CNF_SSH_KEYS, CNF_AMANDAD_PATH, CNF_CLIENT_USERNAME, + CNF_CLIENT_PORT, CNF_GNUTAR_LIST_DIR, CNF_AMANDATES, CNF_MAILTO, CNF_DUMPUSER, CNF_TAPEDEV, - CNF_RAWTAPEDEV, CNF_DEVICE_PROPERTY, CNF_PROPERTY, + CNF_INTERACTIVITY, CNF_APPLICATION, CNF_APPLICATION_TOOL, CNF_EXECUTE_ON, @@ -373,7 +444,6 @@ typedef enum { CNF_ETIMEOUT, CNF_DTIMEOUT, CNF_CTIMEOUT, - CNF_TAPEBUFS, CNF_DEVICE_OUTPUT_BUFFER_SIZE, CNF_PRINTER, CNF_MAILER, @@ -398,6 +468,7 @@ typedef enum { CNF_CONNECT_TRIES, CNF_REQ_TRIES, CNF_DEBUG_AMANDAD, + CNF_DEBUG_RECOVERY, CNF_DEBUG_AMIDXTAPED, CNF_DEBUG_AMINDEXD, CNF_DEBUG_AMRECOVER, @@ -416,6 +487,16 @@ typedef enum { CNF_RESERVED_UDP_PORT, CNF_RESERVED_TCP_PORT, CNF_UNRESERVED_TCP_PORT, + CNF_HOLDINGDISK, + CNF_AUTOLABEL, + CNF_META_AUTOLABEL, + CNF_DEBUG_DAYS, + CNF_TAPER_PARALLEL_WRITE, + CNF_RECOVERY_LIMIT, + CNF_TAPERSCAN, + CNF_MAX_DLE_BY_VOLUME, + CNF_EJECT_VOLUME, + CNF_TMPDIR, CNF_CNF /* sentinel */ } confparm_key; @@ -432,9 +513,10 @@ val_t *getconf(confparm_key key); * @returns: boolean */ #define getconf_seen(key) (val_t_seen(getconf((key)))) +#define getconf_linenum(key) (val_t_seen(getconf((key)))) /* (convenience macros) - * Fetch a gloabl parameter of a specific type. Note that these + * Fetch a global parameter of a specific type. Note that these * convenience macros have a different form from those for the * subsections: here you specify a type and a key, while for the * subsections you specify only a key. The difference is historical. @@ -447,13 +529,15 @@ val_t *getconf(confparm_key key); #define getconf_real(key) (val_t_to_real(getconf((key)))) #define getconf_str(key) (val_t_to_str(getconf((key)))) #define getconf_ident(key) (val_t_to_ident(getconf((key)))) +#define getconf_identlist(key) (val_t_to_identlist(getconf((key)))) #define getconf_time(key) (val_t_to_time(getconf((key)))) #define getconf_size(key) (val_t_to_size(getconf((key)))) #define getconf_boolean(key) (val_t_to_boolean(getconf((key)))) +#define getconf_no_yes_all(key) (val_t_to_no_yes_all(getconf((key)))) #define getconf_compress(key) (val_t_to_compress(getconf((key)))) #define getconf_encrypt(key) (val_t_to_encrypt(getconf((key)))) #define getconf_holding(key) (val_t_to_holding(getconf((key)))) -#define getconf_estimate(key) (val_t_to_estimate(getconf((key)))) +#define getconf_estimatelist(key) (val_t_to_estimatelist(getconf((key)))) #define getconf_strategy(key) (val_t_to_strategy(getconf((key)))) #define getconf_taperalgo(key) (val_t_to_taperalgo(getconf((key)))) #define getconf_priority(key) (val_t_to_priority(getconf((key)))) @@ -462,6 +546,9 @@ val_t *getconf(confparm_key key); #define getconf_intrange(key) (val_t_to_intrange(getconf((key)))) #define getconf_proplist(key) (val_t_to_proplist(getconf((key)))) #define getconf_send_amreport(key) (val_t_to_send_amreport(getconf((key)))) +#define getconf_autolabel(key) (val_t_to_autolabel(getconf((key)))) +#define getconf_part_cache_type(key) (val_t_to_part_cache_type(getconf((key)))) +#define getconf_recovery_limit(key) (val_t_to_host_limit(getconf((key)))) /* Get a list of names for subsections of the given type * @@ -496,6 +583,7 @@ long int getconf_unit_divisor(void); * desired. */ extern int debug_amandad; +extern int debug_recovery; extern int debug_amidxtaped; extern int debug_amindexd; extern int debug_amrecover; @@ -524,7 +612,10 @@ typedef enum { TAPETYPE_LENGTH, TAPETYPE_FILEMARK, TAPETYPE_SPEED, - TAPETYPE_FILE_PAD, + TAPETYPE_PART_SIZE, + TAPETYPE_PART_CACHE_TYPE, + TAPETYPE_PART_CACHE_DIR, + TAPETYPE_PART_CACHE_MAX_SIZE, TAPETYPE_TAPETYPE /* sentinel */ } tapetype_key; @@ -568,17 +659,22 @@ char *tapetype_name(tapetype_t *ttyp); * @param ttyp: the tapetype to examine * @returns: various */ -#define tapetype_get_comment(ttyp) (val_t_to_str(tapetype_getconf((ttyp), TAPETYPE_COMMENT))) -#define tapetype_get_lbl_templ(ttyp) (val_t_to_str(tapetype_getconf((ttyp), TAPETYPE_LBL_TEMPL))) -#define tapetype_get_blocksize(ttyp) (val_t_to_size(tapetype_getconf((ttyp), TAPETYPE_BLOCKSIZE))) -#define tapetype_get_readblocksize(ttyp) (val_t_to_size(tapetype_getconf((ttyp), TAPETYPE_READBLOCKSIZE))) -#define tapetype_get_length(ttyp) (val_t_to_int64(tapetype_getconf((ttyp), TAPETYPE_LENGTH))) -#define tapetype_get_filemark(ttyp) (val_t_to_int64(tapetype_getconf((ttyp), TAPETYPE_FILEMARK))) -#define tapetype_get_speed(ttyp) (val_t_to_int(tapetype_getconf((ttyp), TAPETYPE_SPEED))) -#define tapetype_get_file_pad(ttyp) (val_t_to_boolean(tapetype_getconf((ttyp), TAPETYPE_FILE_PAD))) +#define tapetype_get_comment(ttyp) (val_t_to_str(tapetype_getconf((ttyp), TAPETYPE_COMMENT))) +#define tapetype_get_lbl_templ(ttyp) (val_t_to_str(tapetype_getconf((ttyp), TAPETYPE_LBL_TEMPL))) +#define tapetype_get_blocksize(ttyp) (val_t_to_size(tapetype_getconf((ttyp), TAPETYPE_BLOCKSIZE))) +#define tapetype_get_readblocksize(ttyp) (val_t_to_size(tapetype_getconf((ttyp), TAPETYPE_READBLOCKSIZE))) +#define tapetype_get_length(ttyp) (val_t_to_int64(tapetype_getconf((ttyp), TAPETYPE_LENGTH))) +#define tapetype_get_filemark(ttyp) (val_t_to_int64(tapetype_getconf((ttyp), TAPETYPE_FILEMARK))) +#define tapetype_get_speed(ttyp) (val_t_to_int(tapetype_getconf((ttyp), TAPETYPE_SPEED))) +#define tapetype_get_part_size(ttyp) (val_t_to_int64(tapetype_getconf((ttyp), TAPETYPE_PART_SIZE))) +#define tapetype_get_part_cache_type(ttyp) (val_t_to_part_cache_type(tapetype_getconf((ttyp), TAPETYPE_PART_CACHE_TYPE))) +#define tapetype_get_part_cache_dir(ttyp) (val_t_to_str(tapetype_getconf((ttyp), TAPETYPE_PART_CACHE_DIR))) +#define tapetype_get_part_cache_max_size(ttyp) (val_t_to_int64(tapetype_getconf((ttyp), TAPETYPE_PART_CACHE_MAX_SIZE))) /* * Dumptype parameter access + * + * Note that some parameters are generic to the host */ typedef enum { @@ -588,15 +684,15 @@ typedef enum { DUMPTYPE_CLNTCOMPPROG, DUMPTYPE_SRV_ENCRYPT, DUMPTYPE_CLNT_ENCRYPT, - DUMPTYPE_AMANDAD_PATH, - DUMPTYPE_CLIENT_USERNAME, - DUMPTYPE_SSH_KEYS, - DUMPTYPE_SECURITY_DRIVER, + DUMPTYPE_AMANDAD_PATH, /* host parameter */ + DUMPTYPE_CLIENT_USERNAME, /* host parameter */ + DUMPTYPE_SSH_KEYS, /* host parameter */ + DUMPTYPE_AUTH, /* host parameter */ DUMPTYPE_EXCLUDE, DUMPTYPE_INCLUDE, DUMPTYPE_PRIORITY, DUMPTYPE_DUMPCYCLE, - DUMPTYPE_MAXDUMPS, + DUMPTYPE_MAXDUMPS, /* host parameter */ DUMPTYPE_MAXPROMOTEDAY, DUMPTYPE_BUMPPERCENT, DUMPTYPE_BUMPSIZE, @@ -604,7 +700,7 @@ typedef enum { DUMPTYPE_BUMPMULT, DUMPTYPE_STARTTIME, DUMPTYPE_STRATEGY, - DUMPTYPE_ESTIMATE, + DUMPTYPE_ESTIMATELIST, DUMPTYPE_COMPRESS, DUMPTYPE_ENCRYPT, DUMPTYPE_SRV_DECRYPT_OPT, @@ -621,8 +717,14 @@ typedef enum { DUMPTYPE_IGNORE, DUMPTYPE_INDEX, DUMPTYPE_APPLICATION, - DUMPTYPE_PP_SCRIPTLIST, + DUMPTYPE_SCRIPTLIST, DUMPTYPE_PROPERTY, + DUMPTYPE_CLIENT_PORT, + DUMPTYPE_DATA_PATH, + DUMPTYPE_ALLOW_SPLIT, + DUMPTYPE_RECOVERY_LIMIT, + DUMPTYPE_DUMP_LIMIT, + DUMPTYPE_MAX_WARNINGS, DUMPTYPE_DUMPTYPE /* sentinel */ } dumptype_key; @@ -675,7 +777,7 @@ char *dumptype_name(dumptype_t *dtyp); #define dumptype_get_amandad_path(dtyp) (val_t_to_str(dumptype_getconf((dtyp), DUMPTYPE_AMANDAD_PATH))) #define dumptype_get_client_username(dtyp) (val_t_to_str(dumptype_getconf((dtyp), DUMPTYPE_CLIENT_USERNAME))) #define dumptype_get_ssh_keys(dtyp) (val_t_to_str(dumptype_getconf((dtyp), DUMPTYPE_SSH_KEYS))) -#define dumptype_get_security_driver(dtyp) (val_t_to_str(dumptype_getconf((dtyp), DUMPTYPE_SECURITY_DRIVER))) +#define dumptype_get_auth(dtyp) (val_t_to_str(dumptype_getconf((dtyp), DUMPTYPE_AUTH))) #define dumptype_get_exclude(dtyp) (val_t_to_exinclude(dumptype_getconf((dtyp), DUMPTYPE_EXCLUDE))) #define dumptype_get_include(dtyp) (val_t_to_exinclude(dumptype_getconf((dtyp), DUMPTYPE_INCLUDE))) #define dumptype_get_priority(dtyp) (val_t_to_priority(dumptype_getconf((dtyp), DUMPTYPE_PRIORITY))) @@ -690,7 +792,7 @@ char *dumptype_name(dumptype_t *dtyp); #define dumptype_get_bumpmult(dtyp) (val_t_to_real(dumptype_getconf((dtyp), DUMPTYPE_BUMPMULT))) #define dumptype_get_starttime(dtyp) (val_t_to_time(dumptype_getconf((dtyp), DUMPTYPE_STARTTIME))) #define dumptype_get_strategy(dtyp) (val_t_to_strategy(dumptype_getconf((dtyp), DUMPTYPE_STRATEGY))) -#define dumptype_get_estimate(dtyp) (val_t_to_estimate(dumptype_getconf((dtyp), DUMPTYPE_ESTIMATE))) +#define dumptype_get_estimatelist(dtyp) (val_t_to_estimatelist(dumptype_getconf((dtyp), DUMPTYPE_ESTIMATELIST))) #define dumptype_get_compress(dtyp) (val_t_to_compress(dumptype_getconf((dtyp), DUMPTYPE_COMPRESS))) #define dumptype_get_encrypt(dtyp) (val_t_to_encrypt(dumptype_getconf((dtyp), DUMPTYPE_ENCRYPT))) #define dumptype_get_srv_decrypt_opt(dtyp) (val_t_to_str(dumptype_getconf((dtyp), DUMPTYPE_SRV_DECRYPT_OPT))) @@ -707,8 +809,14 @@ char *dumptype_name(dumptype_t *dtyp); #define dumptype_get_ignore(dtyp) (val_t_to_boolean(dumptype_getconf((dtyp), DUMPTYPE_IGNORE))) #define dumptype_get_index(dtyp) (val_t_to_boolean(dumptype_getconf((dtyp), DUMPTYPE_INDEX))) #define dumptype_get_application(dtyp) (val_t_to_application(dumptype_getconf((dtyp), DUMPTYPE_APPLICATION))) -#define dumptype_get_pp_scriptlist(dtyp) (val_t_to_pp_scriptlist(dumptype_getconf((dtyp), DUMPTYPE_PP_SCRIPTLIST))) +#define dumptype_get_scriptlist(dtyp) (val_t_to_identlist(dumptype_getconf((dtyp), DUMPTYPE_SCRIPTLIST))) #define dumptype_get_property(dtyp) (val_t_to_proplist(dumptype_getconf((dtyp), DUMPTYPE_PROPERTY))) +#define dumptype_get_client_port(dtyp) (val_t_to_str(dumptype_getconf((dtyp), DUMPTYPE_CLIENT_PORT))) +#define dumptype_get_data_path(dtyp) (val_t_to_data_path(dumptype_getconf((dtyp), DUMPTYPE_DATA_PATH))) +#define dumptype_get_allow_split(dtyp) (val_t_to_boolean(dumptype_getconf((dtyp), DUMPTYPE_ALLOW_SPLIT))) +#define dumptype_get_recovery_limit(dtyp) (val_t_to_host_limit(dumptype_getconf((dtyp), DUMPTYPE_RECOVERY_LIMIT))) +#define dumptype_get_dump_limit(dtyp) (val_t_to_host_limit(dumptype_getconf((dtyp), DUMPTYPE_DUMP_LIMIT))) +#define dumptype_get_max_warnings(dtyp) (val_t_to_int(dumptype_getconf((dtyp), DUMPTYPE_MAX_WARNINGS))) /* * Interface parameter access @@ -786,20 +894,11 @@ typedef struct holdingdisk_s holdingdisk_t; */ holdingdisk_t *lookup_holdingdisk(char *identifier); -/* Return the whole linked list of holdingdisks. Use holdingdisk_next - * to traverse the list. +/* Return the whole linked list of holdingdisks. * * @returns: first holding disk */ -holdingdisk_t *getconf_holdingdisks(void); - -/* Return the next holdingdisk in the list. - * - * @param hdisk: holding disk - * @returns: NULL if hdisk is the last disk, otherwise the next holding - * disk - */ -holdingdisk_t *holdingdisk_next(holdingdisk_t *hdisk); +GSList *getconf_holdingdisks(void); /* Given a holdingdisk and a key, return a pointer to the corresponding val_t. * @@ -840,6 +939,7 @@ typedef enum application_e { APPLICATION_COMMENT, APPLICATION_PLUGIN, APPLICATION_PROPERTY, + APPLICATION_CLIENT_NAME, APPLICATION_APPLICATION } application_key; @@ -887,8 +987,7 @@ char *application_name(application_t *app); #define application_get_comment(application) (val_t_to_str(application_getconf((application), APPLICATION_COMMENT)) #define application_get_plugin(application) (val_t_to_str(application_getconf((application), APPLICATION_PLUGIN))) #define application_get_property(application) (val_t_to_proplist(application_getconf((application), APPLICATION_PROPERTY))) - -application_t *read_application(char *name, FILE *from, char *fname, int *linenum); +#define application_get_client_name(application) (val_t_to_str(application_getconf((application), APPLICATION_CLIENT_NAME))) /* A pp-script-tool interface */ typedef enum pp_script_e { @@ -897,6 +996,9 @@ typedef enum pp_script_e { PP_SCRIPT_PROPERTY, PP_SCRIPT_EXECUTE_ON, PP_SCRIPT_EXECUTE_WHERE, + PP_SCRIPT_ORDER, + PP_SCRIPT_SINGLE_EXECUTION, + PP_SCRIPT_CLIENT_NAME, PP_SCRIPT_PP_SCRIPT } pp_script_key; @@ -947,8 +1049,10 @@ char *pp_script_name(pp_script_t *pps); #define pp_script_get_property(pp_script) (val_t_to_proplist(pp_script_getconf((pp_script), PP_SCRIPT_PROPERTY))) #define pp_script_get_execute_on(pp_script) (val_t_to_execute_on(pp_script_getconf((pp_script), PP_SCRIPT_EXECUTE_ON))) #define pp_script_get_execute_where(pp_script) (val_t_to_execute_where(pp_script_getconf((pp_script), PP_SCRIPT_EXECUTE_WHERE))) +#define pp_script_get_order(pp_script) (val_t_to_int(pp_script_getconf((pp_script), PP_SCRIPT_ORDER))) +#define pp_script_get_single_execution(pp_script) (val_t_to_boolean(pp_script_getconf((pp_script), PP_SCRIPT_SINGLE_EXECUTION))) +#define pp_script_get_client_name(pp_script) (val_t_to_str(pp_script_getconf((pp_script), PP_SCRIPT_CLIENT_NAME))) -pp_script_t *read_pp_script(char *name, FILE *from, char *fname, int *linenum); pp_script_t *lookup_pp_script(char *identifier); /* A device definition */ @@ -1005,7 +1109,6 @@ char *device_config_name(device_config_t *devconf); #define device_config_get_tapedev(devconf) (val_t_to_str(device_config_getconf((devconf), DEVICE_CONFIG_TAPEDEV))) #define device_config_get_property(devconf) (val_t_to_proplist(device_config_getconf((devconf), DEVICE_CONFIG_DEVICE_PROPERTY))) -device_config_t *read_device_config(char *name, FILE *from, char *fname, int *linenum); device_config_t *lookup_device_config(char *identifier); /* A changer definition */ @@ -1015,6 +1118,8 @@ typedef enum { CHANGER_CONFIG_TPCHANGER, CHANGER_CONFIG_CHANGERDEV, CHANGER_CONFIG_CHANGERFILE, + CHANGER_CONFIG_PROPERTY, + CHANGER_CONFIG_DEVICE_PROPERTY, CHANGER_CONFIG_CHANGER_CONFIG } changer_config_key; @@ -1060,15 +1165,123 @@ char *changer_config_name(changer_config_t *devconf); * @returns: various */ -#define changer_config_get_comment(devconf) (val_t_to_str(changer_config_getconf((devconf), DEVICE_CONFIG_COMMENT))) -#define changer_config_get_tapedev(devconf) (val_t_to_str(changer_config_getconf((devconf), DEVICE_CONFIG_TAPEDEV))) -#define changer_config_get_tpchanger(devconf) (val_t_to_str(changer_config_getconf((devconf), DEVICE_CONFIG_TPCHANGER))) -#define changer_config_get_changerdev(devconf) (val_t_to_str(changer_config_getconf((devconf), DEVICE_CONFIG_CHANGERDEV))) -#define changer_config_get_changerfile(devconf) (val_t_to_str(changer_config_getconf((devconf), DEVICE_CONFIG_CHANGERFILE))) +#define changer_config_get_comment(devconf) (val_t_to_str(changer_config_getconf((devconf), CHANGER_CONFIG_COMMENT))) +#define changer_config_get_tapedev(devconf) (val_t_to_str(changer_config_getconf((devconf), CHANGER_CONFIG_TAPEDEV))) +#define changer_config_get_tpchanger(devconf) (val_t_to_str(changer_config_getconf((devconf), CHANGER_CONFIG_TPCHANGER))) +#define changer_config_get_changerdev(devconf) (val_t_to_str(changer_config_getconf((devconf), CHANGER_CONFIG_CHANGERDEV))) +#define changer_config_get_changerfile(devconf) (val_t_to_str(changer_config_getconf((devconf), CHANGER_CONFIG_CHANGERFILE))) -changer_config_t *read_changer_config(char *name, FILE *from, char *fname, int *linenum); changer_config_t *lookup_changer_config(char *identifier); +/* A interacrtivity interface */ +typedef enum interactivity_e { + INTERACTIVITY_COMMENT, + INTERACTIVITY_PLUGIN, + INTERACTIVITY_PROPERTY, + INTERACTIVITY_INTERACTIVITY +} interactivity_key; + +/* opaque object */ +typedef struct interactivity_s interactivity_t; + +/* Given the name of the interactivity, return a interactivity object. + * Returns NULL if no matching interactivity exists. + * Note that the match is case-insensitive. + * + * @param identifier: name of the desired interactivity + * @returns: object or NULL + */ + +interactivity_t *lookup_interactivity(char *identifier); + +/* Given a interactivity and a key, return a pointer to the corresponding val_t. + * + * @param ttyp: the interactivity to examine + * @param key: interactivity (one of the INTERACTIVITY_* constants) + * @returns: pointer to value + */ +val_t *interactivity_getconf(interactivity_t *app, interactivity_key key); + +/* Get the name of this interactivity. + * + * @param ttyp: the interactivity to examine + * @returns: name of the interactivity + */ +char *interactivity_name(interactivity_t *app); + +/* (convenience macro) has this parameter been seen in this interactivity? + * This applies to the specific parameter *within* the interactivity. + * + * @param key: interactivity_key + * @returns: boolean + */ +#define interactivity_seen(app, key) (val_t_seen(interactivity_getconf((app), (key)))) + +/* (convenience macros) + * fetch a particular parameter; caller must know the correct type. + * + * @param ttyp: the interactivity to examine + * @returns: various + */ +#define interactivity_get_comment(interactivity) (val_t_to_str(interactivity_getconf((interactivity), INTERACTIVITY_COMMENT)) +#define interactivity_get_plugin(interactivity) (val_t_to_str(interactivity_getconf((interactivity), INTERACTIVITY_PLUGIN))) +#define interactivity_get_property(interactivity) (val_t_to_proplist(interactivity_getconf((interactivity), INTERACTIVITY_PROPERTY))) + +/* A taperscan interface */ +typedef enum taperscan_e { + TAPERSCAN_COMMENT, + TAPERSCAN_PLUGIN, + TAPERSCAN_PROPERTY, + TAPERSCAN_TAPERSCAN +} taperscan_key; + +/* opaque object */ +typedef struct taperscan_s taperscan_t; + +/* Given the name of the taperscan, return a taperscan object. + * Returns NULL if no matching taperscan exists. + * Note that the match is case-insensitive. + * + * @param identifier: name of the desired taperscan + * @returns: object or NULL + */ + +taperscan_t *lookup_taperscan(char *identifier); + +/* Given a taperscan and a key, return a pointer to the corresponding val_t. + * + * @param ttyp: the taperscan to examine + * @param key: taperscan (one of the TAPERSCAN_* constants) + * @returns: pointer to value + */ +val_t *taperscan_getconf(taperscan_t *app, taperscan_key key); + +/* Get the name of this taperscan. + * + * @param ttyp: the taperscan to examine + * @returns: name of the taperscan + */ +char *taperscan_name(taperscan_t *app); + +/* (convenience macro) has this parameter been seen in this taperscan? + * This applies to the specific parameter *within* the taperscan. + * + * @param key: taperscan_key + * @returns: boolean + */ +#define taperscan_seen(app, key) (val_t_seen(taperscan_getconf((app), (key)))) + +/* (convenience macros) + * fetch a particular parameter; caller must know the correct type. + * + * @param ttyp: the taperscan to examine + * @returns: various + */ +#define taperscan_get_comment(taperscan) (val_t_to_str(taperscan_getconf((taperscan), TAPERSCAN_COMMENT)) +#define taperscan_get_plugin(taperscan) (val_t_to_str(taperscan_getconf((taperscan), TAPERSCAN_PLUGIN))) +#define taperscan_get_property(taperscan) (val_t_to_proplist(taperscan_getconf((taperscan), TAPERSCAN_PROPERTY))) + + /* * Error Handling */ @@ -1122,41 +1335,41 @@ void config_add_error(cfgerr_level_t level, char *errmsg); */ /* opaque type */ -typedef struct config_overwrites_s config_overwrites_t; +typedef struct config_overrides_s config_overrides_t; -/* Create a new, empty config_overwrites object. +/* Create a new, empty config_overrides object. * * @param size_estimate: a guess at the number of overwrites; argc/2 is a * good estimate. * @returns: new object */ -config_overwrites_t *new_config_overwrites(int size_estimate); +config_overrides_t *new_config_overrides(int size_estimate); -/* Free a config_overwrites object. This usually won't be needed, as - * apply_config_overwrites takes ownership of the overwrites for you. +/* Free a config_overrides object. This usually won't be needed, as + * apply_config_overrides takes ownership of the overwrites for you. * - * @param co: config_overwrites object + * @param co: config_overrides object */ -void free_config_overwrites(config_overwrites_t *co); +void free_config_overrides(config_overrides_t *co); -/* Add an overwrite to a config_overwrites object. +/* Add an overwrite to a config_overrides object. * - * @param co: the config_overwrites object + * @param co: the config_overrides object * @param key: the configuration parameter's key, possibly with the format * SUBTYPE:NAME:KEYWORD * @param value: the value for the parameter, as would be seen in amanda.conf */ -void add_config_overwrite(config_overwrites_t *co, +void add_config_override(config_overrides_t *co, char *key, char *value); -/* Add an overwrite option from the command line to a config_overwrites +/* Add an overwrite option from the command line to a config_overrides * object. Calls error() with any errors * - * @param co: the config_overwrites object + * @param co: the config_overrides object * @param optarg: the value of the command-line option */ -void add_config_overwrite_opt(config_overwrites_t *co, +void add_config_override_opt(config_overrides_t *co, char *optarg); /* Given a command line, represented as argc/argv, extract any -o options @@ -1164,24 +1377,22 @@ void add_config_overwrite_opt(config_overwrites_t *co, * * This is the deprecated way to extract config overwrites, for applications * which do not use getopt. The preferred method is to use getopt and - * call add_config_overwrite_opt for any -o options. + * call add_config_override_opt for any -o options. * * @param argc: (in/out) command-line length * @param argv: (in/out) command-line strings - * @returns: newly allocated config_overwrites object + * @returns: newly allocated config_overrides object */ -config_overwrites_t * -extract_commandline_config_overwrites(int *argc, +config_overrides_t * +extract_commandline_config_overrides(int *argc, char ***argv); -/* Apply configuration overwrites to the current configuration and take - * ownership of the config_overwrites object. It is the caller's - * responsibility to handle any errors. +/* Set configuration overwrites to the current configuration and take + * ownership of the config_overrides object. * - * @param co: the config_overwrites object - * @returns: current error level + * @param co: the config_overrides object */ -cfgerr_level_t apply_config_overwrites(config_overwrites_t *co); +void set_config_overrides(config_overrides_t *co); /* * Initialization @@ -1230,7 +1441,7 @@ cfgerr_level_t config_init( */ void config_uninit(void); -/* Encode any applied config_overwrites into a strv format suitale for +/* Encode any applied config_overrides into a strv format suitale for * executing another Amanda tool. * * The * result is dynamically allocated and NULL terminated. There is no @@ -1281,7 +1492,10 @@ char *generic_get_security_conf(char *, void *); * This function only dumps the server configuration, and will fail on * clients. */ -void dump_configuration(void); +void dump_configuration(gboolean print_default, gboolean print_source); + +void dump_dumptype(dumptype_t *dp, char *prefix, gboolean print_default, + gboolean print_source); /* Return a sequence of strings giving the printable representation * of the given val_t. If str_needs_quotes is true and each string is @@ -1300,7 +1514,8 @@ void dump_configuration(void); * @param str_needs_quotes: add quotes to CONFTYPE_STR values? * @returns: NULL-terminated string vector */ -char **val_t_display_strs(val_t *val, int str_needs_quotes); +char **val_t_display_strs(val_t *val, int str_needs_quotes, gboolean print_source, + gboolean print_unit); /* Read a dumptype; this is used by this module as well as by diskfile.c to * read the disklist. The two are carefully balanced in their parsing process. @@ -1345,18 +1560,28 @@ char *taperalgo2str(taperalgo_t taperalgo); */ gint64 find_multiplier(char * casestr); -/* Compute the size needed in an ARGV to pass all properties +/* Converts a string matching any of Amanda's names for "true" or + * "false" to a boolean value. * - * @param proplist: The property list - * @returns: The size required for an ARGV + * @param str: string to match + * @returns: 0 or 1 (boolean) or -1 (no match) */ -int property_argv_size(proplist_t proplist); +int string_to_boolean(const char *str); + +/* Return a pointer to a static string for the data_path */ +char *data_path_to_string(data_path_t data_path); + +/* Return the data_path for the string */ +data_path_t data_path_from_string(char *data); + +void free_property_t(gpointer p); -/* Add all properties to an ARGV +/* Converts a string into Amanda property name style. * - * @param argvchild: Pointer to the ARGV. - * @param proplist: The property list + * @param name: The name to convert. + * @returns: A newly allocated string, with name in lowercase and + * any instances of '_' replaced with '-'. */ -int property_add_to_argv(char **argvchild, proplist_t proplist); +gchar *amandaify_property_name(const gchar *name); #endif /* ! CONFFILE_H */