示例#1
0
文件: coam.cpp 项目: isub/coam
int LoadConf (const char *p_pszConfDir) {
	int iRetVal = 0;
	std::string strConfDir;
	std::string strConfFile;

	do {
		strConfDir = p_pszConfDir;
		if ('/' != strConfDir[strConfDir.length() - 1]) {
			strConfDir += '/';
		}
		strConfFile = strConfDir + "coam.conf";
		iRetVal = g_coConf.LoadConf (strConfFile.c_str());
		if (iRetVal) { iRetVal = -1; break; }

		std::vector<std::string> vectValList;
		std::vector<std::string>::iterator iterValList;
		CConfig *pcoTmp;

		g_coConf.GetParamValue ("location", vectValList);
		for (iterValList = vectValList.begin(); iterValList != vectValList.end(); ++iterValList) {
			strConfFile = strConfDir + *iterValList;
			pcoTmp = new CConfig;
			iRetVal = pcoTmp->LoadConf (strConfFile.c_str());
			if (iRetVal) { iRetVal = -1; break; }
			g_mapLocationConf.insert (std::make_pair (std::string(*iterValList), pcoTmp));
		}
		if (iRetVal) { break; }
	} while (0);

	return iRetVal;
}
示例#2
0
文件: coam.cpp 项目: isub/coam
void ChangeOSUser ()
{
	int iFnRes;
	const char *pszUser, *pszGroup;
	passwd *psoPswd;
	group *psoGroup;
	gid_t idUser, idGroup;
	std::string strVal;

	// изменяем id пользователя ОС
	iFnRes = g_coConf.GetParamValue ("os_user", strVal);
	if (0 == iFnRes) {
		pszUser = strVal.c_str();
		psoPswd = getpwnam (pszUser);
		if (psoPswd) {
			idUser = psoPswd->pw_uid;
		} else {
			idUser = (gid_t)-1;
		}
	}

	strVal.clear();
	iFnRes = g_coConf.GetParamValue ("os_group", strVal);
	if (0 == iFnRes) {
		pszGroup = strVal.c_str();
		psoGroup = getgrnam (pszGroup);
		if (psoGroup) {
			idGroup = psoGroup->gr_gid;
		} else {
			idGroup = (gid_t)-1;
		}
	}
	g_coLog.SetUGIds (idUser, idGroup);
	if ((gid_t)-1 != idUser) {
		setuid (idUser);
	}
	if ((gid_t)-1 != idGroup) {
		setgid (idGroup);
	}
}
示例#3
0
文件: coam.cpp 项目: isub/coam
bool Filter(const char *p_pszFilterName, std::string &p_strLocation, std::string &p_strValue)
{
	bool bRetVal = false;
	int iFnRes;
	std::map<std::string,CConfig*>::iterator iterLocation;
	std::vector<std::string> vectValList;
	std::vector<std::string>::iterator iterValList;
	CConfig *pcoLocConf;
	int iValueLen = p_strValue.length();

	do {
		// ищем конфигурацию локации
		iterLocation = g_mapLocationConf.find (p_strLocation);
		if (iterLocation == g_mapLocationConf.end()) {
			UTL_LOG_E(g_coLog, "Location '%s' configuration not found", p_strLocation.c_str());
			bRetVal = true;
			break;
		}
		pcoLocConf = iterLocation->second;
		if (NULL == pcoLocConf) {
			UTL_LOG_E(g_coLog, "Location '%s' configuration not exists", p_strLocation.c_str());
			bRetVal = true;
			break;
		}
		/* выбираем фильтры для локации */
		if (0 != pcoLocConf->GetParamValue (p_pszFilterName, vectValList)) {
			bRetVal = true;
			break;
		}
		// обходим все правила изменения имен сервисов
		for (iterValList = vectValList.begin(); iterValList != vectValList.end(); ++iterValList) {
			// если длина значения больше или равна длине значения фильтра
			if (static_cast<size_t>(iValueLen) >= iterValList->length()) {
				// сравниваем префикс с началом имени сервиса
				iFnRes = p_strValue.compare( 0, iterValList->length(), *iterValList );
				// если перфикс и начало имени сервиса совпадают
				if (0 == iFnRes) {
					bRetVal = true;
					UTL_LOG_N( g_coLog, "value %s matched to filter %s", p_strValue.c_str(), iterValList->c_str() );
					break;
				} else {
					UTL_LOG_N( g_coLog, "value %s NOT matched to filter %s(length: %u)", p_strValue.c_str(), iterValList->c_str(), iterValList->length() );
				}
			}
		}
	} while (0);

	return bRetVal;
}
示例#4
0
文件: coam.cpp 项目: isub/coam
int ModifyName(
	const char *p_pszModifyRule,
	std::string &p_strLocation,
	std::string &p_strValue)
{
	int iRetVal = 0;
	std::map<std::string,CConfig*>::iterator iterLocation;
	std::vector<std::string> vectValList;
	std::vector<std::string>::iterator iterValList;
	CConfig *pcoLocConf;

	do {
		iterLocation = g_mapLocationConf.find (p_strLocation);
		if (iterLocation == g_mapLocationConf.end()) {
			UTL_LOG_E(g_coLog, "Location '%s' configuration not found", p_strLocation.c_str());
			iRetVal = -1;
			break;
		}
		pcoLocConf = iterLocation->second;
		if (NULL == pcoLocConf) {
			UTL_LOG_E(g_coLog, "location '%s' configuration not exists", p_strLocation.c_str());
			iRetVal = -2;
			break;
		}
		iRetVal = pcoLocConf->GetParamValue (p_pszModifyRule, vectValList);
		if (iRetVal) {
			break;
		}
		// выбираем первое правило
		iterValList = vectValList.begin();
		// обходим все правила изменения имен сервисов
		while (iterValList != vectValList.end()) {
			UTL_LOG_N( g_coLog, "rule: %s; location: %s; value: %s", p_pszModifyRule, p_strLocation.c_str(), p_strValue.c_str() );
			if( ModifyValue( *iterValList, p_strValue ) ) {
				UTL_LOG_N( g_coLog, "modified value: rule: %s; location: %s; value: %s", p_pszModifyRule, p_strLocation.c_str(), p_strValue.c_str() );
				break;
			}
			++iterValList;
		}
	} while (0);

	return iRetVal;
}
示例#5
0
文件: coam.cpp 项目: isub/coam
int ActivateService (
	const SSessionInfo *p_pcsoSessInfo,
	const char *p_pcszServiceInfo,
	const char *p_pcszAttr,
	CIPConnector *p_pcoIPConn)
{
	int iRetVal = 0;
	char mcPack[0x10000];
	__uint16_t ui16PackLen;
	__uint16_t ui16ValueLen;
	CPSPacket coPSPack;
	SPSRequest *psoReq;

	do {
		psoReq = (SPSRequest*)mcPack;

		// ищем конфигурацию локации
		std::map<std::string,CConfig*>::iterator iterLocConf;
		CConfig *pcoLocConf;
		iterLocConf = g_mapLocationConf.find (p_pcsoSessInfo->m_strLocation);
		// если конфигурация локации не найдена
		if (iterLocConf == g_mapLocationConf.end()) {
			UTL_LOG_E(g_coLog, "Location '%s' configuration not found", p_pcsoSessInfo->m_strLocation.c_str());
			iRetVal = -1;
			break;
		}
		pcoLocConf = iterLocConf->second;

		iRetVal = SetCommonCoASensorAttr (psoReq, sizeof (mcPack), p_pcsoSessInfo, pcoLocConf, p_pcoIPConn);
		if (iRetVal) {
			break;
		}

		// добавляем атрибут PS_COMMAND
		const char *pcszConfParamName;
		char mcCommand[0x400];
		std::string strCmd;
		std::string strUserAttrName;

		pcszConfParamName = "activation";
		// запрашиваем значение конфигурационного параметра
		iRetVal = pcoLocConf->GetParamValue (pcszConfParamName, strCmd);
		// если параметр не найден
		if (iRetVal) {
			UTL_LOG_E(g_coLog, "Config parameter '%s' not found", pcszConfParamName);
			break;
		}
		// или его значение не задано
		if (0 == strCmd.length()) {
			UTL_LOG_E(g_coLog, "Config parameter '%s' not defined", pcszConfParamName);
			iRetVal = -1;
			break;
		}
		// запрашиваем значение конфигурационного параметра
		pcszConfParamName = "use_policy_attr_name";
		iRetVal = pcoLocConf->GetParamValue (pcszConfParamName, strUserAttrName);
		// если параметр не найден
		if (iRetVal) {
			UTL_LOG_E(g_coLog, "Config parameter '%s' not found", pcszConfParamName);
			break;
		}
		if (0 == strUserAttrName.compare ("yes") && NULL != p_pcszAttr) {
			ui16ValueLen = snprintf (mcCommand, sizeof(mcCommand), "%s=%s=%s", strCmd.c_str(), p_pcszAttr, p_pcszServiceInfo);
		} else {
			ui16ValueLen = snprintf (mcCommand, sizeof(mcCommand), "%s=%s", strCmd.c_str(), p_pcszServiceInfo);
		}
		if (ui16ValueLen > sizeof(mcCommand) - 1) {
			UTL_LOG_E(g_coLog, "buffer 'mcCommand' too small to store value: needed size is: '%u'", ui16ValueLen);
			iRetVal = -1;
			break;
		}
		ui16PackLen = coPSPack.AddAttr(psoReq, sizeof(mcPack), PS_COMMAND, mcCommand, ui16ValueLen, 0);

		iRetVal = p_pcoIPConn->Send (mcPack, ui16PackLen);
		if (iRetVal) {
			UTL_LOG_E(g_coLog, "'p_pcoIPConn->Send': error code: '%d'", iRetVal);
			break;
		}

		iRetVal = p_pcoIPConn->Recv (mcPack, sizeof(mcPack));
		if (0 == iRetVal) {
			UTL_LOG_E(g_coLog, "connection is closed");
			iRetVal = -1;
			break;
		}
		if (0 > iRetVal) {
			UTL_LOG_E(g_coLog, "'p_pcoIPConn->Recv': error code: '%d'", iRetVal);
			break;
		}
		iRetVal = ParsePSPack ((SPSRequest*)mcPack, iRetVal);
	} while (0);

	switch (iRetVal) {
	case 0:
	case -45:
		UTL_LOG_N(
			g_coLog,
			"UserName: '******'; NASIPAddress: '%s'; SessionID: '%s'; Policy '%s' activated; result code: '%d'",
			p_pcsoSessInfo->m_strUserName.c_str(),
			p_pcsoSessInfo->m_strNASIPAddress.c_str(),
			p_pcsoSessInfo->m_strSessionId.c_str(),
			p_pcszServiceInfo,
			iRetVal);
		iRetVal = 0;
		break;
	default:
		break;
	}

	return iRetVal;
}
示例#6
0
文件: coam.cpp 项目: isub/coam
int InitCoAManager ()
{
	int iRetVal = 0;

	do {
		std::vector<std::string> vectConfParam;
		std::string strConfParam;

		iRetVal = g_coConf.GetParamValue ("log_file_mask", strConfParam);
		if (iRetVal) {
			UTL_LOG_F(g_coLog, "Log file mask not defined");
			break;
		}
		/* инициализация логгера */
		iRetVal = g_coLog.Init (strConfParam.c_str());
		if (iRetVal) {
			UTL_LOG_F(g_coLog, "can not initialize log writer: code: '%d'", iRetVal);
			break;
		}
		/* изменение пользователя и группы владельца демона */
		ChangeOSUser ();

		std::string strDBPoolSize;
		int iDBPoolSize;
		int iFnRes;

		const char *pcszConfParam = "db_pool_size";
		iFnRes = g_coConf.GetParamValue( pcszConfParam, strDBPoolSize );
		if( iFnRes || 0 == strDBPoolSize.length() ) {
			UTL_LOG_F( g_coLog, "dbpool: configuration parameter '%s' not defined", pcszConfParam );
		} else {
			iDBPoolSize = atoi( strDBPoolSize.c_str() );
		}

		std::string strDBUser, strDBPswd, strDBDescr;

		pcszConfParam = "db_user";
		iFnRes = g_coConf.GetParamValue( pcszConfParam, strDBUser );
		if( iFnRes || 0 == strDBUser.length() ) {
			UTL_LOG_F( g_coLog, "dbpool: configuration parameter '%s' not defined", pcszConfParam );
		}

		/* запрашиваем пароль пользователя БД из конфигурации */
		pcszConfParam = "db_pswd";
		iFnRes = g_coConf.GetParamValue( pcszConfParam, strDBPswd );
		if( iFnRes || 0 == strDBPswd.length() ) {
			UTL_LOG_F( g_coLog, "dbpool: configuration parameter '%s' not defined", pcszConfParam );
		}

		/* запрашиваем дескриптор БД из конфигурации */
		pcszConfParam = "db_descr";
		iFnRes = g_coConf.GetParamValue( pcszConfParam, strDBDescr );
		if( iFnRes || 0 == strDBDescr.length() ) {
			UTL_LOG_F( g_coLog, "dbpool: configuration parameter '%s' not defined", pcszConfParam );
		}

		/* инициализация пула подклчений к БД */
		iRetVal = db_pool_init(&g_coLog, strDBUser, strDBPswd, strDBDescr, iDBPoolSize );
		if (iRetVal) {
			UTL_LOG_F(g_coLog, "can not initialize DB pool");
		}
		/* создание списка NASов */
		iRetVal = CreateNASList (&g_mapNASList);
		if (iRetVal) {
			break;
		}
		/* инициализация пула потоков */
		iRetVal = InitThreadPool ();
		if (iRetVal) {
			break;
		}
	} while (0);

	return iRetVal;
}
示例#7
0
文件: coam.cpp 项目: isub/coam
int ConnectCoASensor (CIPConnector &p_coIPConn) {
	int iRetVal = 0;
	std::vector<std::string> vectValList;
	const char *pcszConfParam;	// значение параметра из конфигурации
	const char *pcszHostName;	// имя удаленного хоста
	uint16_t ui16Port;			// порт удаленного хоста
	int iProtoType;				// тип протокола взаимодействия с удаленным хостом
	int iFnRes;

	do {
		// выбираем сведения о сетевом протоколе
		pcszConfParam = "coa_sensor_proto";
		iRetVal = g_coConf.GetParamValue (pcszConfParam, vectValList);
		if (iRetVal) {
			iRetVal = -1;
			UTL_LOG_F(g_coLog, "configuration parameter '%s' not found",
				pcszConfParam);
			break;
		}
		if (0 == stricmp ("TCP", vectValList[0].c_str())) {
			iProtoType = IPPROTO_TCP;
		} else if (0 == stricmp ("UDP", vectValList[0].c_str())) {
			iProtoType = IPPROTO_UDP;
		} else {
			iRetVal = -1;
			UTL_LOG_F(
				g_coLog,
				"configuration parameter '%s' containts unsuppurted value '%s'",
				pcszConfParam,
				vectValList[0].c_str());
			break;
		}
		// выбираем имя хоста CoA-сенсора
		vectValList.clear();
		pcszConfParam = "coa_sensor_addr";
		iRetVal = g_coConf.GetParamValue (pcszConfParam, vectValList);
		if (iRetVal) {
			UTL_LOG_F(
				g_coLog,
				"configuration parameter '%s' not found",
				pcszConfParam);
			break;
		}
		pcszHostName = vectValList[0].c_str();
		// выбираем порт CoASensor-а
		vectValList.clear();
		pcszConfParam = "coa_sensor_port";
		iRetVal = g_coConf.GetParamValue (pcszConfParam, vectValList);
		if (iRetVal) {
			UTL_LOG_F(
				g_coLog,
				"configuration parameter '%s' not found",
				pcszConfParam);
			break;
		}
		ui16Port = atol (vectValList[0].c_str());

		/* подключаемся к удаленному хосту */
		iFnRes = p_coIPConn.Connect (pcszHostName, ui16Port, iProtoType);
		if (iFnRes) {
			iRetVal = -1;
			UTL_LOG_F(
				g_coLog,
				"can't connect to CoASensor");
			break;
		}
	} while (0);

	return iRetVal;
}