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; }
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); } }
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; }
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; }
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; }
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; }
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; }