12654012fSReza Sabdar /*
2d0194491SJanice Chang * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
3*faac71c0SJan Kryl * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
42654012fSReza Sabdar */
52654012fSReza Sabdar
62654012fSReza Sabdar /*
72654012fSReza Sabdar * BSD 3 Clause License
82654012fSReza Sabdar *
92654012fSReza Sabdar * Copyright (c) 2007, The Storage Networking Industry Association.
102654012fSReza Sabdar *
112654012fSReza Sabdar * Redistribution and use in source and binary forms, with or without
122654012fSReza Sabdar * modification, are permitted provided that the following conditions
132654012fSReza Sabdar * are met:
142654012fSReza Sabdar * - Redistributions of source code must retain the above copyright
152654012fSReza Sabdar * notice, this list of conditions and the following disclaimer.
162654012fSReza Sabdar *
172654012fSReza Sabdar * - Redistributions in binary form must reproduce the above copyright
182654012fSReza Sabdar * notice, this list of conditions and the following disclaimer in
192654012fSReza Sabdar * the documentation and/or other materials provided with the
202654012fSReza Sabdar * distribution.
212654012fSReza Sabdar *
222654012fSReza Sabdar * - Neither the name of The Storage Networking Industry Association (SNIA)
232654012fSReza Sabdar * nor the names of its contributors may be used to endorse or promote
242654012fSReza Sabdar * products derived from this software without specific prior written
252654012fSReza Sabdar * permission.
262654012fSReza Sabdar *
272654012fSReza Sabdar * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
282654012fSReza Sabdar * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
292654012fSReza Sabdar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
302654012fSReza Sabdar * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
312654012fSReza Sabdar * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
322654012fSReza Sabdar * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
332654012fSReza Sabdar * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
342654012fSReza Sabdar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
352654012fSReza Sabdar * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
362654012fSReza Sabdar * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
372654012fSReza Sabdar * POSSIBILITY OF SUCH DAMAGE.
382654012fSReza Sabdar */
392654012fSReza Sabdar
402654012fSReza Sabdar /*
412654012fSReza Sabdar * NDMP configuration management
422654012fSReza Sabdar */
432654012fSReza Sabdar #include <stdio.h>
442654012fSReza Sabdar #include <stdlib.h>
452654012fSReza Sabdar #include <synch.h>
462654012fSReza Sabdar #include <syslog.h>
472654012fSReza Sabdar #include <strings.h>
482654012fSReza Sabdar #include <ndmpd_prop.h>
492654012fSReza Sabdar #include <libndmp.h>
502654012fSReza Sabdar #include "ndmpd.h"
512654012fSReza Sabdar
522654012fSReza Sabdar typedef struct ndmpd_cfg_param {
532654012fSReza Sabdar char *sc_name;
542654012fSReza Sabdar char *sc_defval;
552654012fSReza Sabdar char *sc_value;
562654012fSReza Sabdar uint32_t sc_flags;
572654012fSReza Sabdar } ndmpd_cfg_param_t;
582654012fSReza Sabdar
592654012fSReza Sabdar
602654012fSReza Sabdar static int ndmpd_config_update(ndmpd_cfg_param_t *cfg, char *value);
612654012fSReza Sabdar
622654012fSReza Sabdar /*
632654012fSReza Sabdar * IMPORTANT: any changes to the order of this table's entries
642654012fSReza Sabdar * need to be reflected in the enum ndmpd_cfg_id_t.
652654012fSReza Sabdar */
662654012fSReza Sabdar ndmpd_cfg_param_t ndmpd_cfg_table[] =
672654012fSReza Sabdar {
682654012fSReza Sabdar {"dar-support", "", 0, NDMP_CF_NOTINIT},
692654012fSReza Sabdar {"mover-nic", "", 0, NDMP_CF_NOTINIT},
702654012fSReza Sabdar {"dump-pathnode", "", 0, NDMP_CF_NOTINIT},
712654012fSReza Sabdar {"tar-pathnode", "", 0, NDMP_CF_NOTINIT},
722654012fSReza Sabdar {"fh-inode", "", 0, NDMP_CF_NOTINIT},
732654012fSReza Sabdar {"ignore-ctime", "", 0, NDMP_CF_NOTINIT},
742654012fSReza Sabdar {"include-lmtime", "", 0, NDMP_CF_NOTINIT},
752654012fSReza Sabdar {"token-maxseq", "", 0, NDMP_CF_NOTINIT},
762654012fSReza Sabdar {"version", "", 0, NDMP_CF_NOTINIT},
772654012fSReza Sabdar {"restore-fullpath", "", 0, NDMP_CF_NOTINIT},
782654012fSReza Sabdar {"debug-path", "", 0, NDMP_CF_NOTINIT},
792654012fSReza Sabdar {"plugin-path", "", 0, NDMP_CF_NOTINIT},
802654012fSReza Sabdar {"socket-css", "", 0, NDMP_CF_NOTINIT},
812654012fSReza Sabdar {"socket-crs", "", 0, NDMP_CF_NOTINIT},
822654012fSReza Sabdar {"mover-recordsize", "", 0, NDMP_CF_NOTINIT},
832654012fSReza Sabdar {"restore-wildcard-enable", "", 0, NDMP_CF_NOTINIT},
842654012fSReza Sabdar {"cram-md5-username", "", 0, NDMP_CF_NOTINIT},
852654012fSReza Sabdar {"cram-md5-password", "", 0, NDMP_CF_NOTINIT},
862654012fSReza Sabdar {"cleartext-username", "", 0, NDMP_CF_NOTINIT},
872654012fSReza Sabdar {"cleartext-password", "", 0, NDMP_CF_NOTINIT},
882654012fSReza Sabdar {"tcp-port", "", 0, NDMP_CF_NOTINIT},
892654012fSReza Sabdar {"backup-quarantine", "", 0, NDMP_CF_NOTINIT},
902654012fSReza Sabdar {"restore-quarantine", "", 0, NDMP_CF_NOTINIT},
912654012fSReza Sabdar {"overwrite-quarantine", "", 0, NDMP_CF_NOTINIT},
92d0194491SJanice Chang {"zfs-force-override", "", 0, NDMP_CF_NOTINIT},
931e05b03fSJanice Chang {"drive-type", "", 0, NDMP_CF_NOTINIT},
94*faac71c0SJan Kryl {"debug-mode", "", 0, NDMP_CF_NOTINIT},
952654012fSReza Sabdar };
962654012fSReza Sabdar
972654012fSReza Sabdar /*
982654012fSReza Sabdar * Loads all the NDMP configuration parameters and sets up the
992654012fSReza Sabdar * config table.
1002654012fSReza Sabdar */
1012654012fSReza Sabdar int
ndmpd_load_prop(void)1022654012fSReza Sabdar ndmpd_load_prop(void)
1032654012fSReza Sabdar {
1042654012fSReza Sabdar ndmpd_cfg_id_t id;
1052654012fSReza Sabdar ndmpd_cfg_param_t *cfg;
1062654012fSReza Sabdar char *value;
1072654012fSReza Sabdar
1082654012fSReza Sabdar for (id = 0; id < NDMP_MAXALL; id++) {
1092654012fSReza Sabdar cfg = &ndmpd_cfg_table[id];
1102654012fSReza Sabdar if ((ndmp_get_prop(cfg->sc_name, &value)) == -1) {
1112654012fSReza Sabdar syslog(LOG_DEBUG, "%s %s",
1122654012fSReza Sabdar cfg->sc_name, ndmp_strerror(ndmp_errno));
1132654012fSReza Sabdar continue;
1142654012fSReza Sabdar }
1152654012fSReza Sabdar /*
1162654012fSReza Sabdar * enval == 0 could mean two things, either the
1172654012fSReza Sabdar * config param is not defined, or it has been
1182654012fSReza Sabdar * removed. If the variable has already been defined
1192654012fSReza Sabdar * and now enval is 0, it should be removed, otherwise
1202654012fSReza Sabdar * we don't need to do anything in this case.
1212654012fSReza Sabdar */
1222654012fSReza Sabdar if ((cfg->sc_flags & NDMP_CF_DEFINED) || value) {
1232654012fSReza Sabdar if (ndmpd_config_update(cfg, value)) {
1242654012fSReza Sabdar free(value);
1252654012fSReza Sabdar return (-1);
1262654012fSReza Sabdar }
1272654012fSReza Sabdar }
1282654012fSReza Sabdar free(value);
1292654012fSReza Sabdar }
1302654012fSReza Sabdar return (0);
1312654012fSReza Sabdar }
1322654012fSReza Sabdar
1332654012fSReza Sabdar /*
1342654012fSReza Sabdar * ndmpd_config_update
1352654012fSReza Sabdar *
1362654012fSReza Sabdar * Updates the specified config param with the given value.
1372654012fSReza Sabdar * This function is called both on (re)load and set.
1382654012fSReza Sabdar */
1392654012fSReza Sabdar static int
ndmpd_config_update(ndmpd_cfg_param_t * cfg,char * value)1402654012fSReza Sabdar ndmpd_config_update(ndmpd_cfg_param_t *cfg, char *value)
1412654012fSReza Sabdar {
1422654012fSReza Sabdar char *curval;
1432654012fSReza Sabdar int rc = 0;
1442654012fSReza Sabdar int len;
1452654012fSReza Sabdar
1462654012fSReza Sabdar if (value) {
1472654012fSReza Sabdar len = strlen(value);
1482654012fSReza Sabdar if (cfg->sc_value) {
1492654012fSReza Sabdar curval = realloc(cfg->sc_value, (len + 1));
1502654012fSReza Sabdar } else {
1512654012fSReza Sabdar curval = ndmp_malloc(len + 1);
1522654012fSReza Sabdar }
1532654012fSReza Sabdar
1542654012fSReza Sabdar if (curval) {
1552654012fSReza Sabdar cfg->sc_value = curval;
1562654012fSReza Sabdar (void) strcpy(cfg->sc_value, value);
1572654012fSReza Sabdar cfg->sc_flags |= NDMP_CF_DEFINED;
1582654012fSReza Sabdar } else {
1592654012fSReza Sabdar syslog(LOG_ERR, "Out of memory.");
1602654012fSReza Sabdar rc = -1;
1612654012fSReza Sabdar }
1622654012fSReza Sabdar } else if (cfg->sc_value) {
1632654012fSReza Sabdar free(cfg->sc_value);
1642654012fSReza Sabdar cfg->sc_value = 0;
1652654012fSReza Sabdar cfg->sc_flags &= ~NDMP_CF_DEFINED;
1662654012fSReza Sabdar }
1672654012fSReza Sabdar
1682654012fSReza Sabdar return (rc);
1692654012fSReza Sabdar }
1702654012fSReza Sabdar
1712654012fSReza Sabdar /*
1722654012fSReza Sabdar * Returns value of the specified config param.
1732654012fSReza Sabdar * The return value is a string pointer to the locally
1742654012fSReza Sabdar * allocated memory if the config param is defined
1752654012fSReza Sabdar * otherwise it would be NULL.
1762654012fSReza Sabdar */
1772654012fSReza Sabdar char *
ndmpd_get_prop(ndmpd_cfg_id_t id)1782654012fSReza Sabdar ndmpd_get_prop(ndmpd_cfg_id_t id)
1792654012fSReza Sabdar {
1802654012fSReza Sabdar char *env_val;
1812654012fSReza Sabdar
1822654012fSReza Sabdar if (id < NDMP_MAXALL) {
1832654012fSReza Sabdar env_val = ndmpd_cfg_table[id].sc_value;
1842654012fSReza Sabdar return (env_val);
1852654012fSReza Sabdar }
1862654012fSReza Sabdar
1872654012fSReza Sabdar return (0);
1882654012fSReza Sabdar }
1892654012fSReza Sabdar
1902654012fSReza Sabdar /*
1912654012fSReza Sabdar * Similar to ndmpd_get_prop except it will return dflt value
1922654012fSReza Sabdar * if env is not set.
1932654012fSReza Sabdar */
1942654012fSReza Sabdar char *
ndmpd_get_prop_default(ndmpd_cfg_id_t id,char * dflt)1952654012fSReza Sabdar ndmpd_get_prop_default(ndmpd_cfg_id_t id, char *dflt)
1962654012fSReza Sabdar {
1972654012fSReza Sabdar char *env;
1982654012fSReza Sabdar
1992654012fSReza Sabdar env = ndmpd_get_prop(id);
2002654012fSReza Sabdar
2012654012fSReza Sabdar if (env && *env != 0) {
2022654012fSReza Sabdar return (env);
2032654012fSReza Sabdar } else {
2042654012fSReza Sabdar return (dflt);
2052654012fSReza Sabdar }
2062654012fSReza Sabdar }
2072654012fSReza Sabdar
2082654012fSReza Sabdar /*
2092654012fSReza Sabdar * Returns the value of a yes/no config param.
2102654012fSReza Sabdar * Returns 1 is config is set to "yes", otherwise 0.
2112654012fSReza Sabdar */
2122654012fSReza Sabdar int
ndmpd_get_prop_yorn(ndmpd_cfg_id_t id)2132654012fSReza Sabdar ndmpd_get_prop_yorn(ndmpd_cfg_id_t id)
2142654012fSReza Sabdar {
2152654012fSReza Sabdar char *val;
2162654012fSReza Sabdar
2172654012fSReza Sabdar val = ndmpd_get_prop(id);
2182654012fSReza Sabdar if (val) {
2192654012fSReza Sabdar if (strcasecmp(val, "yes") == 0)
2202654012fSReza Sabdar return (1);
2212654012fSReza Sabdar }
2222654012fSReza Sabdar
2232654012fSReza Sabdar return (0);
2242654012fSReza Sabdar }
225