2015-04-02 09:59:27 +08:00
|
|
|
/*
|
2020-01-29 09:30:07 +08:00
|
|
|
* Copyright (C) 2015-2020 VMware, Inc. All Rights Reserved.
|
2015-04-16 05:10:08 +08:00
|
|
|
*
|
|
|
|
* Licensed under the GNU Lesser General Public License v2.1 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License. The terms
|
|
|
|
* of the License are located in the COPYING file of this distribution.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Module : config.c
|
|
|
|
*
|
|
|
|
* Abstract :
|
|
|
|
*
|
|
|
|
* tdnfclientlib
|
|
|
|
*
|
|
|
|
* client library
|
|
|
|
*
|
|
|
|
* Authors : Priyesh Padmavilasom (ppadmavilasom@vmware.com)
|
|
|
|
*/
|
|
|
|
|
2015-04-02 09:59:27 +08:00
|
|
|
#include "includes.h"
|
|
|
|
|
2020-01-22 09:51:54 +08:00
|
|
|
static
|
|
|
|
uint32_t
|
|
|
|
_TDNFConfigReadPluginSettings(
|
|
|
|
PCONF_SECTION pSection,
|
|
|
|
PTDNF pTdnf
|
|
|
|
);
|
|
|
|
|
2015-04-02 09:59:27 +08:00
|
|
|
int
|
|
|
|
TDNFConfGetRpmVerbosity(
|
|
|
|
PTDNF pTdnf
|
|
|
|
)
|
|
|
|
{
|
|
|
|
rpmlogLvl nLogLevel = RPMLOG_INFO;
|
|
|
|
if(pTdnf)
|
|
|
|
{
|
|
|
|
nLogLevel = pTdnf->pArgs->nRpmVerbosity;
|
|
|
|
}
|
|
|
|
return nLogLevel;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t
|
|
|
|
TDNFReadConfig(
|
2015-12-13 05:30:40 +08:00
|
|
|
PTDNF pTdnf,
|
2016-11-30 02:41:51 +08:00
|
|
|
const char* pszConfFile,
|
|
|
|
const char* pszGroup
|
2015-04-02 09:59:27 +08:00
|
|
|
)
|
|
|
|
{
|
|
|
|
uint32_t dwError = 0;
|
|
|
|
PTDNF_CONF pConf = NULL;
|
2016-11-30 02:41:51 +08:00
|
|
|
PCONF_DATA pData = NULL;
|
|
|
|
PCONF_SECTION pSection = NULL;
|
2015-04-02 09:59:27 +08:00
|
|
|
|
2015-12-13 05:30:40 +08:00
|
|
|
if(!pTdnf ||
|
2016-11-30 02:41:51 +08:00
|
|
|
IsNullOrEmptyString(pszConfFile) ||
|
2015-12-13 05:30:40 +08:00
|
|
|
IsNullOrEmptyString(pszGroup))
|
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFReadConfigFile(pszConfFile, 0, &pData);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
2015-04-02 09:59:27 +08:00
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFAllocateMemory(
|
|
|
|
1,
|
|
|
|
sizeof(TDNF_CONF),
|
|
|
|
(void**)&pConf);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
2015-04-02 09:59:27 +08:00
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFConfigGetSection(pData, pszGroup, &pSection);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
2015-04-02 09:59:27 +08:00
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFReadKeyValueInt(
|
|
|
|
pSection,
|
|
|
|
TDNF_CONF_KEY_INSTALLONLY_LIMIT,
|
|
|
|
1,
|
|
|
|
&pConf->nInstallOnlyLimit);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
2015-06-10 07:30:09 +08:00
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFReadKeyValueBoolean(
|
|
|
|
pSection,
|
|
|
|
TDNF_CONF_KEY_CLEAN_REQ_ON_REMOVE,
|
|
|
|
0,
|
|
|
|
&pConf->nCleanRequirementsOnRemove);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
2015-12-13 05:30:40 +08:00
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFReadKeyValueBoolean(
|
|
|
|
pSection,
|
|
|
|
TDNF_CONF_KEY_GPGCHECK,
|
|
|
|
0,
|
|
|
|
&pConf->nGPGCheck);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFReadKeyValueBoolean(
|
|
|
|
pSection,
|
|
|
|
TDNF_CONF_KEY_KEEP_CACHE,
|
|
|
|
0,
|
|
|
|
&pConf->nKeepCache);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pSection,
|
|
|
|
TDNF_CONF_KEY_REPODIR,
|
|
|
|
TDNF_DEFAULT_REPO_LOCATION,
|
|
|
|
&pConf->pszRepoDir);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pSection,
|
|
|
|
TDNF_CONF_KEY_CACHEDIR,
|
|
|
|
TDNF_DEFAULT_CACHE_LOCATION,
|
|
|
|
&pConf->pszCacheDir);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pSection,
|
|
|
|
TDNF_CONF_KEY_DISTROVERPKG,
|
|
|
|
TDNF_DEFAULT_DISTROVERPKG,
|
|
|
|
&pConf->pszDistroVerPkg);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2020-08-14 18:14:33 +08:00
|
|
|
dwError = TDNFReadKeyValueStringArray(
|
|
|
|
pSection,
|
|
|
|
TDNF_CONF_KEY_EXCLUDE,
|
|
|
|
&pConf->ppszExcludes);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFConfigReadProxySettings(
|
|
|
|
pSection,
|
|
|
|
pConf);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
2015-06-10 07:30:09 +08:00
|
|
|
|
2020-01-22 09:51:54 +08:00
|
|
|
dwError = _TDNFConfigReadPluginSettings(
|
|
|
|
pSection,
|
|
|
|
pTdnf);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
2015-04-02 09:59:27 +08:00
|
|
|
|
2015-12-13 05:30:40 +08:00
|
|
|
pTdnf->pConf = pConf;
|
2015-04-02 09:59:27 +08:00
|
|
|
|
|
|
|
cleanup:
|
2016-11-30 02:41:51 +08:00
|
|
|
if(pData)
|
2015-04-02 09:59:27 +08:00
|
|
|
{
|
2016-11-30 02:41:51 +08:00
|
|
|
TDNFFreeConfigData(pData);
|
2015-04-02 09:59:27 +08:00
|
|
|
}
|
|
|
|
return dwError;
|
|
|
|
|
|
|
|
error:
|
2015-12-13 05:30:40 +08:00
|
|
|
if(pTdnf)
|
2015-04-02 09:59:27 +08:00
|
|
|
{
|
2015-12-13 05:30:40 +08:00
|
|
|
pTdnf->pConf = NULL;
|
2015-04-02 09:59:27 +08:00
|
|
|
}
|
|
|
|
if(pConf)
|
|
|
|
{
|
|
|
|
TDNFFreeConfig(pConf);
|
|
|
|
}
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2015-12-13 05:30:40 +08:00
|
|
|
uint32_t
|
|
|
|
TDNFConfigExpandVars(
|
|
|
|
PTDNF pTdnf
|
|
|
|
)
|
|
|
|
{
|
|
|
|
uint32_t dwError = 0;
|
|
|
|
PTDNF_CONF pConf = NULL;
|
|
|
|
|
|
|
|
if(!pTdnf || !pTdnf->pConf)
|
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
pConf = pTdnf->pConf;
|
|
|
|
|
2016-03-17 09:12:07 +08:00
|
|
|
//Allow --releasever overrides
|
|
|
|
if(!pConf->pszVarReleaseVer &&
|
|
|
|
!IsNullOrEmptyString(pTdnf->pArgs->pszReleaseVer))
|
|
|
|
{
|
|
|
|
dwError = TDNFAllocateString(pTdnf->pArgs->pszReleaseVer,
|
|
|
|
&pConf->pszVarReleaseVer);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
2015-12-13 05:30:40 +08:00
|
|
|
if(!pConf->pszVarReleaseVer &&
|
|
|
|
!IsNullOrEmptyString(pConf->pszDistroVerPkg))
|
|
|
|
{
|
|
|
|
dwError = TDNFRawGetPackageVersion(
|
|
|
|
pTdnf->pArgs->pszInstallRoot,
|
|
|
|
pConf->pszDistroVerPkg,
|
|
|
|
&pConf->pszVarReleaseVer);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!pConf->pszVarBaseArch)
|
|
|
|
{
|
|
|
|
dwError = TDNFGetKernelArch(&pConf->pszVarBaseArch);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
cleanup:
|
|
|
|
return dwError;
|
|
|
|
|
|
|
|
error:
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2015-06-10 07:30:09 +08:00
|
|
|
uint32_t
|
|
|
|
TDNFConfigReadProxySettings(
|
2016-11-30 02:41:51 +08:00
|
|
|
PCONF_SECTION pSection,
|
2015-06-10 07:30:09 +08:00
|
|
|
PTDNF_CONF pConf)
|
|
|
|
{
|
|
|
|
uint32_t dwError = 0;
|
|
|
|
char* pszProxyUser = NULL;
|
|
|
|
char* pszProxyPass = NULL;
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
if(!pSection || !pConf)
|
2015-06-10 07:30:09 +08:00
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
|
|
|
//optional proxy server
|
|
|
|
dwError = TDNFReadKeyValue(
|
2016-11-30 02:41:51 +08:00
|
|
|
pSection,
|
2015-06-10 07:30:09 +08:00
|
|
|
TDNF_CONF_KEY_PROXY,
|
|
|
|
NULL,
|
|
|
|
&pConf->pszProxy);
|
|
|
|
if(dwError == ERROR_TDNF_NO_DATA)
|
|
|
|
{
|
|
|
|
dwError = 0;
|
|
|
|
}
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
if(!IsNullOrEmptyString(pConf->pszProxy))
|
|
|
|
{
|
|
|
|
//optional proxy user
|
|
|
|
dwError = TDNFReadKeyValue(
|
2016-11-30 02:41:51 +08:00
|
|
|
pSection,
|
2015-06-10 07:30:09 +08:00
|
|
|
TDNF_CONF_KEY_PROXY_USER,
|
|
|
|
NULL,
|
|
|
|
&pszProxyUser);
|
|
|
|
if(dwError == ERROR_TDNF_NO_DATA)
|
|
|
|
{
|
|
|
|
dwError = 0;
|
|
|
|
}
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
//optional proxy pass
|
|
|
|
dwError = TDNFReadKeyValue(
|
2016-11-30 02:41:51 +08:00
|
|
|
pSection,
|
2015-06-10 07:30:09 +08:00
|
|
|
TDNF_CONF_KEY_PROXY_PASS,
|
|
|
|
NULL,
|
|
|
|
&pszProxyPass);
|
|
|
|
if(dwError == ERROR_TDNF_NO_DATA)
|
|
|
|
{
|
|
|
|
dwError = 0;
|
|
|
|
}
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
if(!IsNullOrEmptyString(pszProxyUser) &&
|
|
|
|
!IsNullOrEmptyString(pszProxyPass))
|
|
|
|
{
|
|
|
|
dwError = TDNFAllocateStringPrintf(
|
|
|
|
&pConf->pszProxyUserPass,
|
|
|
|
"%s:%s",
|
|
|
|
pszProxyUser,
|
|
|
|
pszProxyPass);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
cleanup:
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pszProxyUser);
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pszProxyPass);
|
|
|
|
return dwError;
|
|
|
|
|
|
|
|
error:
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2015-04-02 09:59:27 +08:00
|
|
|
void
|
|
|
|
TDNFFreeConfig(
|
|
|
|
PTDNF_CONF pConf
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if(pConf)
|
|
|
|
{
|
2017-05-16 08:32:45 +08:00
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf->pszProxy);
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf->pszProxyUserPass);
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf->pszRepoDir);
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf->pszCacheDir);
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf->pszDistroVerPkg);
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf->pszVarReleaseVer);
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf->pszVarBaseArch);
|
2019-10-08 14:53:42 +08:00
|
|
|
TDNFFreeMemory(pConf);
|
2015-04-02 09:59:27 +08:00
|
|
|
}
|
|
|
|
}
|
2015-12-13 05:30:40 +08:00
|
|
|
|
|
|
|
uint32_t
|
|
|
|
TDNFConfigReplaceVars(
|
|
|
|
PTDNF pTdnf,
|
|
|
|
char** ppszString
|
|
|
|
)
|
|
|
|
{
|
|
|
|
uint32_t dwError = 0;
|
|
|
|
char* pszDst = NULL;
|
|
|
|
char* pszReplacedTemp = NULL;
|
|
|
|
PTDNF_CONF pConf = NULL;
|
|
|
|
|
|
|
|
if(!pTdnf || !ppszString || IsNullOrEmptyString(*ppszString))
|
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
2021-01-14 06:28:28 +08:00
|
|
|
dwError = TDNFConfigExpandVars(pTdnf);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
/* fill variable values such as release and basearch
|
|
|
|
if required */
|
2015-12-13 05:30:40 +08:00
|
|
|
if(strstr(*ppszString, TDNF_VAR_RELEASEVER) ||
|
|
|
|
strstr(*ppszString, TDNF_VAR_BASEARCH))
|
|
|
|
{
|
2021-01-14 06:28:28 +08:00
|
|
|
pConf = pTdnf->pConf;
|
|
|
|
dwError = TDNFReplaceString(
|
|
|
|
*ppszString,
|
|
|
|
TDNF_VAR_RELEASEVER,
|
|
|
|
pConf->pszVarReleaseVer,
|
|
|
|
&pszReplacedTemp);
|
2015-12-13 05:30:40 +08:00
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2021-01-14 06:28:28 +08:00
|
|
|
dwError = TDNFReplaceString(
|
|
|
|
pszReplacedTemp,
|
|
|
|
TDNF_VAR_BASEARCH,
|
|
|
|
pConf->pszVarBaseArch,
|
|
|
|
&pszDst);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
2015-12-13 05:30:40 +08:00
|
|
|
|
2021-01-14 06:28:28 +08:00
|
|
|
TDNFFreeMemory(*ppszString);
|
|
|
|
*ppszString = pszDst;
|
|
|
|
}
|
2015-12-13 05:30:40 +08:00
|
|
|
cleanup:
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pszReplacedTemp);
|
|
|
|
return dwError;
|
|
|
|
|
|
|
|
error:
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pszDst);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
2020-01-22 09:51:54 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Read the following settings from tdnf.conf
|
|
|
|
* plugins - 0/1. 0 = no plugins. default is 0
|
|
|
|
* pluginpath - path to look for plugin libraries. default /usr/lib/tdnf-plugins
|
|
|
|
* pluginconfpath - path to look for plugin config files. default /etc/tdnf/pluginconf.d
|
|
|
|
*/
|
|
|
|
static
|
|
|
|
uint32_t
|
|
|
|
_TDNFConfigReadPluginSettings(
|
|
|
|
PCONF_SECTION pSection,
|
|
|
|
PTDNF pTdnf
|
|
|
|
)
|
|
|
|
{
|
|
|
|
uint32_t dwError = 0;
|
|
|
|
char *pszValue = NULL;
|
|
|
|
int nPlugins = 0;
|
|
|
|
|
|
|
|
if(!pSection || !pTdnf)
|
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if there is a command line override to disable plugins, exit early */
|
|
|
|
dwError = TDNFHasOpt(pTdnf->pArgs, TDNF_CONF_KEY_NO_PLUGINS, &nPlugins);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
if (nPlugins)
|
|
|
|
{
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* plugins option to enable or disable plugins. default 0 */
|
|
|
|
dwError = TDNFReadKeyValueInt(
|
|
|
|
pSection,
|
|
|
|
TDNF_CONF_KEY_PLUGINS,
|
|
|
|
TDNF_DEFAULT_PLUGINS_ENABLED,
|
|
|
|
&nPlugins);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* config file having a plugins=0 setting is the same as
|
|
|
|
* --noplugins from cmd line
|
|
|
|
*/
|
|
|
|
if (nPlugins == 0)
|
|
|
|
{
|
|
|
|
dwError = TDNFSetOpt(
|
|
|
|
pTdnf->pArgs,
|
|
|
|
TDNF_CONF_KEY_NO_PLUGINS, "1");
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
/* no further reads required */
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* plugin conf path - default to /etc/tdnf/pluginconf.d */
|
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pSection,
|
|
|
|
TDNF_CONF_KEY_PLUGIN_CONF_PATH,
|
|
|
|
TDNF_DEFAULT_PLUGIN_CONF_PATH,
|
|
|
|
&pszValue);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFSetOpt(pTdnf->pArgs, TDNF_CONF_KEY_PLUGIN_CONF_PATH, pszValue);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
TDNFFreeMemory(pszValue);
|
|
|
|
pszValue = NULL;
|
|
|
|
|
|
|
|
/* plugin path - default to /usr/lib/tdnf-plugins */
|
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pSection,
|
|
|
|
TDNF_CONF_KEY_PLUGIN_PATH,
|
|
|
|
TDNF_DEFAULT_PLUGIN_PATH,
|
|
|
|
&pszValue);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFSetOpt(pTdnf->pArgs, TDNF_CONF_KEY_PLUGIN_PATH, pszValue);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pszValue);
|
|
|
|
return dwError;
|
|
|
|
|
|
|
|
error:
|
|
|
|
goto cleanup;
|
|
|
|
}
|