$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();
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] }