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 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 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 * 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 * 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 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