//------------------------------------------------------------------------- // Desc: Class for displaying and modifying system configuration information // in the monitoring web pages. // Tabs: 3 // // Copyright (c) 2002-2006 Novell, Inc. All Rights Reserved. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, contact Novell, Inc. // // To contact Novell about this file by physical or electronic mail, // you may find current contact information at www.novell.com // // $Id: imonscfg.cpp 12329 2006-01-20 17:49:30 -0700 (Fri, 20 Jan 2006) ahodgkinson $ //------------------------------------------------------------------------- #include "flaimsys.h" /**************************************************************************** Desc: Prints the web page for system configuration parameters. ****************************************************************************/ RCODE F_SysConfigPage::display( FLMUINT uiNumParams, const char ** ppszParams) { RCODE rc = FERR_OK; char szTmp [30]; eFlmConfigTypes eConfigType; stdHdr(); fnPrintf( m_pHRequest, HTML_DOCTYPE); fnPrintf( m_pHRequest, "\n"); printStyle(); fnPrintf( m_pHRequest, "\n"); fnPrintf( m_pHRequest, "\n"); printTableStart( "System Configuration", 3); // Get the Action, if any if (RC_BAD(rc = ExtractParameter( uiNumParams, ppszParams, "Action", sizeof( szTmp), szTmp))) { if (rc == FERR_NOT_FOUND) { rc = FERR_OK; } else { goto Exit; } } else { eConfigType = (eFlmConfigTypes)f_atoi( szTmp); if (RC_BAD( rc = doConfig( eConfigType, uiNumParams, ppszParams))) { fnPrintf( m_pHRequest, "
ERROR %04X DOING CONFIGURATION

\n", (unsigned)rc); } } outputParams(); printTableEnd(); fnPrintf( m_pHRequest, "\n"); Exit: fnEmit(); return( rc); } /**************************************************************************** Desc: Outputs a button that the user can simply press for a certain action to occur. The action is described in pszParamDescription. ****************************************************************************/ void F_SysConfigPage::outputButton( eFlmConfigTypes eConfigType, const char * pszParamAction, FLMUINT uiValue1, FLMUINT uiValue2) { beginRow(); beginInputForm( eConfigType); // Output value1 and value 2 as hidden values to be returned. fnPrintf( m_pHRequest, "\n" "\n", (unsigned)uiValue1, (unsigned)uiValue2); addSubmitButton( pszParamAction); endInputForm(); endRow(); } /**************************************************************************** Desc: Outputs a UINT value. ****************************************************************************/ void F_SysConfigPage::outputUINT( eFlmConfigTypes eConfigType, const char * pszParamDescription, FLMBOOL bParamIsSettable, FLMBOOL bParamIsGettable, FLMUINT uiDefaultValue) { FLMUINT uiValue; char szValue [40]; beginRow(); fnPrintf( m_pHRequest, TD_s, pszParamDescription); if (bParamIsGettable) { RCODE rc; if (RC_BAD( rc = FlmGetConfig( eConfigType, (void *)&uiValue))) { f_sprintf( szValue, "Error %04X", (unsigned)rc); } else { f_sprintf( szValue, "%u", (unsigned)uiValue); } } else { f_sprintf( szValue, "%u", (unsigned)uiDefaultValue); } if (!bParamIsSettable) { fnPrintf( m_pHRequest, TD_s, szValue); } else { beginInputForm( eConfigType); addStrInputField( eConfigType, 10, szValue); // Need a submit button for some browsers. addSubmitButton( "Submit"); endInputForm(); } endRow(); } /**************************************************************************** Desc: Outputs a Boolean value. ****************************************************************************/ void F_SysConfigPage::outputBOOL( eFlmConfigTypes eConfigType, const char * pszParamDescription, const char * pszOnState, const char * pszOffState, const char * pszTurnOnAction, const char * pszTurnOffAction) { RCODE rc; FLMBOOL bValue; beginRow(); fnPrintf( m_pHRequest, TD_s, pszParamDescription); if (RC_BAD( rc = FlmGetConfig( eConfigType, (void *)&bValue))) { fnPrintf( m_pHRequest, "Error %04X\n", (unsigned)rc); bValue = FALSE; } else { fnPrintf( m_pHRequest, TD_s, (char *)(bValue ? pszOnState : pszOffState)); } beginInputForm( eConfigType); // Add a hidden toggle parameter to be returned. fnPrintf( m_pHRequest, "\n", (char *)(bValue ? (char *)"OFF" : (char *)"ON")); addSubmitButton( (char *)(bValue ? pszTurnOffAction : pszTurnOnAction)); endInputForm(); endRow(); } /**************************************************************************** Desc: Outputs a string value. ****************************************************************************/ void F_SysConfigPage::outputString( eFlmConfigTypes eConfigType, const char * pszParamDescription, FLMUINT uiMaxStrLen, FLMBOOL bParamIsSettable, FLMBOOL bParamIsGettable, const char * pszDefaultValue) { RCODE rc = FERR_OK; char * pszValue = NULL; char szErr[ 40]; beginRow(); fnPrintf( m_pHRequest, TD_s, pszParamDescription); if (RC_BAD( rc = f_alloc( uiMaxStrLen + 1, &pszValue))) { f_sprintf( (char *)szErr, "Error %04X", (unsigned)rc); pszValue = &szErr [0]; } else { if (bParamIsGettable) { if (RC_BAD( rc = FlmGetConfig( eConfigType, (void *)pszValue))) { if (rc == FERR_IO_PATH_NOT_FOUND && eConfigType == FLM_TMPDIR) { *pszValue = 0; } else { f_sprintf( (char *)pszValue, "Error %04X", (unsigned)rc); } } } else { f_strcpy( pszValue, pszDefaultValue); } } if (!bParamIsSettable) { fnPrintf( m_pHRequest, TD_s, pszValue); } else { beginInputForm( eConfigType); addStrInputField( eConfigType, uiMaxStrLen, (char *)pszValue); // Need a submit button for some browsers. addSubmitButton( "Submit"); endInputForm(); } endRow(); if (pszValue && pszValue != &szErr [0]) { f_free( &pszValue); } } /**************************************************************************** Desc: Prints the web page for system configuration parameters. This function assumes that the table has already been started. ****************************************************************************/ void F_SysConfigPage::outputParams( void) { outputButton( FLM_CLOSE_UNUSED_FILES, "Close unused file desc, free unused items"); outputButton( FLM_CLOSE_ALL_FILES, "Close ALL file descriptors"); outputButton( FLM_START_STATS, "Begin Statistics"); outputButton( FLM_STOP_STATS, "End Statistics"); outputButton( FLM_RESET_STATS, "Reset Statistics"); outputUINT( FLM_QUERY_MAX, "Max Queries To Save"); outputBOOL( FLM_CACHE_CHECK, "Cache Checking"); outputBOOL( FLM_SCACHE_DEBUG, "Cache debugging"); outputUINT( FLM_BLOCK_CACHE_PERCENTAGE, "Block Cache Percent"); outputUINT( FLM_CACHE_LIMIT, "Cache limit (bytes)"); outputUINT( FLM_CACHE_ADJUST_INTERVAL, "Dynamic Cache Adjust Interval (secs.)"); outputUINT( FLM_CACHE_CLEANUP_INTERVAL, "Cache Cleanup Interval (seconds)"); outputUINT( FLM_OPEN_THRESHOLD, "Maximum open file descriptors"); outputUINT( FLM_OPEN_FILES, "Currently open file descriptors", FALSE, TRUE); outputUINT( FLM_MAX_CP_INTERVAL, "Checkpoint Interval (seconds)"); outputUINT( FLM_MAX_TRANS_SECS, "Read Transaction Timeout (seconds)"); outputUINT( FLM_MAX_UNUSED_TIME, "Unused Object Timeout (seconds)"); outputUINT( FLM_UNUSED_CLEANUP_INTERVAL, "Unused Object Cleanup Interval (seconds)"); outputString( FLM_BLOB_EXT, "BLOB Extension", 63); outputString( FLM_TMPDIR, "Temporary file directory", F_PATH_MAX_SIZE); outputString( FLM_CLOSE_FILE, "Force DB Close", F_PATH_MAX_SIZE, TRUE, FALSE, "nds.db"); outputString( FLM_KILL_DB_HANDLES, "Kill DB Handles", F_PATH_MAX_SIZE + F_PATH_MAX_SIZE + 1, TRUE, FALSE, "nds.db"); } /**************************************************************************** Desc: Get a value from an input box on the form. ****************************************************************************/ RCODE F_SysConfigPage::getConfigValue( eFlmConfigTypes eConfigType, FLMUINT uiNumParams, const char ** ppszParams, FLMUINT uiValueLen, char * pszValue) { RCODE rc = FERR_OK; char szName [30]; f_sprintf( (char *)szName, "U%u", (unsigned)eConfigType); if (RC_BAD(rc = ExtractParameter( uiNumParams, ppszParams, szName, uiValueLen, pszValue))) { if (rc == FERR_NOT_FOUND) { *pszValue = 0; rc = FERR_OK; } goto Exit; } fcsDecodeHttpString( pszValue); Exit: return( rc); } /**************************************************************************** Desc: Get a value from an input box on the form. ****************************************************************************/ RCODE F_SysConfigPage::getConfigValue( eFlmConfigTypes eConfigType, FLMUINT uiNumParams, const char ** ppszParams, char ** ppszValue, FLMUINT uiMaxStrLen) { RCODE rc = FERR_OK; char szName [30]; FLMBOOL bAllocated = FALSE; f_sprintf( (char *)szName, "U%u", (unsigned)eConfigType); // Allocate enough so that if every character is encoded with a %xx we // will have enough to get it. if (RC_BAD( rc = f_alloc( uiMaxStrLen * 3 + 1, ppszValue))) { goto Exit; } bAllocated = TRUE; if (RC_BAD(rc = ExtractParameter( uiNumParams, ppszParams, szName, ( uiMaxStrLen * 3 + 1), *ppszValue))) { if (rc == FERR_NOT_FOUND) { *(*ppszValue) = 0; rc = FERR_OK; } goto Exit; } fcsDecodeHttpString( *ppszValue); Exit: if (RC_BAD( rc) && bAllocated) { f_free( ppszValue); } return( rc); } /**************************************************************************** Desc: Configures from a button that has been pressed. ****************************************************************************/ RCODE F_SysConfigPage::configButton( eFlmConfigTypes eConfigType, FLMUINT uiNumParams, const char ** ppszParams) { RCODE rc = FERR_OK; char szTmp [20]; FLMUINT uiValue1; FLMUINT uiValue2; // Get Value1 and Value2 - these will be in the parameters. if (RC_BAD(rc = ExtractParameter( uiNumParams, ppszParams, "Value1", sizeof( szTmp), szTmp))) { goto Exit; } uiValue1 = f_atoud( szTmp); if (RC_BAD(rc = ExtractParameter( uiNumParams, ppszParams, "Value2", sizeof( szTmp), szTmp))) { goto Exit; } uiValue2 = f_atoud( szTmp); // Do the configuration. if (RC_BAD( rc = FlmConfig( eConfigType, (void *)uiValue1, (void *)uiValue2))) { goto Exit; } Exit: return( rc); } /**************************************************************************** Desc: Configures a UINT value. ****************************************************************************/ RCODE F_SysConfigPage::configUINT( eFlmConfigTypes eConfigType, FLMUINT uiNumParams, const char ** ppszParams) { RCODE rc = FERR_OK; FLMUINT uiValue; char szValue [64]; // Get the value to configure. if (RC_BAD( rc = getConfigValue( eConfigType, uiNumParams, ppszParams, sizeof( szValue), szValue))) { goto Exit; } uiValue = f_atoud( szValue); // Do the configuration. if (RC_BAD( rc = FlmConfig( eConfigType, (void *)uiValue, (void *)0))) { goto Exit; } Exit: return( rc); } /**************************************************************************** Desc: Configures a Boolean value. ****************************************************************************/ RCODE F_SysConfigPage::configBOOL( eFlmConfigTypes eConfigType, FLMUINT uiNumParams, const char ** ppszParams) { RCODE rc = FERR_OK; FLMUINT uiValue; char szToggle [20]; // Get the toggle value - it will be in the parameters. if (RC_BAD(rc = ExtractParameter( uiNumParams, ppszParams, "Toggle", sizeof( szToggle), szToggle))) { goto Exit; } uiValue = (FLMUINT)((f_stricmp( szToggle, "OFF") == 0) ? (FLMUINT)0 : (FLMUINT)1); // Do the configuration. if (RC_BAD( rc = FlmConfig( eConfigType, (void *)uiValue, (void *)0))) { goto Exit; } Exit: return( rc); } /**************************************************************************** Desc: Configures a string value. ****************************************************************************/ RCODE F_SysConfigPage::configString( eFlmConfigTypes eConfigType, FLMUINT uiNumParams, const char ** ppszParams, FLMUINT uiMaxStrLen) { RCODE rc = FERR_OK; char * pszValue = NULL; // Get the value to configure. if (RC_BAD( rc = getConfigValue( eConfigType, uiNumParams, ppszParams, &pszValue, uiMaxStrLen))) { pszValue = NULL; goto Exit; } // Do the configuration. if (RC_BAD( rc = FlmConfig( eConfigType, (void *)pszValue, (void *)0))) { goto Exit; } Exit: if (pszValue) { f_free( &pszValue); } return( rc); } /**************************************************************************** Desc: Performs a FlmConfig call, as requested by the user. ****************************************************************************/ RCODE F_SysConfigPage::doConfig( eFlmConfigTypes eConfigType, FLMUINT uiNumParams, const char ** ppszParams) { RCODE rc = FERR_OK; char * pszTmp = NULL; char * pszDbName; char * pszPath; char * pszPtr; switch (eConfigType) { case FLM_CLOSE_UNUSED_FILES: case FLM_CLOSE_ALL_FILES: case FLM_START_STATS: case FLM_STOP_STATS: case FLM_RESET_STATS: rc = configButton( eConfigType, uiNumParams, ppszParams); break; case FLM_OPEN_THRESHOLD: case FLM_CACHE_LIMIT: case FLM_MAX_CP_INTERVAL: case FLM_MAX_TRANS_SECS: case FLM_CACHE_ADJUST_INTERVAL: case FLM_CACHE_CLEANUP_INTERVAL: case FLM_UNUSED_CLEANUP_INTERVAL: case FLM_MAX_UNUSED_TIME: case FLM_BLOCK_CACHE_PERCENTAGE: case FLM_QUERY_MAX: rc = configUINT( eConfigType, uiNumParams, ppszParams); break; case FLM_SCACHE_DEBUG: case FLM_CACHE_CHECK: rc = configBOOL( eConfigType, uiNumParams, ppszParams); break; case FLM_BLOB_EXT: rc = configString( eConfigType, uiNumParams, ppszParams, 63); break; case FLM_TMPDIR: case FLM_CLOSE_FILE: rc = configString( eConfigType, uiNumParams, ppszParams, F_PATH_MAX_SIZE); break; case FLM_KILL_DB_HANDLES: // Get the value to configure. The string should be a // database name, semicolon, path. pszPath = pszDbName = NULL; if (RC_BAD( rc = getConfigValue( eConfigType, uiNumParams, ppszParams, &pszTmp, F_PATH_MAX_SIZE + F_PATH_MAX_SIZE + 1))) { pszTmp = NULL; goto Exit; } pszDbName = pszPtr = pszTmp; while (*pszDbName && *pszDbName <= ' ') { pszDbName++; } pszPtr = pszDbName; if (*pszDbName) { pszPtr = pszDbName; while (*pszPtr && *pszPtr != ';') { pszPtr++; } if (*pszPtr == ';') { *pszPtr = 0; pszPath = pszPtr + 1; while (*pszPath && *pszPath < ' ') { pszPath++; } if (!(*pszPath)) { pszPath = NULL; } } } else { pszDbName = NULL; pszPath = NULL; } // Do the configuration. if (RC_BAD( rc = FlmConfig( eConfigType, (void *)pszDbName, (void *)pszPath))) { goto Exit; } break; default: rc = RC_SET( FERR_INVALID_PARM); goto Exit; } Exit: if (pszTmp) { f_free( &pszTmp); } return( rc); }