Example #1
0
$wgDBdevboxUser = '******';
$wgDBdevboxPass = '******';
$wgDBdevboxServer1 = 'dev-db-a1';
$wgDBdevboxServer2 = 'dev-db-b1';
$wgControlPageID = 6741;
$wgDatabaseDirectories = array("database_A", "database_B", "database_C");
$USAGE = "Usage:\tphp syncDevData.php\n";
$wikis = what_to_sync();
find_dumps(&$wikis);
foreach ($wikis as $name => $detail) {
    echo "\n== Importing new content for {$name} ==\n";
    // See if the dump is newer and if not skip it
    if (!needs_update($name, $detail)) {
        continue;
    }
    $file = save_dump($name, $detail);
    import_dump($name, $detail, $file);
}
/******************************************************************************/
function what_to_sync()
{
    global $wgDBdevboxServer2, $wgDBdevboxUser, $wgDBdevboxPass, $wgControlPageID;
    // DBs to sync are reprented as links from page $wgControlPageID.  The
    // pages don't have exist and just have to be named Sync:DBNAME
    $response = `mysql -h{$wgDBdevboxServer2} -u{$wgDBdevboxUser} -p{$wgDBdevboxPass} devbox -s -N -e "select pl_title from pagelinks where pl_from = {$wgControlPageID}"`;
    // Skip any links that don't start with Sync: and strip the Sync: off the
    // links that do match
    $dbnames = array();
    foreach (explode("\n", $response) as $name) {
        if (preg_match('/^Sync:(.+)$/', $name, $matches)) {
            $dbnames[$matches[1]] = array();
Example #2
0
function IniConfig($file)
{
    // check config/config.php dump for faster startup
    $dump = substr($file, 0, -3) . "php";
    if (isWindows($dump)) {
        $dump = str_replace("/", "\\", $dump);
    }
    if (file_exists($dump) and is_readable($dump) and sort_file_mtime($dump, $file) < 0) {
        @(include $dump);
        if (function_exists('wiki_configrestore') and wiki_configrestore() === 'noerr') {
            fixup_dynamic_configs();
            return;
        }
    }
    // First-time installer detection here...
    // Similar to SetupWiki()
    if (!file_exists($file)) {
        // We need to DATA_PATH for configurator, or pass the posted values
        // somewhow to the script
        include_once dirname(__FILE__) . "/install.php";
        run_install("_part1");
        if (!defined("_PHPWIKI_INSTALL_RUNNING")) {
            trigger_error("Datasource file '{$file}' does not exist", E_USER_ERROR);
        }
        exit;
    }
    // List of all valid config options to be define()d which take "values" (not
    // booleans). Needs to be categorised, and generally made a lot tidier.
    $_IC_VALID_VALUE = array('WIKI_NAME', 'ADMIN_USER', 'ADMIN_PASSWD', 'DEFAULT_DUMP_DIR', 'HTML_DUMP_DIR', 'HTML_DUMP_SUFFIX', 'MAX_UPLOAD_SIZE', 'MINOR_EDIT_TIMEOUT', 'ACCESS_LOG', 'CACHE_CONTROL', 'CACHE_CONTROL_MAX_AGE', 'COOKIE_EXPIRATION_DAYS', 'COOKIE_DOMAIN', 'PASSWORD_LENGTH_MINIMUM', 'USER_AUTH_POLICY', 'GROUP_METHOD', 'EDITING_POLICY', 'THEME', 'CHARSET', 'WIKI_PGSRC', 'DEFAULT_WIKI_PGSRC', 'ALLOWED_PROTOCOLS', 'INLINE_IMAGES', 'SUBPAGE_SEPARATOR', 'DATABASE_OPTIMISE_FREQUENCY', 'INTERWIKI_MAP_FILE', 'COPYRIGHTPAGE_TITLE', 'COPYRIGHTPAGE_URL', 'AUTHORPAGE_TITLE', 'AUTHORPAGE_URL', 'WIKI_NAME_REGEXP', 'PLUGIN_CACHED_DATABASE', 'PLUGIN_CACHED_FILENAME_PREFIX', 'PLUGIN_CACHED_HIGHWATER', 'PLUGIN_CACHED_LOWWATER', 'PLUGIN_CACHED_MAXLIFETIME', 'PLUGIN_CACHED_MAXARGLEN', 'PLUGIN_CACHED_IMGTYPES', 'SERVER_NAME', 'SERVER_PORT', 'SCRIPT_NAME', 'DATA_PATH', 'PHPWIKI_DIR', 'VIRTUAL_PATH');
    // Optional values which need to be defined.
    // These are not defined in config-default.ini and empty if not defined.
    $_IC_OPTIONAL_VALUE = array('DEBUG', 'TEMP_DIR', 'DEFAULT_LANGUAGE', 'LDAP_AUTH_HOST', 'LDAP_SET_OPTION', 'LDAP_BASE_DN', 'LDAP_AUTH_USER', 'LDAP_AUTH_PASSWORD', 'LDAP_SEARCH_FIELD', 'LDAP_OU_GROUP', 'LDAP_OU_USERS', 'AUTH_USER_FILE', 'DBAUTH_AUTH_DSN', 'IMAP_AUTH_HOST', 'POP3_AUTH_HOST', 'AUTH_USER_FILE', 'AUTH_GROUP_FILE', 'AUTH_SESS_USER', 'AUTH_SESS_LEVEL', 'GOOGLE_LICENSE_KEY', 'FORTUNE_DIR', 'DISABLE_GETIMAGESIZE', 'DBADMIN_USER', 'DBADMIN_PASSWD', 'SESSION_SAVE_PATH', 'TOOLBAR_PAGELINK_PULLDOWN', 'TOOLBAR_TEMPLATE_PULLDOWN', 'EXTERNAL_LINK_TARGET', 'ACCESS_LOG_SQL', 'ENABLE_MARKUP_TEMPLATE');
    // List of all valid config options to be define()d which take booleans.
    $_IC_VALID_BOOL = array('ENABLE_USER_NEW', 'ENABLE_PAGEPERM', 'ENABLE_EDIT_TOOLBAR', 'JS_SEARCHREPLACE', 'ENABLE_XHTML_XML', 'ENABLE_DOUBLECLICKEDIT', 'ENABLE_LIVESEARCH', 'USECACHE', 'WIKIDB_NOCACHE_MARKUP', 'ENABLE_REVERSE_DNS', 'ENCRYPTED_PASSWD', 'ZIPDUMP_AUTH', 'ENABLE_RAW_HTML', 'ENABLE_RAW_HTML_LOCKEDONLY', 'ENABLE_RAW_HTML_SAFE', 'STRICT_MAILABLE_PAGEDUMPS', 'COMPRESS_OUTPUT', 'ALLOW_ANON_USER', 'ALLOW_ANON_EDIT', 'ALLOW_BOGO_LOGIN', 'ALLOW_USER_PASSWORDS', 'AUTH_USER_FILE_STORABLE', 'ALLOW_HTTP_AUTH_LOGIN', 'ALLOW_USER_LOGIN', 'ALLOW_LDAP_LOGIN', 'ALLOW_IMAP_LOGIN', 'WARN_NONPUBLIC_INTERWIKIMAP', 'USE_PATH_INFO', 'DISABLE_HTTP_REDIRECT', 'PLUGIN_CACHED_USECACHE', 'PLUGIN_CACHED_FORCE_SYNCMAP', 'BLOG_EMPTY_DEFAULT_PREFIX', 'DATABASE_PERSISTENT', 'ENABLE_DISCUSSION_LINK', 'ENABLE_CAPTCHA', 'USE_CAPTCHA_RANDOM_WORD');
    $rs = @parse_ini_file($file);
    $rsdef = @parse_ini_file(dirname(__FILE__) . "/../config/config-default.ini");
    foreach ($rsdef as $k => $v) {
        if (defined($k)) {
            $rs[$k] = constant($k);
        } elseif (!isset($rs[$k])) {
            $rs[$k] = $v;
        }
    }
    unset($k);
    unset($v);
    foreach ($_IC_VALID_VALUE as $item) {
        if (defined($item)) {
            unset($rs[$item]);
            continue;
        }
        if (array_key_exists($item, $rs)) {
            define($item, $rs[$item]);
            unset($rs[$item]);
            //} elseif (array_key_exists($item, $rsdef)) {
            //    define($item, $rsdef[$item]);
            // calculate them later or not at all:
        } elseif (in_array($item, array('DATABASE_PREFIX', 'SERVER_NAME', 'SERVER_PORT', 'SCRIPT_NAME', 'DATA_PATH', 'PHPWIKI_DIR', 'VIRTUAL_PATH', 'LDAP_AUTH_HOST', 'IMAP_AUTH_HOST', 'POP3_AUTH_HOST', 'PLUGIN_CACHED_CACHE_DIR'))) {
        } elseif (!defined("_PHPWIKI_INSTALL_RUNNING")) {
            trigger_error(sprintf("missing config setting for %s", $item));
        }
    }
    unset($item);
    // Boolean options are slightly special - if they're set to any of
    // '', 'false', '0', or 'no' (all case-insensitive) then the value will
    // be a boolean false, otherwise if there is anything set it'll
    // be true.
    foreach ($_IC_VALID_BOOL as $item) {
        if (defined($item)) {
            unset($rs[$item]);
            continue;
        }
        if (array_key_exists($item, $rs)) {
            $val = $rs[$item];
            //} elseif (array_key_exists($item, $rsdef)) {
            //    $val = $rsdef[$item];
        } else {
            $val = false;
            //trigger_error(sprintf("missing boolean config setting for %s",$item));
        }
        // calculate them later: old or dynamic constants
        if (!array_key_exists($item, $rs) and in_array($item, array('USE_PATH_INFO', 'USE_DB_SESSION', 'ALLOW_HTTP_AUTH_LOGIN', 'ALLOW_LDAP_LOGIN', 'ALLOW_IMAP_LOGIN', 'ALLOW_USER_LOGIN', 'REQUIRE_SIGNIN_BEFORE_EDIT', 'WIKIDB_NOCACHE_MARKUP', 'COMPRESS_OUTPUT'))) {
        } elseif (!$val) {
            define($item, false);
        } elseif (strtolower($val) == 'false' || strtolower($val) == 'no' || $val == '' || $val == false || $val == '0') {
            define($item, false);
        } else {
            define($item, true);
        }
        unset($rs[$item]);
    }
    unset($item);
    // Database
    global $DBParams;
    foreach (array('DATABASE_TYPE' => 'dbtype', 'DATABASE_DSN' => 'dsn', 'DATABASE_SESSION_TABLE' => 'db_session_table', 'DATABASE_DBA_HANDLER' => 'dba_handler', 'DATABASE_DIRECTORY' => 'directory', 'DATABASE_TIMEOUT' => 'timeout', 'DATABASE_PREFIX' => 'prefix') as $item => $k) {
        if (defined($item)) {
            $DBParams[$k] = constant($item);
            unset($rs[$item]);
        } elseif (array_key_exists($item, $rs)) {
            $DBParams[$k] = $rs[$item];
            define($item, $rs[$item]);
            unset($rs[$item]);
        } elseif (array_key_exists($item, $rsdef)) {
            $DBParams[$k] = $rsdef[$item];
            define($item, $rsdef[$item]);
            unset($rsdef[$item]);
        }
    }
    if (!in_array(DATABASE_TYPE, array('SQL', 'ADODB', 'PDO', 'dba', 'file', 'cvs'))) {
        trigger_error(sprintf("Invalid DATABASE_TYPE=%s. Choose one of %s", DATABASE_TYPE, "SQL,ADODB,PDO,dba,file,cvs"), E_USER_ERROR);
    }
    if (DATABASE_TYPE == 'PDO') {
        if (!check_php_version(5)) {
            trigger_error("Invalid DATABASE_TYPE=PDO. PDO requires at least php-5.0!", E_USER_ERROR);
        }
        // try to load it dynamically (unix only)
        if (!loadPhpExtension("pdo")) {
            echo $GLOBALS['php_errormsg'], "<br>\n";
            trigger_error(sprintf("dl() problem: Required extension '%s' could not be loaded!", "pdo"), E_USER_ERROR);
        }
    }
    // USE_DB_SESSION default logic:
    if (!defined('USE_DB_SESSION')) {
        if ($DBParams['db_session_table'] and in_array($DBParams['dbtype'], array('SQL', 'ADODB', 'PDO'))) {
            define('USE_DB_SESSION', true);
        } elseif ($DBParams['dbtype'] == 'dba' and check_php_version(4, 1, 2)) {
            define('USE_DB_SESSION', true);
            // Depends on db handler as well.
            // BerkeleyDB on older php has problems
            // with multiple db handles.
        } else {
            define('USE_DB_SESSION', false);
        }
    }
    unset($item);
    unset($k);
    // Expiry stuff
    global $ExpireParams;
    foreach (array('major', 'minor', 'author') as $major) {
        foreach (array('max_age', 'min_age', 'min_keep', 'keep', 'max_keep') as $max) {
            $item = strtoupper($major) . '_' . strtoupper($max);
            if (defined($item)) {
                $val = constant($item);
            } elseif (array_key_exists($item, $rs)) {
                $val = $rs[$item];
            } elseif (array_key_exists($item, $rsdef)) {
                $val = $rsdef[$item];
            }
            if (!isset($ExpireParams[$major])) {
                $ExpireParams[$major] = array();
            }
            $ExpireParams[$major][$max] = $val;
            unset($rs[$item]);
        }
    }
    unset($item);
    unset($major);
    unset($max);
    // User authentication
    if (!isset($GLOBALS['USER_AUTH_ORDER'])) {
        if (isset($rs['USER_AUTH_ORDER'])) {
            $GLOBALS['USER_AUTH_ORDER'] = preg_split('/\\s*:\\s*/', $rs['USER_AUTH_ORDER']);
        } else {
            $GLOBALS['USER_AUTH_ORDER'] = array("PersonalPage");
        }
    }
    // Now it's the external DB authentication stuff's turn
    if (in_array('Db', $GLOBALS['USER_AUTH_ORDER']) && empty($rs['DBAUTH_AUTH_DSN'])) {
        $rs['DBAUTH_AUTH_DSN'] = $DBParams['dsn'];
    }
    global $DBAuthParams;
    $DBAP_MAP = array('DBAUTH_AUTH_DSN' => 'auth_dsn', 'DBAUTH_AUTH_CHECK' => 'auth_check', 'DBAUTH_AUTH_USER_EXISTS' => 'auth_user_exists', 'DBAUTH_AUTH_CRYPT_METHOD' => 'auth_crypt_method', 'DBAUTH_AUTH_UPDATE' => 'auth_update', 'DBAUTH_AUTH_CREATE' => 'auth_create', 'DBAUTH_PREF_SELECT' => 'pref_select', 'DBAUTH_PREF_INSERT' => 'pref_insert', 'DBAUTH_PREF_UPDATE' => 'pref_update', 'DBAUTH_IS_MEMBER' => 'is_member', 'DBAUTH_GROUP_MEMBERS' => 'group_members', 'DBAUTH_USER_GROUPS' => 'user_groups');
    foreach ($DBAP_MAP as $rskey => $apkey) {
        if (defined($rskey)) {
            $DBAuthParams[$apkey] = constant($rskey);
        } elseif (isset($rs[$rskey])) {
            $DBAuthParams[$apkey] = $rs[$rskey];
            define($rskey, $rs[$rskey]);
        } elseif (isset($rsdef[$rskey])) {
            $DBAuthParams[$apkey] = $rsdef[$rskey];
            define($rskey, $rsdef[$rskey]);
        }
        unset($rs[$rskey]);
    }
    unset($rskey);
    unset($apkey);
    // TODO: Currently unsupported on non-SQL
    // CHECKME: PDO
    if (!defined('ACCESS_LOG_SQL')) {
        if (array_key_exists('ACCESS_LOG_SQL', $rs)) {
            // WikiDB_backend::isSql() not yet loaded
            if (!in_array(DATABASE_TYPE, array('SQL', 'ADODB', 'PDO'))) {
                // override false config setting on no SQL WikiDB database.
                define('ACCESS_LOG_SQL', 0);
            }
        } else {
            define('ACCESS_LOG_SQL', in_array(DATABASE_TYPE, array('SQL', 'ADODB', 'PDO')) ? 2 : 0);
        }
    }
    // optional values will be set to '' to simplify the logic.
    foreach ($_IC_OPTIONAL_VALUE as $item) {
        if (defined($item)) {
            unset($rs[$item]);
            continue;
        }
        if (array_key_exists($item, $rs)) {
            define($item, $rs[$item]);
            unset($rs[$item]);
        } else {
            define($item, '');
        }
    }
    unset($item);
    // LDAP bind options
    global $LDAP_SET_OPTION;
    if (defined('LDAP_SET_OPTION') and LDAP_SET_OPTION) {
        $optlist = preg_split('/\\s*:\\s*/', LDAP_SET_OPTION);
        foreach ($optlist as $opt) {
            $bits = preg_split('/\\s*=\\s*/', $opt, 2);
            if (count($bits) == 2) {
                if (is_string($bits[0]) and defined($bits[0])) {
                    $bits[0] = constant($bits[0]);
                }
                $LDAP_SET_OPTION[$bits[0]] = $bits[1];
            } else {
                // Possibly throw some sort of error?
            }
        }
        unset($opt);
        unset($bits);
    }
    // Default Wiki pages to force loading from pgsrc
    global $GenericPages;
    $GenericPages = preg_split('/\\s*:\\s*/', @$rs['DEFAULT_WIKI_PAGES']);
    // Wiki name regexp:  Should be a define(), but might needed to be changed at runtime
    // (different LC_CHAR need different posix classes)
    global $WikiNameRegexp;
    $WikiNameRegexp = constant('WIKI_NAME_REGEXP');
    if (!trim($WikiNameRegexp)) {
        $WikiNameRegexp = '(?<![[:alnum:]])(?:[[:upper:]][[:lower:]]+){2,}(?![[:alnum:]])';
    }
    // Got rid of global $KeywordLinkRegexp by using a TextSearchQuery instead
    // of "Category:Topic"
    if (!isset($rs['KEYWORDS'])) {
        $rs['KEYWORDS'] = @$rsdef['KEYWORDS'];
    }
    if (!isset($rs['KEYWORDS'])) {
        $rs['KEYWORDS'] = "Category* OR Topic*";
    }
    if ($rs['KEYWORDS'] == 'Category:Topic') {
        $rs['KEYWORDS'] = "Category* OR Topic*";
    }
    if (!defined('KEYWORDS')) {
        define('KEYWORDS', $rs['KEYWORDS']);
    }
    //if (empty($keywords)) $keywords = array("Category","Topic");
    //$KeywordLinkRegexp = '(?<=' . implode('|^', $keywords) . ')[[:upper:]].*$';
    // TODO: can this be a constant?
    global $DisabledActions;
    if (!array_key_exists('DISABLED_ACTIONS', $rs) and array_key_exists('DISABLED_ACTIONS', $rsdef)) {
        $rs['DISABLED_ACTIONS'] = @$rsdef['DISABLED_ACTIONS'];
    }
    if (array_key_exists('DISABLED_ACTIONS', $rs)) {
        $DisabledActions = preg_split('/\\s*:\\s*/', $rs['DISABLED_ACTIONS']);
    }
    global $PLUGIN_CACHED_IMGTYPES;
    $PLUGIN_CACHED_IMGTYPES = preg_split('/\\s*[|:]\\s*/', PLUGIN_CACHED_IMGTYPES);
    if (empty($rs['PLUGIN_CACHED_CACHE_DIR']) and !empty($rsdef['PLUGIN_CACHED_CACHE_DIR'])) {
        $rs['PLUGIN_CACHED_CACHE_DIR'] = $rsdef['PLUGIN_CACHED_CACHE_DIR'];
    }
    if (empty($rs['PLUGIN_CACHED_CACHE_DIR'])) {
        if (!empty($rs['INCLUDE_PATH'])) {
            @ini_set('include_path', $rs['INCLUDE_PATH']);
        }
        if (empty($rs['TEMP_DIR'])) {
            $rs['TEMP_DIR'] = "/tmp";
            if (getenv("TEMP")) {
                $rs['TEMP_DIR'] = getenv("TEMP");
            }
        }
        $rs['PLUGIN_CACHED_CACHE_DIR'] = $rs['TEMP_DIR'] . '/cache';
        if (!FindFile($rs['PLUGIN_CACHED_CACHE_DIR'], 1)) {
            // [29ms]
            FindFile($rs['TEMP_DIR'], false, 1);
            // TEMP must exist!
            mkdir($rs['PLUGIN_CACHED_CACHE_DIR'], 777);
        }
        // will throw an error if not exists.
        define('PLUGIN_CACHED_CACHE_DIR', FindFile($rs['PLUGIN_CACHED_CACHE_DIR'], false, 1));
    } else {
        define('PLUGIN_CACHED_CACHE_DIR', $rs['PLUGIN_CACHED_CACHE_DIR']);
        // will throw an error if not exists.
        FindFile(PLUGIN_CACHED_CACHE_DIR);
    }
    // process the rest of the config.ini settings:
    foreach ($rs as $item => $v) {
        if (defined($item)) {
            continue;
        } else {
            define($item, $v);
        }
    }
    unset($item);
    unset($v);
    unset($rs);
    unset($rsdef);
    fixup_static_configs($file);
    //[1ms]
    // Dump all globals and constants
    // The question is if reading this is faster then doing IniConfig() + fixup_static_configs()
    if (is_writable($dump)) {
        save_dump($dump);
    }
    // store locale[] in config.php? This is too problematic.
    fixup_dynamic_configs($file);
    // [100ms]
}