mirror of
https://github.com/Pathduck/gallery3.git
synced 2026-05-13 07:59:24 -04:00
239 lines
6.4 KiB
PHP
Executable File
239 lines
6.4 KiB
PHP
Executable File
#!/usr/bin/php -f
|
|
<?php
|
|
define('EXT', '.php');
|
|
define("DOCROOT", realpath("../") . "/");
|
|
define("VARPATH", DOCROOT . "var/");
|
|
|
|
// Define application and system paths
|
|
define("SYSPATH", DOCROOT . "system/");
|
|
define('APPPATH', DOCROOT . "application/");
|
|
define('MODPATH', DOCROOT . "modules/");
|
|
define('THEMEPATH', DOCROOT . "themes/");
|
|
|
|
$modules_list = null;
|
|
$active_modules = null;
|
|
|
|
function setup($config) {
|
|
system("rm -rf tmp");
|
|
mkdir("tmp");
|
|
|
|
// Lets backup the database
|
|
$conn = $config["connection"];
|
|
do_system("mysqldump -u{$conn['user']} -p{$conn['pass']} -h{$conn['host']} --add-drop-table " .
|
|
"--compact {$conn['database']} > tmp/dump.sql");
|
|
|
|
$db = Database::instance();
|
|
// Drop all tables
|
|
foreach ($db->list_tables() as $table) {
|
|
$db->query("DROP TABLE IF EXISTS `$table`");
|
|
}
|
|
|
|
// Now the var directory
|
|
rename (VARPATH, realpath("tmp/var"));
|
|
mkdir(VARPATH);
|
|
copy(realpath("tmp/var/database.php"), VARPATH . "database.php");
|
|
|
|
$db->clear_cache();
|
|
$modules_list = module::$modules;
|
|
$active_modules = module::$active;
|
|
|
|
module::$modules = array();
|
|
module::$active = array();
|
|
|
|
// Use a known random seed so that subsequent packaging runs will reuse the same random
|
|
// numbers, keeping our install.sql file more stable.
|
|
srand(0);
|
|
}
|
|
|
|
function reset_install($config) {
|
|
// Reset the var path
|
|
system("rm -rf " . VARPATH);
|
|
rename (realpath("tmp/var"), VARPATH);
|
|
|
|
$db = Database::instance();
|
|
// Drop all tables
|
|
foreach ($db->list_tables() as $table) {
|
|
$db->query("DROP TABLE IF EXISTS `$table`");
|
|
}
|
|
|
|
// Lets restorep the database
|
|
$conn = $config["connection"];
|
|
do_system("mysql -u{$conn['user']} -p{$conn['pass']} {$conn['database']} " .
|
|
" < tmp/dump.sql");
|
|
|
|
// Clear any database caching
|
|
$db->clear_cache();
|
|
|
|
module::$modules = $modules_list;
|
|
module::$active = $active_modules;
|
|
}
|
|
|
|
function do_system($command) {
|
|
exec($command, $output, $status);
|
|
if ($status) {
|
|
throw new Exception("$command\nFailed to dump database\n" . implode("\n", $output));
|
|
}
|
|
}
|
|
|
|
function kohana_bootstrap() {
|
|
define('KOHANA_VERSION', '2.3.3');
|
|
define('KOHANA_CODENAME', 'aegolius');
|
|
|
|
// Test of Kohana is running in Windows
|
|
define('KOHANA_IS_WIN', DIRECTORY_SEPARATOR === '\\');
|
|
|
|
// Kohana benchmarks are prefixed to prevent collisions
|
|
define('SYSTEM_BENCHMARK', 'system_benchmark');
|
|
|
|
// Load benchmarking support
|
|
require SYSPATH.'core/Benchmark'.EXT;
|
|
|
|
// Start total_execution
|
|
Benchmark::start(SYSTEM_BENCHMARK.'_total_execution');
|
|
|
|
// Start kohana_loading
|
|
Benchmark::start(SYSTEM_BENCHMARK.'_kohana_loading');
|
|
|
|
// Load core files
|
|
require SYSPATH.'core/utf8'.EXT;
|
|
require SYSPATH.'core/Event'.EXT;
|
|
require SYSPATH.'core/Kohana'.EXT;
|
|
|
|
// Prepare the environment
|
|
Kohana::setup();
|
|
// End kohana_loading
|
|
Benchmark::stop(SYSTEM_BENCHMARK.'_kohana_loading');
|
|
|
|
// Prepare the system
|
|
Event::run('system.ready');
|
|
|
|
// Clean up and exit (this basically shuts down output buffering
|
|
Event::run('system.shutdown');
|
|
}
|
|
|
|
function install() {
|
|
gallery_installer::install(true);
|
|
module::load_modules();
|
|
|
|
foreach (array("user", "comment", "organize", "info", "rss",
|
|
"search", "slideshow", "tag") as $module_name) {
|
|
module::install($module_name);
|
|
module::activate($module_name);
|
|
}
|
|
}
|
|
|
|
function dump_database() {
|
|
// We now have a clean install with just the packages that we want. Make sure that the
|
|
// database is clean too.
|
|
$db = Database::instance();
|
|
$db->query("TRUNCATE {sessions}");
|
|
$db->query("TRUNCATE {logs}");
|
|
$db->query("DELETE FROM {vars} WHERE `module_name` = 'gallery' AND `name` = '_cache'");
|
|
$db->update("users", array("password" => ""), array("id" => 1));
|
|
$db->update("users", array("password" => ""), array("id" => 2));
|
|
|
|
$dbconfig = Kohana::config('database.default');
|
|
$conn = $dbconfig["connection"];
|
|
$pass = $conn["pass"] ? "-p{$conn['pass']}" : "";
|
|
$sql_file = DOCROOT . "installer/install.sql";
|
|
if (!is_writable($sql_file)) {
|
|
throw new Exception("$sql_file is not writeable");
|
|
return;
|
|
}
|
|
do_system("mysqldump --compact --add-drop-table -h{$conn['host']} " .
|
|
"-u{$conn['user']} $pass {$conn['database']} > $sql_file");
|
|
|
|
// Post-process the sql file
|
|
$buf = "";
|
|
$root = ORM::factory("item", 1);
|
|
$root_created_timestamp = $root->created;
|
|
$root_updated_timestamp = $root->updated;
|
|
foreach (file($sql_file) as $line) {
|
|
// Prefix tables
|
|
$line = preg_replace(
|
|
"/(CREATE TABLE|IF EXISTS|INSERT INTO) `{$dbconfig['table_prefix']}(\w+)`/", "\\1 {\\2}",
|
|
$line);
|
|
|
|
// Normalize dates
|
|
$line = preg_replace("/,$root_created_timestamp,/", ",UNIX_TIMESTAMP(),", $line);
|
|
$line = preg_replace("/,$root_updated_timestamp,/", ",UNIX_TIMESTAMP(),", $line);
|
|
$buf .= $line;
|
|
}
|
|
$fd = fopen($sql_file, "wb");
|
|
fwrite($fd, $buf);
|
|
fclose($fd);
|
|
}
|
|
|
|
function dump_var() {
|
|
$objects = new RecursiveIteratorIterator(
|
|
new RecursiveDirectoryIterator(VARPATH),
|
|
RecursiveIteratorIterator::SELF_FIRST);
|
|
|
|
$var_file = DOCROOT . "installer/init_var.php";
|
|
if (!is_writable($var_file)) {
|
|
throw new Exception("$var_file is not writeable");
|
|
return;
|
|
}
|
|
|
|
$paths = array();
|
|
foreach($objects as $name => $file) {
|
|
if ($file->getBasename() == "database.php") {
|
|
continue;
|
|
} else if (basename($file->getPath()) == "logs") {
|
|
continue;
|
|
}
|
|
|
|
if ($file->isDir()) {
|
|
$paths[] = "VARPATH . \"" . substr($name, strlen(VARPATH)) . "\"";
|
|
} else {
|
|
// @todo: serialize non-directories
|
|
throw new Exception("Unknown file: $name");
|
|
}
|
|
}
|
|
// Sort the paths so that the var file is stable
|
|
sort($paths);
|
|
|
|
$fd = fopen($var_file, "w");
|
|
fwrite($fd, "<?php defined(\"SYSPATH\") or die(\"No direct script access.\") ?>\n");
|
|
fwrite($fd, "<?php\n");
|
|
foreach ($paths as $path) {
|
|
fwrite($fd, "!file_exists($path) && mkdir($path);\n");
|
|
}
|
|
fclose($fd);
|
|
}
|
|
|
|
// Bootstrap kohana so we can use it as we need it
|
|
kohana_bootstrap();
|
|
|
|
$config = Kohana::config("database.default");
|
|
|
|
try {
|
|
// Empty the tmp directory, backup the database, and copy the var directory
|
|
setup($config);
|
|
} catch (Exception $e) {
|
|
print $e->getTrace();
|
|
return;
|
|
}
|
|
|
|
try {
|
|
// Install the standard modules
|
|
install();
|
|
|
|
// Dump the empty gallery3 database and format it for the installer
|
|
dump_database();
|
|
|
|
// Dump the var directory
|
|
dump_var();
|
|
} catch (Exception $e) {
|
|
print $e->getTrace();
|
|
}
|
|
|
|
try {
|
|
// Reset the Gallery3 installation
|
|
reset_install($config);
|
|
} catch (Exception $e) {
|
|
print $e->getTrace();
|
|
}
|
|
|
|
system("rm -rf tmp");
|
|
?>
|