Пример #1
0
int
auksd_engine_init_from_config_file(auksd_engine_t * engine,
				   char *conf_file)
{
	int fstatus = AUKS_ERROR;

	char* l_conf_file;
	char* e_conf_file;

	config_file_t config;
	int block_nb;

	char *phost;
	char *padd;
	char *pport;
	char *pprinc;
	char *pktb;

	char *shost;
	char *sadd;
	char *sport;
	char *sprinc;
	char *sktb;

	char *cdir;
	char *afile;

	char *lfile;
	char *dfile;

	char *ll_str;
	char *dl_str;
	char *tnb_str;
	char *qs_str;
	char *rs_str;
	char *rd_str;
	char *nat_str;
	char *krc_str;

	long int ll, dl, tnb, qs, rs, rd;

	int nat, krc;

	int i;

	int valid_block_nb=0;

	if ( conf_file != NULL )
		l_conf_file = conf_file;
	else {
		e_conf_file = getenv("AUKSD_CONF");
		if ( e_conf_file != NULL )
			l_conf_file = e_conf_file ;
		else
			l_conf_file = DEFAULT_AUKSD_CONF ;
	}

	/* parse configuration file */
	config = config_ParseFile(l_conf_file);
	if (!config) {
		auks_error("unable to parse configuration file %s : %s",
		      l_conf_file, extern_errormsg);
		fstatus = AUKS_ERROR_ENGINE_CONFFILE_PARSING ;
		goto exit;
	}

	/* get conf blocks quantity */
	block_nb = config_GetNbBlocks(config);
	if (block_nb <= 0) {
		auks_error("unable to get configuration blocks from config "
			   "file %s : %s", l_conf_file, extern_errormsg);
		fstatus = AUKS_ERROR_ENGINE_CONFFILE_INVALID ;
		goto parse_exit;
	}

	/* look for relevants block and add contents to engine conf */
	fstatus = AUKS_ERROR_ENGINE_CONFFILE_INCOMPLETE ;

	for (i = 0; i < block_nb; i++) {
		char *block_name;
		block_name = config_GetBlockName(config, i);

		/* skip non config blocks */
		if (strncmp("common", block_name, 7) != 0) {
			continue;
		}
		auks_log
		    ("initializing engine from 'common' block of file %s",
		     l_conf_file);

		/* primary server conf value */
		phost =	config_GetKeyValueByName(config,i,"PrimaryHost");
		if (phost == NULL)
			phost = DEFAULT_AUKSD_PRIMARY_HOST;
		padd = config_GetKeyValueByName(config,i,"PrimaryAddress");
		if (padd == NULL)
			padd = DEFAULT_AUKSD_PRIMARY_ADDR;
		pport = config_GetKeyValueByName(config,i,"PrimaryPort");
		if (pport == NULL)
			pport = DEFAULT_AUKSD_PRIMARY_PORT;
		pprinc = config_GetKeyValueByName(config,i,"PrimaryPrincipal");
		if (pprinc == NULL)
			pprinc = DEFAULT_AUKSD_PRIMARY_PRINC;

		/* secondary server conf value */
		shost = config_GetKeyValueByName(config,i,"SecondaryHost");
		if (shost == NULL)
			shost = DEFAULT_AUKSD_SECONDARY_HOST;
		sadd = config_GetKeyValueByName(config,i,"SecondaryAddress");
		if (sadd == NULL)
			sadd = DEFAULT_AUKSD_SECONDARY_ADDR;
		sport = config_GetKeyValueByName(config,i,"SecondaryPort");
		if (sport == NULL)
			sport = DEFAULT_AUKSD_SECONDARY_PORT;
		sprinc = config_GetKeyValueByName(config,i,
						  "SecondaryPrincipal");
		if (sprinc == NULL)
			sprinc = DEFAULT_AUKSD_SECONDARY_PRINC;

		/* NAT traversal mode */
		nat_str =
			config_GetKeyValueByName(config, i, "NAT") ;
		if (nat_str == NULL)
			nat = DEFAULT_AUKS_NAT_TRAVERSAL ;
		else if ( strncasecmp(nat_str,"yes",4) ==0 )
			nat = 1 ;
		else
			nat = 0 ;

		valid_block_nb++;

	}			/* EOF for */

	for (i = 0; i < block_nb; i++) {
		char *block_name;
		block_name = config_GetBlockName(config, i);

		/* skip non config blocks */
		if (strncmp("auksd", block_name, 5) != 0) {
			continue;
		}
		auks_log
		    ("initializing engine from 'auksd' block of file %s",
		     l_conf_file);

		/* primary server conf value */
		pktb = config_GetKeyValueByName(config,i,"PrimaryKeytab");
		if (pktb == NULL)
			pktb = DEFAULT_AUKSD_PRIMARY_KEYTAB;

		/* secondary server conf value */
		sktb = config_GetKeyValueByName(config,i,"SecondaryKeytab");
		if (sktb == NULL)
			sktb = DEFAULT_AUKSD_SECONDARY_KEYTAB;

		/* cache dir value */
		cdir = config_GetKeyValueByName(config,i,"CacheDir");
		if (cdir == NULL)
			cdir = DEFAULT_AUKSD_CACHEDIR;

		/* acl file value */
		afile = config_GetKeyValueByName(config,i,"ACLFile");
		if (afile == NULL)
			afile = DEFAULT_AUKSD_ACLFILE;

		/* read log file value */
		lfile = config_GetKeyValueByName(config,i,"LogFile");
		if (lfile == NULL)
			lfile = DEFAULT_AUKSD_LOGFILE;

		/* read log level value */
		ll_str = config_GetKeyValueByName(config,i,"LogLevel");
		if (ll_str == NULL)
			ll = DEFAULT_AUKSD_LOGLEVEL;
		else
			ll = strtol(ll_str, NULL, 10);
		if (ll == LONG_MIN || ll == LONG_MAX)
			ll = DEFAULT_AUKSD_LOGLEVEL;

		/* read debug file value */
		dfile = config_GetKeyValueByName(config,i,"DebugFile");
		if (dfile == NULL)
			dfile = DEFAULT_AUKSD_DEBUGFILE;

		/* read debug level value */
		dl_str = config_GetKeyValueByName(config,i,"DebugLevel");
		if (dl_str == NULL)
			dl = DEFAULT_AUKSD_DEBUGLEVEL;
		else
			dl = strtol(dl_str, NULL, 10);
		if (dl == LONG_MIN || dl == LONG_MAX)
			dl = DEFAULT_AUKSD_DEBUGLEVEL;

		/* read threads nb value */
		tnb_str =
		    config_GetKeyValueByName(config,i,"Workers");
		if (tnb_str == NULL)
			tnb = DEFAULT_AUKSD_THREADS_NB;
		else
			tnb = strtol(tnb_str, NULL, 10);
		if (tnb == LONG_MIN || tnb == LONG_MAX)
			tnb = DEFAULT_AUKSD_THREADS_NB;

		/* read queue size */
		qs_str = config_GetKeyValueByName(config,i,"QueueSize");
		if (qs_str == NULL)
			qs = DEFAULT_AUKSD_QUEUE_SIZE;
		else
			qs = strtol(qs_str, NULL, 10);
		if (qs == LONG_MIN || qs == LONG_MAX)
			qs = DEFAULT_AUKSD_QUEUE_SIZE;

		/* read repository size */
		rs_str = config_GetKeyValueByName(config,i,"RepoSize");
		if (rs_str == NULL)
			rs = DEFAULT_AUKSD_REPO_SIZE;
		else
			rs = strtol(rs_str, NULL, 10);
		if (rs == LONG_MIN || rs == LONG_MAX)
			rs = DEFAULT_AUKSD_REPO_SIZE;

		/* clean delay */
		rd_str =
		    config_GetKeyValueByName(config,i,"CleanDelay");
		if (rd_str == NULL)
			rd = DEFAULT_AUKSD_CLEAN_DELAY;
		else
			rd = strtol(rd_str, NULL, 10);
		if (rd == LONG_MIN || rd == LONG_MAX)
			rd = DEFAULT_AUKSD_CLEAN_DELAY;

		/* Kerberos Replay cache mode */
		krc_str =
			config_GetKeyValueByName(config, i, "ReplayCache") ;
		if (krc_str == NULL)
			krc = DEFAULT_AUKS_REPLAY_CACHE ;
		else if ( strncasecmp(krc_str,"yes",4) ==0 )
			krc = 1 ;
		else
			krc = 0 ;

		valid_block_nb++;

	}			/* EOF for */

	if ( valid_block_nb == 2 )
		fstatus = AUKS_SUCCESS;

	if ( fstatus == AUKS_SUCCESS ) {

		/* init auksd engine */
		fstatus = auksd_engine_init(engine,
					    phost,padd, pport, pprinc, pktb,
					    shost,sadd, sport, sprinc, sktb,
					    cdir, afile, lfile, ll, dfile,
					    dl, tnb, qs, rs, rd,nat,krc);
		
		/* init ok, break */
		if (fstatus == 0) {
			auks_log("initialization succeed");
		} else
			auks_error("initialization failed");

	}

parse_exit:
	/* free config file */
	config_Free(config);
exit:
	return fstatus;
}
Пример #2
0
int
auks_acl_init_from_config_file(auks_acl_t * p_acl, char *acl_file)
{
	int fstatus = AUKS_ERROR;

	config_file_t config;
	int block_nb;

	char *principal;
	char *host;

	char *role_string;
	enum AUKS_ACL_ROLE role;

	int i;

	/* conf parsing */
	config = config_ParseFile(acl_file);
	if (!config) {
		auks_error("unable to parse configuration file %s : %s",
			   acl_file, extern_errormsg);
		fstatus = AUKS_ERROR_ACL_PARSING;
		goto exit;
	}
	auks_log("configuration file (%s) successfully parsed", acl_file);

	/* block nb */
	block_nb = config_GetNbBlocks(config);
	if (block_nb <= 0) {
		auks_error("unable to get configuration blocks nb from "
			   "config file %s : %s", acl_file, extern_errormsg);
		fstatus = AUKS_ERROR_ACL_FILE_IS_EMPTY;
		goto parse_exit;
	}
	auks_log2("configuration blocks nb (%d) successfully extracted",
		 block_nb);

	/* acl init */
	if (auks_acl_init(p_acl, block_nb) != 0) {
		auks_error("unable to init Auks ACL structure");
		fstatus = AUKS_ERROR_ACL_INIT;
		goto parse_exit;
	}
	auks_log2("Auks ACL structure successfully initialized");
	
	/* block loop */
	fstatus = 0;
	for (i = 0; i < block_nb; i++) {
		char *block_name;
		block_name = config_GetBlockName(config, i);
		
		/* keep only rule block */
		if (strncmp("rule", block_name, 7) != 0)
			continue;

		role_string = config_GetKeyValueByName(config, i, "role");
		principal =
		    config_GetKeyValueByName(config, i, "principal");
		host = config_GetKeyValueByName(config, i, "host");
		if (role_string == NULL) {
			auks_error("no role defined in rule[%d] of %s", i,
			      acl_file);
			continue;
		}
		
		if (strncmp("user", role_string, 5) == 0) {
			role = AUKS_ACL_ROLE_USER;
		} else if (strncmp("admin", role_string, 6) == 0) {
			role = AUKS_ACL_ROLE_ADMIN;
		} else if (strncmp("guest", role_string, 5) == 0) {
			role = AUKS_ACL_ROLE_GUEST;
		} else {
			auks_error("invalid role for rule[%d]", i,
			      acl_file, extern_errormsg);
			fstatus++;
			continue;
		}

		if (auks_acl_add_rule(p_acl, principal, host, role)) {
			auks_error("unable to add rule[%d] to auks_acl", i);
			fstatus++;
		} else {
			auks_log("rule[%d] '%s:%s => %s' successfully add",
				 i, principal, host, role_string);
		}

	}			/* EOF block loop */

	/* clean acl if errors occured during creation */
	if (fstatus) {
		auks_acl_free_contents(p_acl);
		fstatus = AUKS_ERROR_ACL_FILE_IS_INVALID;
	}

parse_exit:
	/* free config file */
	config_Free(config);
exit:
	return fstatus;
}
Пример #3
0
static fsal_status_t load_FSAL_parameters_from_conf(config_file_t in_config,
        const char *fsal_name,
        fsal_init_info_t *
        init_info,
        fsal_extra_arg_parser_f
        extra)
{
    int err;
    int var_max, var_index;
    char *key_name;
    char *key_value;
    config_item_t fsal_block, block = NULL;
    int i, fsal_cnt;

    fsal_block = config_FindItemByName(in_config, CONF_LABEL_FSAL);
    if (fsal_block == NULL) {
        LogFatal(COMPONENT_INIT,
                 "Cannot find item \"%s\" in configuration",
                 CONF_LABEL_FSAL);
        return fsalstat(ERR_FSAL_NOENT, 0);
    }
    if (config_ItemType(fsal_block) != CONFIG_ITEM_BLOCK) {
        LogFatal(COMPONENT_INIT, "\"%s\" is not a block",
                 CONF_LABEL_FSAL);
        return fsalstat(ERR_FSAL_NOENT, 0);
    }
    fsal_cnt = config_GetNbItems(fsal_block);
    for (i = 0; i < fsal_cnt; i++) {
        block = config_GetItemByIndex(fsal_block, i);
        if (config_ItemType(block) == CONFIG_ITEM_BLOCK
                && strcasecmp(config_GetBlockName(block), fsal_name) == 0) {
            break;
        }
    }
    if (i == fsal_cnt) {
        LogFatal(COMPONENT_INIT,
                 "Cannot find the %s section of %s in the configuration file",
                 fsal_name, CONF_LABEL_FSAL);
        return fsalstat(ERR_FSAL_NOENT, 0);
    }
    if (config_ItemType(block) != CONFIG_ITEM_BLOCK) {
        LogCrit(COMPONENT_CONFIG,
                "FSAL LOAD PARAMETER: Item \"%s\" is expected to be a block",
                fsal_name);
        return fsalstat(ERR_FSAL_INVAL, 0);
    }

    /* read variable for fsal init */

    var_max = config_GetNbItems(block);

    for (var_index = 0; var_index < var_max; var_index++) {
        config_item_t item;

        item = config_GetItemByIndex(block, var_index);

        err = config_GetKeyValue(item, &key_name, &key_value);
        if (err) {
            LogCrit(COMPONENT_CONFIG,
                    "FSAL LOAD PARAMETER: ERROR reading key[%d] from section \"%s\" of configuration file.",
                    var_index, CONF_LABEL_FSAL);
            return fsalstat(ERR_FSAL_SERVERFAULT, err);
        }

        if (!STRCMP(key_name, "DebugLevel")
                || !STRCMP(key_name, "LogFile")) {
            LogWarn(COMPONENT_CONFIG,
                    "Deprecated FSAL option %s=\'%s\'", key_name,
                    key_value);
        } else if (!STRCMP(key_name, "Max_FS_calls")) {

            int maxcalls = s_read_int(key_value);

            if (maxcalls < 0) {
                LogCrit(COMPONENT_CONFIG,
                        "FSAL LOAD PARAMETER: ERROR: Unexpected value for %s: null or positive integer expected.",
                        key_name);
                return fsalstat(ERR_FSAL_INVAL, 0);
            }

        } else if (strcasecmp(key_name, "FSAL_Shared_Library") == 0) {
            continue;	/* scanned at load time */
        } else if ((extra == NULL)
                   ||
                   ((*extra)
                    (key_name, key_value, init_info, fsal_name))) {
            LogCrit(COMPONENT_CONFIG,
                    "FSAL LOAD PARAMETER: ERROR: Unknown or unsettable key: %s (item %s)",
                    key_name, CONF_LABEL_FSAL);
            return fsalstat(ERR_FSAL_INVAL, 0);
        }

    }

    return fsalstat(ERR_FSAL_NO_ERROR, 0);

}