示例#1
0
function get_conf()
{
    if (!defined('TEST_ENVIRONMENT_RUNNING')) {
        define('TEST_ENVIRONMENT_RUNNING', true);
    }
    if (!file_exists(MAX_PATH . '/var/' . OX_getHostName() . '.conf.php')) {
        if (folder_is_writable(MAX_PATH . '/var')) {
            copy(MAX_PATH . '/etc/sim.conf.php', MAX_PATH . '/var/' . OX_getHostName() . '.conf.php');
        }
    }
    require_once MAX_PATH . '/init-delivery-parse.php';
    $conf = parseIniFile();
    // this is purely because its not used (yet)
    $conf['request']['context'] = '';
    return $conf;
}
示例#2
0
<?php

if (!defined('BASEPATH')) {
    exit('No direct script access allowed');
}
if (!function_exists('parseIniFile')) {
    function parseIniFile($iIniFile)
    {
        $a = array();
        $aMatches = array();
        $s = '\\s*([[:alnum:]_\\- \\*]+?)\\s*';
        preg_match_all('#^\\s*((\\[' . $s . '\\])|(("?)' . $s . '\\5\\s*=\\s*("?)(.*?)\\7))\\s*(;[^\\n]*?)?$#ms', file_get_contents($iIniFile), $aMatches, PREG_SET_ORDER);
        foreach ($aMatches as $aMatch) {
            if (empty($aMatch[2])) {
                $a[$aMatch[6]] = $aMatch[8];
            }
        }
        return $a;
    }
}
$lang = parseIniFile(sprintf("%s/helppage.ini", dirname(__FILE__)));
// --------------------------------------------------------------------
/* End of file groupware_lang.php */
/* Location: ./application/language/en/groupware_lang.php */
示例#3
0
/**
 * The environmental constants initialisation function for Revive Adserver.
 */
function setupConstants()
{
    // Define this version of Revive Adserver's constants
    define('VERSION', '3.2.2-dev');
    define('PRODUCT_NAME', 'Revive Adserver');
    define('PRODUCT_URL', 'www.revive-adserver.com');
    define('PRODUCT_DOCSURL', 'http://documentation.revive-adserver.com');
    // Deprecated constants for backwards compatibility. Please use the ones above
    define('OA_VERSION', VERSION);
    define('OX_PRODUCT_DOCSURL', PRODUCT_DOCSURL);
    define('RV_INSTALLATION_STATUS_NOTINSTALLED', -1);
    define('RV_INSTALLATION_STATUS_UPGRADING', 0);
    define('RV_INSTALLATION_STATUS_INSTALLED', 1);
    define('OA_AD_DIRECT_ENABLED', false);
    // Campaign types
    define('OX_CAMPAIGN_TYPE_REMNANT', 1);
    define('OX_CAMPAIGN_TYPE_CONTRACT_NORMAL', 2);
    define('OX_CAMPAIGN_TYPE_OVERRIDE', 3);
    define('OX_CAMPAIGN_TYPE_ECPM', 4);
    define('OX_CAMPAIGN_TYPE_CONTRACT_ECPM', 5);
    // Database connection constants
    define('MAX_DSN_ARRAY', 0);
    define('MAX_DSN_STRING', 1);
    $GLOBALS['_OA']['CONNECTIONS'] = array();
    // Error codes to use with MAX::raiseError()
    // Start at -100 in order not to conflict with PEAR::DB error codes
    define('MAX_ERROR_INVALIDARGS', -101);
    // Wrong args to function
    define('MAX_ERROR_INVALIDCONFIG', -102);
    // Something wrong with the config
    define('MAX_ERROR_NODATA', -103);
    // No data available
    define('MAX_ERROR_NOCLASS', -104);
    // No class exists
    define('MAX_ERROR_NOMETHOD', -105);
    // No method exists
    define('MAX_ERROR_NOAFFECTEDROWS', -106);
    // No rows where affected by update/insert/delete
    define('MAX_ERROR_NOTSUPPORTED', -107);
    // Limit queries on unsuppored databases
    define('MAX_ERROR_INVALIDCALL', -108);
    // Overload getter/setter failure
    define('MAX_ERROR_INVALIDAUTH', -109);
    define('MAX_ERROR_EMAILFAILURE', -110);
    define('MAX_ERROR_DBFAILURE', -111);
    define('MAX_ERROR_DBTRANSACTIONFAILURE', -112);
    define('MAX_ERROR_BANNEDUSER', -113);
    define('MAX_ERROR_NOFILE', -114);
    define('MAX_ERROR_INVALIDFILEPERMS', -115);
    define('MAX_ERROR_INVALIDSESSION', -116);
    define('MAX_ERROR_INVALIDPOST', -117);
    define('MAX_ERROR_INVALIDTRANSLATION', -118);
    define('MAX_ERROR_FILEUNWRITABLE', -119);
    define('MAX_ERROR_INVALIDMETHODPERMS', -120);
    define('MAX_ERROR_INVALIDREQUEST', -121);
    define('MAX_ERROR_INVALIDTYPE', -122);
    define('MAX_ERROR_INVALIDOPERATIONINT', -123);
    define('MAX_ERROR_INVALIDBANNERSIZE', -124);
    define('MAX_ERROR_INVALIDBANNERTYPE', -125);
    define('MAX_ERROR_ALREADYLINKED', -126);
    define('MAX_ERROR_EXISTINGCAMPAIGNFORDATES', -127);
    define('MAX_ERROR_EMAILNODATES', -128);
    // Ad/Zone association link types
    define('MAX_AD_ZONE_LINK_DIRECT', 0);
    define('MAX_AD_ZONE_LINK_NORMAL', 1);
    define('MAX_AD_ZONE_LINK_CATEGORY', 2);
    // URL construction constants
    define('MAX_URL_ADMIN', 0);
    define('MAX_URL_IMAGE', 1);
    define('MAX_URL_DEL_SCRIPT', 2);
    define('MAX_URL_DEL_SCRIPT_SSL', 3);
    define('MAX_URL_DEL_IMG', 4);
    define('MAX_URL_DEL_IMG_SSL', 5);
    // Connection action type constants
    define('MAX_CONNECTION_AD_IMPRESSION', 0);
    define('MAX_CONNECTION_AD_CLICK', 1);
    define('MAX_CONNECTION_AD_ARRIVAL', 2);
    define('MAX_CONNECTION_MANUAL', 4);
    // Campaign deactivation reasons
    // Values must be x^2, as used as binary flags
    define('OX_CAMPAIGN_DISABLED_IMPRESSIONS', 2);
    define('OX_CAMPAIGN_DISABLED_CLICKS', 4);
    define('OX_CAMPAIGN_DISABLED_CONVERSIONS', 8);
    define('OX_CAMPAIGN_DISABLED_DATE', 16);
    // Time contstants
    define('SECONDS_PER_WEEK', 604800);
    define('MINUTES_PER_WEEK', 10080);
    define('SECONDS_PER_DAY', 86400);
    define('SECONDS_PER_HOUR', 3600);
    define('MINUTES_PER_DAY', 1440);
    // Connection status types. Only the default conversion
    // status (MAX_CONNECTION_STATUS_APPROVED) is defined (4), which
    // is a conversion type that is approved by default.
    // Note also that only ignore, pending and approved
    // are used as possible starting values (ie. in the
    // campaigns_trackers table.
    define('MAX_CONNECTION_STATUS_IGNORE', 1);
    define('MAX_CONNECTION_STATUS_PENDING', 2);
    define('MAX_CONNECTION_STATUS_ONHOLD', 3);
    define('MAX_CONNECTION_STATUS_APPROVED', 4);
    define('MAX_CONNECTION_STATUS_DISAPPROVED', 5);
    define('MAX_CONNECTION_STATUS_DUPLICATE', 6);
    // Connection action type constants
    define('MAX_CONNECTION_TYPE_SALE', 1);
    define('MAX_CONNECTION_TYPE_LEAD', 2);
    define('MAX_CONNECTION_TYPE_SIGNUP', 3);
    // Financial constants
    define('MAX_FINANCE_CPM', 1);
    define('MAX_FINANCE_CPC', 2);
    define('MAX_FINANCE_CPA', 3);
    define('MAX_FINANCE_MT', 4);
    // Monthly Tennancy
    define('MAX_FINANCE_RS', 5);
    // % Revenue split     (zone-only)
    define('MAX_FINANCE_BV', 6);
    // % Basket value      (zone-only)
    define('MAX_FINANCE_AI', 7);
    // Amount per item     (zone-only)
    define('MAX_FINANCE_ANYVAR', 8);
    // % of any variable   (zone-only)
    define('MAX_FINANCE_VARSUM', 9);
    // % of a variable sum (zone-only)
    $GLOBALS['_MAX']['STATUSES'] = array(MAX_CONNECTION_STATUS_IGNORE => 'strStatusIgnore', MAX_CONNECTION_STATUS_PENDING => 'strStatusPending', MAX_CONNECTION_STATUS_ONHOLD => 'strStatusOnHold', MAX_CONNECTION_STATUS_APPROVED => 'strStatusApproved', MAX_CONNECTION_STATUS_DISAPPROVED => 'strStatusDisapproved', MAX_CONNECTION_STATUS_DUPLICATE => 'strStatusDuplicate');
    $GLOBALS['_MAX']['CONN_TYPES'] = array(MAX_CONNECTION_TYPE_SALE => 'strConnTypeSale', MAX_CONNECTION_TYPE_LEAD => 'strConnTypeLead', MAX_CONNECTION_TYPE_SIGNUP => 'strConnTypeSignUp');
    // IP Address used to determine which (if any) MaxMind databases are installed
    define('MAX_MIND_TEST_IP', '24.24.24.24');
    // Maximum random number
    define('MAX_RAND', mt_getrandmax());
    define('MAX_RAND_INV', 1 / MAX_RAND);
    // Maintenance Engine Constants: Number of days to keep old maintenance
    // data, before pruning, where a fixed retention value is appriopriate
    define('OA_MAINTENANCE_FIXED_PRUNING', 30);
    define('MAX_LIMITATION_EQUAL', 0);
    define('MAX_LIMITATION_NOT_EQUAL', 1);
    define('MAX_LIMITATION_BITWISE', 2);
    // Define the week to start on Sunday (0) so that the PEAR::Date and
    // PEAR::Date_Calc classes agree on what day is the start of the week
    define('DATE_CALC_BEGIN_WEEKDAY', 0);
    // Do not overload DataObjects as it allows us to work with 4.3.10
    define('DB_DATAOBJECT_NO_OVERLOAD', true);
    // Ensure that the initialisation has not been run before
    if (!isset($GLOBALS['_MAX']['CONF'])) {
        // Define the installation base path if not defined
        // since local mode will pre-define this value
        if (!defined('MAX_PATH')) {
            define('MAX_PATH', dirname(__FILE__));
        }
        if (!defined('OX_PATH')) {
            define('OX_PATH', MAX_PATH);
        }
        if (!defined('RV_PATH')) {
            define('RV_PATH', MAX_PATH);
        }
        if (!defined('LIB_PATH')) {
            define('LIB_PATH', MAX_PATH . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'OX');
        }
        define('IS_WINDOWS', DIRECTORY_SEPARATOR === '\\');
        // Setup the include path
        setupIncludePath();
        // Parse the configuration file
        $GLOBALS['_MAX']['CONF'] = parseIniFile();
        // Define the cache file location path (required trailing slash)
        define('MAX_CACHE', MAX_PATH . '/var/cache/');
        // Set the URL access mechanism
        if (!empty($GLOBALS['_MAX']['CONF']['openads']['requireSSL'])) {
            $GLOBALS['_MAX']['HTTP'] = 'https://';
        } else {
            if (isset($_SERVER['SERVER_PORT'])) {
                if (isset($GLOBALS['_MAX']['CONF']['openads']['sslPort']) && $_SERVER['SERVER_PORT'] == $GLOBALS['_MAX']['CONF']['openads']['sslPort']) {
                    $GLOBALS['_MAX']['HTTP'] = 'https://';
                } else {
                    $GLOBALS['_MAX']['HTTP'] = 'http://';
                }
            }
        }
        // Set the True Type Font path
        if (isset($GLOBALS['_MAX']['CONF']['graphs']['ttfDirectory'])) {
            define('IMAGE_CANVAS_SYSTEM_FONT_PATH', $GLOBALS['_MAX']['CONF']['graphs']['ttfDirectory']);
        }
        // Set the dbms type
        if (isset($GLOBALS['_MAX']['CONF']['database']) && $GLOBALS['_MAX']['CONF']['database']['type'] == 'mysql') {
            define('phpAds_dbmsname', 'MySQL');
        } else {
            if (isset($GLOBALS['_MAX']['CONF']['database']) && $GLOBALS['_MAX']['CONF']['database']['type'] == 'pgsql') {
                define('phpAds_dbmsname', 'Postgres');
            }
        }
    }
}
示例#4
0
/**
 * Setup common variables
 */
function setupConfigVariables()
{
    $GLOBALS['_MAX']['CONF'] = parseIniFile();
}
示例#5
0
<?php

function parseIniFile($iIniFile)
{
    $aResult = $aMatches = array();
    $a =& $aResult;
    $s = '\\s*([[:alnum:]_\\- \\*]+?)\\s*';
    preg_match_all('#^\\s*((\\[' . $s . '\\])|(("?)' . $s . '\\5\\s*=\\s*("?)(.*?)\\7))\\s*(;[^\\n]*?)?$#ms', @file_get_contents($iIniFile), $aMatches, PREG_SET_ORDER);
    foreach ($aMatches as $aMatch) {
        if (empty($aMatch[2])) {
            $a[$aMatch[6]] = $aMatch[8];
        } else {
            $a =& $aResult[$aMatch[3]];
        }
    }
    return $aResult;
}
$ini = parseIniFile('ver.ini');
$u['ver'] = $ini['ver']['ver'];
$u['log'] = $ini['ver']['log'];
if (!file_exists("RenoCon.apk")) {
    $u['ver'] = "0.0.0";
}
echo json_encode($u);
示例#6
0
 /**
  * A method for writing out the OpenX configuration .conf.php file(s),
  * including any changes that have been made to the configuration in the
  * current object.
  *
  * Configuration files are prefixed with the host name being used to access
  * Openads, so that multiple OpenX installations can be run from a single
  * code base, if the correct virtual hosts are configured.
  *
  * @param string $configPath The directory to save the config file(s) in.
  *                           Default is Max's /var directory.
  * @param string $configFile The configuration file name (eg. "geotargeting").
  *                           Default is no name (ie. the main Max
  *                           configuration file).
  * @param boolean $reParse   If the config file should be parsed again
  *                           after writing (default is true).
  *
  * @return boolean True when the configuration file(s) was (were)
  *                 correctly written out, false otherwise.
  */
 function writeConfigChange($configPath = null, $configFile = null, $reParse = true)
 {
     if (is_null($configPath)) {
         $configPath = MAX_PATH . '/var';
     }
     if (!is_null($configFile)) {
         $configFile = '.' . $configFile;
     }
     if (defined('TEST_ENVIRONMENT_RUNNING') && empty($GLOBALS['override_TEST_ENVIRONMENT_RUNNING'])) {
         // Special case! The test environment is running, so just write the
         // configuration to the test configuration file...
         $testConfigFile = $configPath . '/test.conf.php';
         $result = $this->writeConfigArrayToFile($testConfigFile, $this->aConf);
         if (!$result) {
             return false;
         }
         // Re-parse the config file?
         if ($reParse) {
             $GLOBALS['_MAX']['CONF'] = @parse_ini_file($testConfigFile, true);
             $this->aConf = $GLOBALS['_MAX']['CONF'];
             // Set the global $conf value -- normally set by the init
             // script -- to be the same as $GLOBALS['_MAX']['CONF']
             global $conf;
             $conf = $GLOBALS['_MAX']['CONF'];
         }
         return true;
     }
     // What were the old host names used for the installation?
     $aConf = $GLOBALS['_MAX']['CONF'];
     $url = @parse_url('http://' . $aConf['webpath']['admin']);
     $oldAdminHost = $url['host'];
     $url = @parse_url('http://' . $aConf['webpath']['delivery']);
     $oldDeliveryHost = $url['host'];
     $url = @parse_url('http://' . $aConf['webpath']['deliverySSL']);
     $oldDeliverySslHost = $url['host'];
     // What are the new host names used for the installation?
     $url = @parse_url('http://' . $this->aConf['webpath']['admin']);
     $newAdminHost = $url['host'];
     $url = @parse_url('http://' . $this->aConf['webpath']['delivery']);
     $newDeliveryHost = $url['host'];
     $url = @parse_url('http://' . $this->aConf['webpath']['deliverySSL']);
     $newDeliverySslHost = $url['host'];
     // Prepare config arrays
     $adminConfig = $deliverySslConfig = array('realConfig' => $newDeliveryHost);
     $adminConfigChanged = false;
     $mainConfig = array();
     // Has the use changed from a single host to a multi-host setup?
     if ($newDeliveryHost != $oldDeliveryHost && ($oldDeliveryHost = $oldAdminHost)) {
         $adminConfigChanged = true;
     }
     // Collect any values from existing wrapper config files
     if (!$adminConfigChanged && $newDeliveryHost != $oldAdminHost && file_exists($configPath . '/' . $oldAdminHost . '.conf.php')) {
         $adminConfig = @parse_ini_file($configPath . '/' . $oldAdminHost . '.conf.php', true);
         // (re)set the realConfig for the admin conf file
         if (isset($adminConfig['realConfig'])) {
             $adminConfig['realConfig'] = $newDeliveryHost;
         } else {
             // Have to do this array_merge because just setting $adminConfig['realConfig'] puts the value in to the wrong place in the wrapper config file
             $adminConfig = array_merge(array('realConfig' => $newDeliveryHost), $adminConfig);
         }
     }
     if (file_exists($configPath . '/' . $oldDeliveryHost . $configFile . '.conf.php')) {
         $mainConfig = @parse_ini_file($configPath . '/' . $oldDeliveryHost . $configFile . '.conf.php', true);
     } else {
         // No config file exists, use the aConf array
         $mainConfig = $this->aConf;
     }
     // Clear any persisting realConfig value in the primary config file
     // (in case we are changing URL paths?)
     unset($mainConfig['realConfig']);
     // Iterate over the changes to be written out, check if a value is being
     // overridden in the UI wrapper config file, ensure that it gets changed
     // _there_, additionally, write only changes/new items to the delivery
     // config file, not the in-memory merged array
     foreach ($this->aConf as $section => $sectionArray) {
         // Compare the value to be written against that in memory
         // (merged admin/delivery configs)
         if (is_array($aConf[$section])) {
             $sectionDiff = array_diff_assoc($this->aConf[$section], $aConf[$section]);
             foreach ($sectionDiff as $configKey => $configValue) {
                 if (isset($adminConfig[$section][$configKey])) {
                     // This setting exists in the wrapper config file,
                     // change its value there
                     $adminConfig[$section][$configKey] = $configValue;
                     $adminConfigChanged = true;
                 } else {
                     // This setting doesn't exist in the wrapper config
                     // file, change it in the delivery config file only
                     $mainConfig[$section][$configKey] = $configValue;
                 }
             }
         } else {
             // This section didn't/doesnt exist in the in-memory array,
             // assume it is a new section and write to the delivery conf
             // file
             $mainConfig[$section] = $this->aConf[$section];
         }
         // Check if any of the in-memory items have been removed from the
         // $this->aConf array, and remove them from the appropriate file if
         // necessary
         if (is_array($aConf[$section]) && is_array($this->aConf[$section])) {
             $reverseDiff = array_diff(array_keys($aConf[$section]), array_keys($this->aConf[$section]));
             foreach ($reverseDiff as $deletedSectionKey) {
                 if (isset($adminConfig[$section][$deletedSectionKey])) {
                     // This setting exists in the wrapper config file,
                     // remove it from there
                     unset($adminConfig[$section][$deletedSectionKey]);
                     if (count($adminConfig[$section]) == 0) {
                         unset($adminConfig[$section]);
                     }
                     $adminConfigChanged = true;
                 } else {
                     // This setting doesn't exist in the wrapper config
                     // file, remove it from the delivery config file only
                     unset($mainConfig[$section][$deletedSectionKey]);
                     if (count($mainConfig[$section]) == 0) {
                         unset($mainConfig[$section]);
                     }
                 }
             }
         }
     }
     // Write out the new main configuration file
     $mainConfigFile = $configPath . '/' . $newDeliveryHost . $configFile . '.conf.php';
     if (!$this->writeConfigArrayToFile($mainConfigFile, $mainConfig)) {
         return false;
     }
     // Check if a different host name is used for the admin
     if ($newAdminHost != $newDeliveryHost) {
         // Write out the new "fake" configuration file
         $file = $configPath . '/' . $newAdminHost . $configFile . '.conf.php';
         // Only write out the wrapper config files if a) it doesn't exist already, or b) the value changed was in the wrapper file already
         if (!file_exists($file) || $adminConfigChanged) {
             if (!$this->writeConfigArrayToFile($file, $adminConfig)) {
                 return false;
             }
         }
     }
     // Check if a different host name is used for the delivery SSL
     if ($newDeliverySslHost != $newDeliveryHost) {
         // Write out the new "fake" configuration file
         $file = $configPath . '/' . $newDeliverySslHost . $configFile . '.conf.php';
         if (!file_exists($file)) {
             if (!$this->writeConfigArrayToFile($file, $deliverySslConfig)) {
                 return false;
             }
         }
     }
     // Always touch the INSTALLED file
     if (!file_exists(MAX_PATH . '/var/INSTALLED') && !touch(MAX_PATH . '/var/INSTALLED')) {
         return false;
     }
     // Do any old configuration files need to be deleted?
     if (!is_null($oldAdminHost) && $newAdminHost != $oldAdminHost) {
         $file = $configPath . '/' . $oldAdminHost . $configFile . '.conf.php';
         if ($file != $mainConfigFile) {
             @unlink($file);
         }
     }
     if (!is_null($oldDeliveryHost) && $newDeliveryHost != $oldDeliveryHost && $oldDeliveryHost != $newAdminHost) {
         $file = $configPath . '/' . $oldDeliveryHost . $configFile . '.conf.php';
         if ($file != $mainConfigFile) {
             @unlink($file);
         }
     }
     if (!is_null($oldDeliverySslHost) && $newDeliverySslHost != $oldDeliverySslHost && $oldDeliverySslHost != $newAdminHost) {
         $file = $configPath . '/' . $oldDeliverySslHost . $configFile . '.conf.php';
         if ($file != $mainConfigFile) {
             @unlink($file);
         }
     }
     // If the main (delivery) conf file changed or if there are any un-accounted for
     // config files in the var directory, don't write a default.conf.php file
     $aOtherConfigFiles = $this->findOtherConfigFiles($configPath, $configFile);
     if ($oldDeliveryHost != $newDeliveryHost || empty($aOtherConfigFiles)) {
         $file = $configPath . '/default' . $configFile . '.conf.php';
         $aConfig = array('realConfig' => $newDeliveryHost);
         if (!$this->writeConfigArrayToFile($file, $aConfig)) {
             OA::debug('Unable to write default.conf.php file (check file/folder permissions', PEAR_LOG_DEBUG);
         }
     } else {
         OA::debug('Did not create a default.conf.php file due to the presence of:' . implode(', ', $aOtherConfigFiles), PEAR_LOG_DEBUG);
     }
     // Re-parse the config file?
     if ($reParse) {
         if (!is_null($configFile)) {
             // The code above will have prefixed a '.' to the configFile value, strip it off before passing along
             $configFile = substr($configFile, 1);
         }
         $GLOBALS['_MAX']['CONF'] = parseIniFile($configPath, $configFile);
         $this->aConf = $GLOBALS['_MAX']['CONF'];
         // Set the global $conf value -- normally set by the init
         // script -- to be the same as $GLOBALS['_MAX']['CONF']
         global $conf;
         $conf = $GLOBALS['_MAX']['CONF'];
     }
     return true;
 }
示例#7
0
/**
 * The general (non-delivery engine) function to parse the configuration .ini file
 *
 * @param string $configPath The directory to load the config file from.
 *                           Default is Max's /var directory.
 * @param string $configFile The configuration file name (eg. "geotargeting").
 *                           Default is no name (ie. the main Max
 *                           configuration file).
 * @param boolean $sections  Process sections, as per parse_ini_file().
 * @param string  $type      The config file type value (eg. ".php"). Allows BC
 *                           support for old ".ini" files.
 *
 * @return mixed The array resulting from the call to parse_ini_file(), with
 *               the appropriate .php file for the installation.
 */
function parseIniFile($configPath = null, $configFile = null, $sections = true, $type = '.php')
{
    // Set up the configuration .ini file path location
    if (is_null($configPath)) {
        $configPath = MAX_PATH . '/var';
    }
    // Set up the configuration .ini file type name
    if (!is_null($configFile)) {
        $configFile = '.' . $configFile;
    }
    // Is this a web, or a cli call?
    if (is_null($configFile) && !isset($_SERVER['SERVER_NAME'])) {
        if (!isset($GLOBALS['argv'][1]) && !file_exists($configPath . '/default' . $configFile . '.conf' . $type)) {
            echo MAX_PRODUCT_NAME . " was called via the command line, but had no host as a parameter.\n";
            exit(1);
        }
        $host = trim($GLOBALS['argv'][1]);
    } else {
        $host = OX_getHostName();
    }
    // Is the system running the test environment?
    if (is_null($configFile) && defined('TEST_ENVIRONMENT_RUNNING')) {
        // Does the test environment config exist?
        $testFilePath = $configPath . '/test.conf' . $type;
        if (file_exists($testFilePath)) {
            return @parse_ini_file($testFilePath, $sections);
        } else {
            // Define a value so that we know the testing environment is not
            // configured, so that the TestRenner class knows not to run any
            // tests, and return an empty config
            define('TEST_ENVIRONMENT_NO_CONFIG', true);
            return array();
        }
    }
    // Is the .ini file for the hostname being used directly accessible?
    if (file_exists($configPath . '/' . $host . $configFile . '.conf' . $type)) {
        // Parse the configuration file
        $conf = @parse_ini_file($configPath . '/' . $host . $configFile . '.conf' . $type, $sections);
        // Is this a real config file?
        if (!isset($conf['realConfig'])) {
            // Yes, return the parsed configuration file
            return $conf;
        }
        // Parse and return the real configuration .ini file
        if (file_exists($configPath . '/' . $conf['realConfig'] . $configFile . '.conf' . $type)) {
            $realConfig = @parse_ini_file(MAX_PATH . '/var/' . $conf['realConfig'] . '.conf' . $type, true);
            $mergedConf = mergeConfigFiles($realConfig, $conf);
            // if not multiple levels of configs
            if (!isset($mergedConf['realConfig'])) {
                return $mergedConf;
            }
        }
    } elseif ($configFile === '.plugin') {
        // For plugins, if no configuration file is found, return the sane default values
        $pluginType = basename($configPath);
        $defaultConfig = MAX_PATH . '/plugins/' . $pluginType . '/default.plugin.conf' . $type;
        if (file_exists($defaultConfig)) {
            return parse_ini_file($defaultConfig, $sections);
        } else {
            echo MAX_PRODUCT_NAME . " could not read the default configuration file for the {$pluginType} plugin";
            exit(1);
        }
    }
    // Check for a default.conf.php file...
    if (file_exists($configPath . '/default' . $configFile . '.conf' . $type)) {
        // Parse the configuration file
        $conf = @parse_ini_file($configPath . '/default' . $configFile . '.conf' . $type, $sections);
        // Is this a real config file?
        if (!isset($conf['realConfig'])) {
            // Yes, return the parsed configuration file
            return $conf;
        }
        // Parse and return the real configuration .ini file
        if (file_exists($configPath . '/' . $conf['realConfig'] . $configFile . '.conf' . $type)) {
            $realConfig = @parse_ini_file(MAX_PATH . '/var/' . $conf['realConfig'] . '.conf' . $type, true);
            $mergedConf = mergeConfigFiles($realConfig, $conf);
            // if not multiple levels of configs
            if (!isset($mergedConf['realConfig'])) {
                return $mergedConf;
            }
        }
    }
    // Got all this way, and no configuration file yet found - maybe
    // the user is upgrading from an old version where the config
    // files have a .ini prefix instead of .php...
    global $installing;
    if ($installing) {
        // ah but MMM might be installed, check for the ini file
        if (file_exists($configPath . '/' . $host . $configFile . '.conf.ini')) {
            return parseIniFile($configPath, $configFile, $sections, '.ini');
        }
        if (!$configFile) {
            // OpenX hasn't been installed, so use the distribution .ini file
            // this deals with letting a PAN install get into the ugprader
            return @parse_ini_file(MAX_PATH . '/etc/dist.conf.php', $sections);
        }
        //return parseIniFile($configPath, $configFile, $sections, '.ini');
    }
    // Check to ensure OpenX hasn't been installed
    if (file_exists(MAX_PATH . '/var/INSTALLED')) {
        // ah but MMM might be installed, check for the ini file
        if (file_exists($configPath . '/' . $host . $configFile . '.conf.ini')) {
            return parseIniFile($configPath, $configFile, $sections, '.ini');
        }
        echo MAX_PRODUCT_NAME . " has been installed, but no configuration file " . $configPath . '/' . $host . $configFile . '.conf.php' . " was found.\n";
        exit(1);
    }
    // OpenX hasn't been installed, so use the distribution .ini file
    return @parse_ini_file(MAX_PATH . '/etc/dist.conf.php', $sections);
}