int CNMS_DispatcherConfig::Init()
{
	if (!CConfig::Init("NMS_Dispatcher"))
	{	return 0;
	}

	
	READ_DEFAULT_VARIABLE_INT("MODULE_RESTART_INTERVAL", m_nModuleRstInterval, 5 );	///default 5 seconds
	READ_DEFAULT_VARIABLE_INT("IPV4_PORT", m_nLocalPortIPv4, 40000 );	///default 40000
	READ_DEFAULT_VARIABLE_INT("IPV6_PORT", m_nLocalPortIPv6, 41000 );	///default 41000
	READ_DEFAULT_VARIABLE_INT("CHECK_TIMEDOUT_INTERVAL", m_nCheckTimedoutIntervalS, 20 );	///default 20 seconds
	
	READ_DEFAULT_VARIABLE_INT("REQUEST_UPDATE_INTERVAL", m_nReqUpdTimedoutIntervalS, 10);
	READ_DEFAULT_VARIABLE_INT("REQUEST_UPDATE_RETRY_COUNT", m_nReqUpdNo, 10);		//wait until erase	
	
	READ_DEFAULT_VARIABLE_INT("PENDING_RELATION_TIMEDOUT", m_nPendingRelationTimedoutS, 90 );			///default 90 seconds
	READ_DEFAULT_VARIABLE_INT("RELEASE_MODULE_CACHE_TIMEDOUT", m_nReleaseModuleCacheTimedoutH, 48 );	///default 48 hours
	READ_DEFAULT_VARIABLE_INT("DB_IPV6_RELOAD_TIMEDOUT", m_nDBIPv6ReloadTimedoutS, 60);					///default 60 seconds
	
	//reload ipv6 netprefixes
	READ_DEFAULT_VARIABLE_INT("DB_IPV6_RELOAD_NETPREFIX_INTERVAL", m_nReloadNetPrefixesIntervalS, 60);		///default 1 minute
	
	// security type
	char szBuff[250];
	READ_DEFAULT_VARIABLE_STRING ("SECURITY", szBuff, UNDEF_SECURITY_MANAGER);
    ISecurityManager::assignSecurity(m_oSecurity, szBuff);
    
	IF_USE_SECURITY_MANAGER (m_oSecurity.c_str())
		IF_USE_OPENVPN_MANAGER (m_oSecurity.c_str())
			// OpenVPN subnet
			READ_DEFAULT_VARIABLE_STRING ("OPENVPN_SUBNET", szBuff, NMS_DEFAULT_OPENVPN_SUBNET);
			m_oOpenVPNSubnet = szBuff;
			READ_DEFAULT_VARIABLE_STRING ("OPENVPN_SUBNET_MASK", szBuff, NMS_DEFAULT_OPENVPN_SUBNET_MASK);
			m_oOpenVPNSubnetMask = szBuff;
		END_IF
	END_IF
	
	//DB
	if (!CIniParser::FindGroup("NMS_DB")) 
	{
		return 0;	
	}

	char szTmp[250];
	READ_DEFAULT_VARIABLE_STRING ("DB_SERVER", szTmp, DEFAULT_DB_SERVER);
	m_strServer = szTmp;
	READ_DEFAULT_VARIABLE_STRING ("DB_USER", szTmp, DEFAULT_DB_USER);
	m_strUser = szTmp;
	READ_DEFAULT_VARIABLE_STRING ("DB_PASS", szTmp, DEFAULT_DB_PASS);
	m_strPass = szTmp;
	READ_DEFAULT_VARIABLE_STRING ("DB_NAME", szTmp, DEFAULT_DB_NAME);
	m_strDB = szTmp;
	
	CIniParser::FindGroup("NMS_Dispatcher");
	
	return 1;
}
Пример #2
0
	int CConfig_DNS::Init(const char* p_szModuleName) {

		if (!CConfig::Init(p_szModuleName)) return 0;

		READ_DEFAULT_VARIABLE_INT("PORT", m_nPort, DEFAULT_PORT);
		READ_DEFAULT_VARIABLE_INT("RELOAD_PERIOD", m_nReloadPeriodSeconds, DEFAULT_RELOAD_PERIOD);
		READ_DEFAULT_VARIABLE_NET_ADDR_EXT("NOTIF_ADDR", m_oNotifAddr, DEFAULT_NOTIF_ADDR);

		/***********************************************************************
		 * Load name patterns
		 **********************************************************************/
		char szPatternValue[MAX_PATTERN_LEN];
		for (int pos = 0; GetVar("NAME_PATTERN", szPatternValue, sizeof szPatternValue, pos); ++pos)
		{
			char szPrefix[MAX_PATTERN_LEN] = { 0, };
			unsigned uDeviceIdLen = 0;
			char szSuffix[MAX_PATTERN_LEN] = { 0, };

			if (  int p = sscanf( szPatternValue, "%[0-9a-zA-Z._-],%d,%[0-9a-zA-Z._-]", szPrefix, &uDeviceIdLen, szSuffix )  < 3 )
			{
				NLOG_WARN( "Read %d parts (exp=3) from name pattern=%s", p, szPatternValue );
			}
			
			CQNamePatternMatcher oQNamePatternMatcher;
			oQNamePatternMatcher.CompilePattern( szPrefix, 16, szSuffix );
			
			m_oQNamePatternMatcherList.push_back( oQNamePatternMatcher );
		}
		if (m_oQNamePatternMatcherList.empty()) {
			NLOG_INFO("Load default pattern");
			CQNamePatternMatcher oQNamePatternMatcher;
			oQNamePatternMatcher.CompilePattern(DEFAULT_URL_PREFIX, 16, DEFAULT_URL_SUFFIX);
			m_oQNamePatternMatcherList.push_back(oQNamePatternMatcher);
		}
		NLOG_INFO("Loaded name patterns:");
		for (TQNamePatternMatcherList::iterator it = m_oQNamePatternMatcherList.begin();
			it != m_oQNamePatternMatcherList.end(); ++it) {
			NLOG_INFO("\t%s[%d]%s", it->GetPrefix(), it->GetDeviceIdLen(), it->GetSuffix());
		}
		/**********************************************************************/

		return 1;
	};
Пример #3
0
bool GatewayConfig::RuntimeReload()
{
    READ_MANDATORY_VARIABLE_STRING("AppJoinKey", m_u8AppJoinKey);

    READ_MANDATORY_VARIABLE("GW_REQ_TIMEOUT", m_nGwReqTimeout);
    m_nGwReqTimeout *= sysconf(_SC_CLK_TCK);

    READ_DEFAULT_VARIABLE_INT("GW_REQ_RETRY_TIMEOUT", m_nGwReqRetryTimeout, 15);
    m_nGwReqRetryTimeout = m_nGwReqRetryTimeout * 60 * sysconf(_SC_CLK_TCK); // from minutes to clock ticks

    READ_DEFAULT_VARIABLE_INT("LOG_INTERNAL_STATUS_PERIOD", m_nLogInternalStatusPeriod, 0);
    READ_DEFAULT_VARIABLE_INT("LOG_INTERNAL_REQUEST_STATISTICS_PERIOD", m_nLogInternalRequestsStatisticsPeriod, 0);

    READ_MANDATORY_VARIABLE("CACHE_BURST_RESP_TIMEOUT", m_nGwBurstRespTimeout);
    READ_MANDATORY_VARIABLE("CACHE_READ_RESP_TIMEOUT", m_nGwRespTimeout);

    READ_MANDATORY_VARIABLE("GW_DRM_TIMEOUT", m_nGwDrmTimeout);
    m_nGwDrmTimeout *= sysconf(_SC_CLK_TCK);

    READ_MANDATORY_VARIABLE("GW_REQ_MAX_RETRY_NO", m_nGwReqMaxRetryNo);

    READ_DEFAULT_VARIABLE_INT("LOCAL_GW_RETRIES", m_nLocalGwRetries, 3);

    READ_DEFAULT_VARIABLE_INT("DEVICES_REFRESH_INTERVAL", m_nDevicesRefreshInterval, 5);

    READ_DEFAULT_VARIABLE_INT("LOG_LEVEL_STACK", m_nLogLevelStack, 4); //4-debug, 3-info
    READ_DEFAULT_VARIABLE_INT("LOG_LEVEL_APP", m_nLogLevelApp, 4); //4-debug, 3-info

    int granularity_keepalive;
    READ_DEFAULT_VARIABLE_INT("GRANULARITY_KEEPALIVE", granularity_keepalive, 60);
    m_u8GranularityKeepAlive = (uint8_t) granularity_keepalive;

    READ_DEFAULT_VARIABLE_INT("MAX_CMDS_PER_APDU", m_nMaxCmdsPerAPDU, 5);

    READ_DEFAULT_VARIABLE_YES_NO("NM_BURSTS_CACHING_ENABLED", m_bNmBurstsCachingEnabled, "YES");

    READ_DEFAULT_VARIABLE_YES_NO("USE_SUBDEV_POLLING_ADDRESSES", m_bUseSubdevPollingAddresses, "YES");

    READ_DEFAULT_VARIABLE_YES_NO("DONT_ACK_C119_WHEN_TIME_MINUS_1", m_bDontAckC119WhenTime_minus1, "NO");

    READ_DEFAULT_VARIABLE_YES_NO("SEND_DIRECT_WIRED_DEVICE_BURST", m_bSendDirectWiredDeviceBurst, "NO");
    READ_DEFAULT_VARIABLE_YES_NO("BUILD_UNIV_CMDS_CACHE", m_bBuildUnivCommandsCache, "NO");

    READ_DEFAULT_VARIABLE_INT("DRM_TYPE", m_nDrmType, GatewayConfig::DRM_TYPE_CACHE_BASED);

    // READ_DEFAULT_VARIABLE_STRING("GATEWAY_TAG", m_szTag, "GwTag" );

    READ_DEFAULT_VARIABLE_INT("DRM_ENTRY_LIFETIME", m_nDrmEntryLifetime, 1200);

    READ_DEFAULT_VARIABLE_YES_NO("SEND_INVALID_REQUEST_TO_DEVICE", m_bSendInvalidRequestToDevice, "NO");


    EnableLog(m_nLogLevelStack);//4-debug, 3-info
    EnableLog_APP(m_nLogLevelApp);//4-debug, 3-info

    LOG_INFO_APP("GatewayConfig DONE logLevel stack=" << m_nLogLevelStack << " app=" << m_nLogLevelApp);

    ReadSpecificCmds();

    BurstSpecificCmds();

    ReadGWUniversalVariables();

    return true;
}
Пример #4
0
// read variables from config.ini file
bool GatewayConfig::ReadGWVariables()
{
    // **********************CIniParser************************//

    CIniParser gwVarConfig;
    net_address stNetAddr;

    if (!gwVarConfig.Load(FILE_PATH_CONFIGINI))
    {
        LOG("------- NO CONFIG.INI FILE -------");
        return 0;
    }

    if (!gwVarConfig.GetVar("NETWORK_MANAGER", "NETWORK_MANAGER", &stNetAddr))
        return 0;

    m_nNetworkManagerPort = ntohs(stNetAddr.m_dwPortNo);
    strcpy(m_szNetworkManagerHost, inet_ntoa(*(in_addr*) &stNetAddr.m_nIP));

    // ****************CConfig**********************************//

    if (!CConfig::Init("WH_GATEWAY", FILE_PATH_CONFIGINI ))
    {
        LOG("-------------NO CONFIG.INI FILE--------------");
        return 0;
    }

    READ_MANDATORY_VARIABLE("GATEWAY", stNetAddr);

    m_nListenAccessPointPort = ntohs(stNetAddr.m_dwPortNo);
    m_u32IpAddress = stNetAddr.m_nIP;

    READ_MANDATORY_VARIABLE("NM_CLIENT_LISTEN_PORT",m_nNmClientListenPort );

    //READ_MANDATORY_VARIABLE ("LISTEN_AP_PORT", m_nListenAccessPointPort);

    READ_MANDATORY_VARIABLE ("AP_CLIENT_MIN_PORT", m_nAccessPointClientMinPort);

    READ_MANDATORY_VARIABLE ("AP_CLIENT_MAX_PORT", m_nAccessPointClientMaxPort);

    READ_MANDATORY_VARIABLE ("HOSTAPP_LISTEN_PORT", m_nHostApp_ListenPort);

    READ_MANDATORY_VARIABLE ("HOSTAPP_MIN_PORT", m_nHostApp_MinPort);

    READ_MANDATORY_VARIABLE("HOSTAPP_MAX_PORT", m_nHostApp_MaxPort);

    READ_DEFAULT_VARIABLE_INT("GW_REQUEST_SERVICE",m_nGwRequestService, 0);

    READ_DEFAULT_VARIABLE_FLOAT("BURST_MODE_NOTIFICATION_RATE", m_fBurstNotificationRate, 0.25);
    m_fBurstNotificationRate *= 1000; //miliseconds
    READ_DEFAULT_VARIABLE_FLOAT("EVENT_NOTIFICATION_RATE", m_fEventNotificationRate, 1);
    m_fEventNotificationRate *= 1000; //miliseconds
    READ_DEFAULT_VARIABLE_FLOAT("DEVICE_STATUS_NOTIFICATION_RATE", m_fDeviceStatusNotificationRate, 5);
    m_fDeviceStatusNotificationRate *= 1000; //miliseconds
    READ_DEFAULT_VARIABLE_FLOAT("DEVICE_CONFIGURATION_NOTIFICATION_RATE", m_fDeviceConfigurationNotificationRate, 5);
    m_fDeviceConfigurationNotificationRate *= 1000; //miliseconds
    READ_DEFAULT_VARIABLE_FLOAT("TOPOLOGY_NOTIFICATION_RATE", m_fTopologyNotificationRate, 5);
    m_fTopologyNotificationRate *= 1000; //miliseconds
    READ_DEFAULT_VARIABLE_FLOAT("SCHEDULE_NOTIFICATION_RATE", m_fScheduleNotificationRate, 5);
    m_fScheduleNotificationRate *= 1000; //miliseconds

    READ_DEFAULT_VARIABLE_INT("GW_MOCK_MODE",m_nMockMode, 0);
    READ_DEFAULT_VARIABLE_INT("SEND_ID_INFO_CMDS",m_nSendIdInfoCmds, 1);

    return 1;
}
/// Load the config.ini file and parse it to extract various configurations out of it
/// @retval 1 success
/// @retval 0 failure
/// @note DO NOT read same variable in Init() and Reload(). Init calls Reload.
int CISAConfig::Init()
{
	if(!CConfig::Init("GATEWAY"))
	{
		return 0;
	}

	READ_DEFAULT_VARIABLE_INT ("TCP_YGSAP_PORT",  m_nYGSAP_TCPPort, 0);
	READ_DEFAULT_VARIABLE_INT ("TCP_SERVER_PORT", m_nGSAP_TCPPort, 4900);

	READ_DEFAULT_VARIABLE_INT ("TCP_SERVER_PORT_SSL", m_nGSAP_TCPPort_SSL, 0);
	READ_DEFAULT_VARIABLE_INT ("TCP_YGSAP_PORT_SSL", m_nYGSAP_TCPPort_SSL, 0);
	
	READ_DEFAULT_VARIABLE_INT ("SM_LINK_TIMEOUT", m_nPingTimeout, 50);
	READ_DEFAULT_VARIABLE_STRING("GATEWAY_TAG", m_szGWTag, "Nivis Gateway" );

	if ( m_nGSAP_TCPPort_SSL != 0 ||  m_nYGSAP_TCPPort_SSL != 0)
	{
		READ_DEFAULT_VARIABLE_STRING("SSL_SERVER_CERTIF_FILE", m_szSslServerCertif, "/access_node/activity_files/ssl_resources/servercert.pem" );
		READ_DEFAULT_VARIABLE_STRING("SSL_SERVER_KEY_FILE", m_szSslServerKey, "/access_node/activity_files/ssl_resources/serverkey.pem" );
		READ_DEFAULT_VARIABLE_STRING("SSL_CA_CERTIF_FILE", m_szSslCaCertif, "/access_node/activity_files/ssl_resources/cakey.pem" );
	}
	

	if(GetVar("HOST_APP", &m_HostAddr )){
		LOG_HEX( "m_HostAddr(hexdump):", (uint8*)&m_HostAddr, sizeof(net_address));
	}

	READ_MANDATORY_VARIABLE("GATEWAY_IPv6", m_oGWIPv6 );

	char szIPv4[16];
	READ_MANDATORY_VARIABLE_STRING("GATEWAY_IPv4", szIPv4);
	READ_MANDATORY_VARIABLE("GATEWAY_UDPPort", m_nGW_UDPPort)

	if (!AdjustIPv6(&m_oGWIPv6,szIPv4, m_nGW_UDPPort))
	{
		return 0;
	}

	LOG("GW IPv6=%s IPv4=%s UDPPort=%d", m_oGWIPv6.GetPrintIPv6(), szIPv4, m_nGW_UDPPort);

	if(!GetVar("GATEWAY_EUI64", (uint8_t*)m_pu8GWEUI64, sizeof(m_pu8GWEUI64)))
	{
		return 0;
	}

	READ_MANDATORY_VARIABLE("SubnetID", m_nSubnetID);
	LOG("SubnetID %u (0x%X)", m_nSubnetID, m_nSubnetID);
	READ_MANDATORY_VARIABLE_STRING("AppJoinKey", m_u8AppJoinKey);
	
	READ_DEFAULT_VARIABLE_INT ("TLDE_HLIST_SIZE",  m_nTldeHListSize, 100);
	READ_DEFAULT_VARIABLE_INT ("TLDE_HLIST_TIME_WINDOW",  m_nTldeHListTimeWindow, 60);

	Reload();

	if(!CIniParser::GetVar("SYSTEM_MANAGER", "SYSTEM_MANAGER_IPv6", &m_oSMIPv6 ))
	{	return 0;
	}
	if(!CIniParser::GetVar("SYSTEM_MANAGER", "SYSTEM_MANAGER_IPv4", szIPv4, sizeof(szIPv4)))
	{	return 0;
	}
	if(!CIniParser::GetVar("SYSTEM_MANAGER", "SYSTEM_MANAGER_Port", &m_nSMPort))
	{	return 0;
	}
	if(!CIniParser::GetVar("SYSTEM_MANAGER", "CURRENT_UTC_ADJUSTMENT", &m_nCrtUTCAdj))
	{	return 0;
	}
	if (!AdjustIPv6(&m_oSMIPv6,szIPv4, m_nSMPort))
	{	return 0;
	}
	LOG("SM IPv6=%s IPv4=%s Port=%d", m_oSMIPv6.GetPrintIPv6(), szIPv4, m_nSMPort);

	if(!CIniParser::GetVar("SYSTEM_MANAGER", "SECURITY_MANAGER_EUI64", m_u8SecurityManager, sizeof(m_u8SecurityManager)))
	{	return 0;
	}

	LOG("Config loaded");
	//--------------
	return 1;
}
////////////////////////////////////////////////////////////////////////////////
/// @author Marcel Ionescu
/// @brief Re-read variables which may change at run-time
/// @retval true success
/// @retval false failure
/// @remarks Call it on USR2
/// @note TAKE CARE: DO NOT read same variable in Init and Reload. Init calls Reload.
/// @note The group get set to "GATEWAY" inside the method
/// @note TAKE CARE: put here only variables used directly
/// @note Do not put here varaibles used
///		- to initialise some other variables,
///		- as parameters to constructors
///		- as parameters for I/O subsystems (serials, USB, UDP, TCP)
////////////////////////////////////////////////////////////////////////////////
bool CISAConfig::Reload( void )
{
//	LOGLVL_ERR = 1,	/// User should ALWAYS log this log level.
//	LOGLVL_INF = 2,	/// User may choose to ignore this loglevel, to reduce the log noise. It is recommended to log it, however.
//	LOGLVL_DBG = 3	/// User should NOT log this level, except for stack debugging
/// @see ../ISA100/log_callback.h

	if (!CIniParser::FindGroup("GATEWAY"))
	{    return false;
	}

	READ_DEFAULT_VARIABLE_INT("LOG_LEVEL_APP",   m_nLogLevelApp, 3 );
	if( m_nLogLevelApp < 1 ) m_nLogLevelApp = 1;
	if( m_nLogLevelApp > 3 ) m_nLogLevelApp = 3;
	
	READ_DEFAULT_VARIABLE_INT("LOG_LEVEL_STACK", m_nLogLevelStack, 3 );
	if( m_nLogLevelStack < 1 ) m_nLogLevelStack = 1;
	if( m_nLogLevelStack > 3 ) m_nLogLevelStack = 3;

	READ_DEFAULT_VARIABLE_INT("TCP_INACTIVITY_SEC",	m_nTCPInactivity, 3600);
	READ_DEFAULT_VARIABLE_INT("TCP_MAX_MSG_SIZE", 	m_nTCPMaxSize, 10*1024*1024);
	READ_DEFAULT_VARIABLE_INT("SYSTEM_REPORTS_CACHE_TIMEOUT",	m_nSystemReportsCacheTimeout, 10 );
	READ_DEFAULT_VARIABLE_INT("CLIENTSERVER_CACHE_TIMEOUT",		m_nClientServerCacheTimeout, 120 );
	READ_DEFAULT_VARIABLE_INT("YGSAP_DEVICE_LIST_REFRESH",		m_nDeviceListRefresh, 30 );
	READ_DEFAULT_VARIABLE_INT("CONTRACT_LIST_REFRESH",			m_nContractListRefresh, 300 );

	READ_DEFAULT_VARIABLE_YES_NO("DISPLAY_REPORTS",				 m_nDisplayReports, "no");

	READ_DEFAULT_VARIABLE_INT("MAX_SAP_IN_DATA_LOG", 	m_nMaxSapInDataLog, 16);
	READ_DEFAULT_VARIABLE_INT("MAX_SAP_OUT_DATA_LOG", 	m_nMaxSapOutDataLog, 24);
	READ_DEFAULT_VARIABLE_INT("MAX_PUBLISH_DATA_LOG", 	m_nMaxPublishDataLog, 16);
	READ_DEFAULT_VARIABLE_INT("MAX_CS_DATA_LOG", 		m_nMaxCSDataLog, 12);

	READ_DEFAULT_VARIABLE_INT("GPDU_STATISTICS_PERIOD", m_nGPDUStatisticsPeriod, 600);   /// interval used to average GS_GPDU_Path_Reliability/GS_GPDU_Latency
// old method	READ_DEFAULT_VARIABLE_INT("GPDU_MAX_LATENCY_PERCENT", m_nGPDUMaxLatencyPercent, 10); /// percent of publication period. Above it a publish packet is considered late and added to GS_GPDU_Latency

	return true;
}
Пример #7
0
int CConfig::Init( const char * p_szModule, const char * p_szFileName )
{
    LOG( "CConfig::Init" );

    m_nIsMasterAN = NO_RF_MEMBER;

    if( ! Load( p_szFileName )
	|| ! CIniParser::FindGroup("GLOBAL")
	|| ( CIniParser::GetVar(NULL, "AN_ID",(unsigned char*)(&m_stAddress), sizeof(m_stAddress)) != sizeof(m_stAddress) )
	|| ( CIniParser::GetVar(NULL, "APP_ID",(unsigned char*)(&m_shAppId), sizeof(m_shAppId)) != sizeof(m_shAppId) )
	|| (m_shAppId == 0)
	|| ((*(int*)&m_stAddress) == 0)
	)
	{
	    LOG( "PANIC CConfig::Init: section GLOBAL  not found, or AN_ID/APP_ID are wrong");
	    Release();    // calling parent's Release()
	    return 0;
	}
	//LOG("CConfig::Init: AN_ID=%s APP_ID=%s", GetHex(&m_stAddress,sizeof(m_stAddress)), GetHex(&m_shAppId,sizeof(m_shAppId)));
	LOG("CConfig::Init: AN_ID=%s APP_ID=%s", GetHexT(&m_stAddress), GetHexT(&m_shAppId));
	m_ppModulesToWatch[0] = 0;

	strncpy( m_szModule, p_szModule, sizeof(m_szModule)-1 );

	int nLogSize;
	bool bTail;
	int nMoveTimeout;
	char szStorage[PATH_MAX];
	char temp[ 16 ];
	int nFFree;
	bool bBackup1;

	/// create backup logs with .1 extension, SM-style
	/// when active, the FTP_SCRIPT is no longer executed
	READ_DEFAULT_VARIABLE_YES_NO ( "LOG_BACKUP_1", bBackup1, "N" );

	g_stLog.SetBackup1( bBackup1 );

	READ_DEFAULT_VARIABLE_INT ( "MODULES_STOP_TIMEOUT", CApp::m_nStopTimeout, 30 ); //seconds

	READ_DEFAULT_VARIABLE_INT ( "MAX_LOG_SIZE", nLogSize, 512 ); //kBytes

	g_stLog.SetMaxSize( nLogSize * 1024 );
	READ_DEFAULT_VARIABLE_STRING ( "LOG_STORAGE", szStorage, "");


//	g_stLog.SetStorage( szStorage);  will do it only once, because it's heavy
	READ_DEFAULT_VARIABLE_YES_NO ( "TAIL_SAFE", bTail, "NO" );
	g_stLog.SetTail( bTail);
	READ_DEFAULT_VARIABLE_INT ( "MOVE_TIMEOUT", nMoveTimeout, 120 ); //seconds
	g_stLog.SetMoveTimeout( nMoveTimeout);
	READ_DEFAULT_VARIABLE_INT ( "LOG_FLASH_FREE_LIMIT", nFFree, 5120 ); //kBytes
	g_stLog.SetFlashFreeLimit( nFFree );

 	if ( CIniParser::FindGroup( p_szModule ) == NULL )
		return 0;

	if( GetVar("MAX_LOG_SIZE", &nLogSize) ){
		LOG( "Override value for MAX_LOG_SIZE = %d", nLogSize);
		g_stLog.SetMaxSize( nLogSize * 1024 );
	}
	if( GetVar("TAIL_SAFE", temp, sizeof( temp)) ){
		bTail=( !strcasecmp( temp, "Y") || !strcasecmp( temp, "YES") || !strcasecmp( temp, "1") || !strcasecmp( temp, "TRUE"));
		LOG( "Override value for TAIL_SAFE = %s", bTail?"TRUE":"FALSE");
		g_stLog.SetTail( bTail );
	}
	if( GetVar("MOVE_TIMEOUT", &nMoveTimeout) ){
		LOG( "Override value for MOVE_TIMEOUT = %d", nMoveTimeout);
		g_stLog.SetMoveTimeout( nMoveTimeout);
	}
	if( GetVar("LOG_STORAGE", szStorage, sizeof( szStorage)) ){
		LOG( "Override value for LOG_STORAGE = %s", szStorage);
	}

	g_stLog.SetStorage( szStorage);  //we didn't do it before


	ReadAndSetLogLevel();
	return 1;
}