2015-04-02 09:59:27 +08:00
|
|
|
/*
|
2015-04-16 05:10:08 +08:00
|
|
|
* Copyright (C) 2015 VMware, Inc. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* 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"
|
|
|
|
|
|
|
|
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,
|
2015-04-02 09:59:27 +08:00
|
|
|
char* pszFile,
|
2015-12-13 05:30:40 +08:00
|
|
|
char* pszGroup
|
2015-04-02 09:59:27 +08:00
|
|
|
)
|
|
|
|
{
|
|
|
|
uint32_t dwError = 0;
|
|
|
|
|
|
|
|
GKeyFile* pKeyFile = NULL;
|
|
|
|
char* pszValue = NULL;
|
|
|
|
|
|
|
|
PTDNF_CONF pConf = NULL;
|
|
|
|
|
2015-12-13 05:30:40 +08:00
|
|
|
if(!pTdnf ||
|
|
|
|
IsNullOrEmptyString(pszFile) ||
|
|
|
|
IsNullOrEmptyString(pszGroup))
|
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
2015-04-02 09:59:27 +08:00
|
|
|
pKeyFile = g_key_file_new();
|
|
|
|
if(!pKeyFile)
|
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_OUT_OF_MEMORY;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!g_key_file_load_from_file(
|
|
|
|
pKeyFile,
|
|
|
|
pszFile,
|
|
|
|
G_KEY_FILE_KEEP_COMMENTS,
|
|
|
|
NULL))
|
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_CONF_FILE_LOAD;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
if(g_key_file_has_group(pKeyFile, pszGroup))
|
|
|
|
{
|
|
|
|
dwError = TDNFAllocateMemory(
|
2015-12-19 04:28:49 +08:00
|
|
|
1,
|
2015-04-02 09:59:27 +08:00
|
|
|
sizeof(TDNF_CONF),
|
|
|
|
(void**)&pConf);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
if(g_key_file_has_key(pKeyFile, pszGroup, TDNF_CONF_KEY_GPGCHECK, NULL))
|
|
|
|
{
|
|
|
|
if(g_key_file_get_boolean(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroup,
|
|
|
|
TDNF_CONF_KEY_GPGCHECK,
|
|
|
|
NULL))
|
|
|
|
{
|
|
|
|
pConf->nGPGCheck=1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(g_key_file_has_key(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroup,
|
|
|
|
TDNF_CONF_KEY_INSTALLONLY_LIMIT,
|
|
|
|
NULL))
|
|
|
|
{
|
|
|
|
pConf->nInstallOnlyLimit = g_key_file_get_integer(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroup,
|
|
|
|
TDNF_CONF_KEY_INSTALLONLY_LIMIT,
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
if(g_key_file_has_key(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroup,
|
|
|
|
TDNF_CONF_KEY_CLEAN_REQ_ON_REMOVE,
|
|
|
|
NULL))
|
|
|
|
{
|
|
|
|
pConf->nCleanRequirementsOnRemove =
|
|
|
|
g_key_file_get_boolean(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroup,
|
|
|
|
TDNF_CONF_KEY_CLEAN_REQ_ON_REMOVE,
|
|
|
|
NULL);
|
|
|
|
}
|
2015-07-01 02:23:39 +08:00
|
|
|
if(g_key_file_has_key(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroup,
|
|
|
|
TDNF_CONF_KEY_KEEP_CACHE,
|
|
|
|
NULL))
|
|
|
|
{
|
|
|
|
pConf->nKeepCache =
|
|
|
|
g_key_file_get_boolean(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroup,
|
|
|
|
TDNF_CONF_KEY_KEEP_CACHE,
|
|
|
|
NULL);
|
|
|
|
}
|
2015-04-02 09:59:27 +08:00
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroup,
|
|
|
|
TDNF_CONF_KEY_REPODIR,
|
|
|
|
TDNF_DEFAULT_REPO_LOCATION,
|
|
|
|
&pConf->pszRepoDir);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroup,
|
|
|
|
TDNF_CONF_KEY_CACHEDIR,
|
|
|
|
TDNF_DEFAULT_CACHE_LOCATION,
|
|
|
|
&pConf->pszCacheDir);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
2015-06-10 07:30:09 +08:00
|
|
|
|
2015-12-13 05:30:40 +08:00
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroup,
|
|
|
|
TDNF_CONF_KEY_DISTROVERPKG,
|
|
|
|
TDNF_DEFAULT_DISTROVERPKG,
|
|
|
|
&pConf->pszDistroVerPkg);
|
|
|
|
if(dwError == ERROR_TDNF_NO_DATA)
|
|
|
|
{
|
|
|
|
dwError = TDNFAllocateString(
|
|
|
|
TDNF_DEFAULT_DISTROVERPKG,
|
|
|
|
&pConf->pszDistroVerPkg);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2015-06-10 07:30:09 +08:00
|
|
|
dwError = TDNFConfigReadProxySettings(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroup,
|
|
|
|
pConf);
|
|
|
|
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:
|
|
|
|
if(pKeyFile)
|
|
|
|
{
|
|
|
|
g_key_file_free(pKeyFile);
|
|
|
|
}
|
|
|
|
if(pszValue)
|
|
|
|
{
|
|
|
|
g_free(pszValue);
|
|
|
|
}
|
|
|
|
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;
|
|
|
|
|
|
|
|
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(
|
|
|
|
GKeyFile* pKeyFile,
|
|
|
|
char* pszGroup,
|
|
|
|
PTDNF_CONF pConf)
|
|
|
|
{
|
|
|
|
uint32_t dwError = 0;
|
|
|
|
char* pszProxyUser = NULL;
|
|
|
|
char* pszProxyPass = NULL;
|
|
|
|
|
|
|
|
if(!pKeyFile || !pszGroup || !pConf)
|
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
|
|
|
//optional proxy server
|
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroup,
|
|
|
|
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(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroup,
|
|
|
|
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(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroup,
|
|
|
|
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
|
|
|
uint32_t
|
|
|
|
TDNFReadKeyValue(
|
|
|
|
GKeyFile* pKeyFile,
|
|
|
|
char* pszGroupName,
|
|
|
|
char* pszKeyName,
|
|
|
|
char* pszDefault,
|
|
|
|
char** ppszValue
|
|
|
|
)
|
|
|
|
{
|
|
|
|
uint32_t dwError = 0;
|
|
|
|
char* pszVal = NULL;
|
|
|
|
char* pszValue = NULL;
|
|
|
|
|
|
|
|
if(!pKeyFile || !pszGroupName || !pszKeyName || !ppszValue)
|
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!g_key_file_has_key(pKeyFile, pszGroupName, pszKeyName, NULL))
|
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_NO_DATA;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
pszVal = g_key_file_get_string(
|
|
|
|
pKeyFile,
|
|
|
|
pszGroupName,
|
|
|
|
pszKeyName,
|
|
|
|
NULL);
|
|
|
|
if(!pszVal && pszDefault)
|
|
|
|
{
|
|
|
|
pszVal = g_strdup(pszDefault);
|
|
|
|
if(!pszVal)
|
|
|
|
{
|
2015-12-13 05:30:40 +08:00
|
|
|
dwError = ERROR_TDNF_OUT_OF_MEMORY;
|
2015-04-02 09:59:27 +08:00
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(!pszVal)
|
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_NO_DATA;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
|
|
|
dwError = TDNFAllocateString(
|
|
|
|
pszVal,
|
|
|
|
&pszValue);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
*ppszValue = pszValue;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
g_free(pszVal);
|
|
|
|
return dwError;
|
|
|
|
|
|
|
|
error:
|
|
|
|
if(ppszValue)
|
|
|
|
{
|
|
|
|
*ppszValue = NULL;
|
|
|
|
}
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pszValue);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
TDNFFreeConfig(
|
|
|
|
PTDNF_CONF pConf
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if(pConf)
|
|
|
|
{
|
2015-06-10 07:30:09 +08:00
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf->pszProxy);
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf->pszProxyUserPass);
|
2015-04-02 09:59:27 +08:00
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf->pszRepoDir);
|
2015-06-01 05:51:16 +08:00
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf->pszCacheDir);
|
2015-12-13 05:30:40 +08:00
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf->pszDistroVerPkg);
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf->pszVarReleaseVer);
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf->pszVarBaseArch);
|
2015-04-02 09:59:27 +08:00
|
|
|
TDNF_SAFE_FREE_MEMORY(pConf);
|
|
|
|
}
|
|
|
|
}
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
//fill variable values such as release and basearch
|
|
|
|
//if required
|
|
|
|
if(strstr(*ppszString, TDNF_VAR_RELEASEVER) ||
|
|
|
|
strstr(*ppszString, TDNF_VAR_BASEARCH))
|
|
|
|
{
|
|
|
|
dwError = TDNFConfigExpandVars(pTdnf);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
pConf = pTdnf->pConf;
|
|
|
|
dwError = TDNFReplaceString(
|
|
|
|
*ppszString,
|
|
|
|
TDNF_VAR_RELEASEVER,
|
|
|
|
pConf->pszVarReleaseVer,
|
|
|
|
&pszReplacedTemp);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFReplaceString(
|
|
|
|
pszReplacedTemp,
|
|
|
|
TDNF_VAR_BASEARCH,
|
|
|
|
pConf->pszVarBaseArch,
|
|
|
|
&pszDst);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
TDNFFreeMemory(*ppszString);
|
|
|
|
*ppszString = pszDst;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pszReplacedTemp);
|
|
|
|
return dwError;
|
|
|
|
|
|
|
|
error:
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pszDst);
|
|
|
|
goto cleanup;
|
|
|
|
}
|