summaryrefslogtreecommitdiff
path: root/installer
diff options
context:
space:
mode:
Diffstat (limited to 'installer')
-rw-r--r--installer/.gitignore2
-rwxr-xr-xinstaller/install.sql4
-rwxr-xr-xinstaller/package.php239
3 files changed, 243 insertions, 2 deletions
diff --git a/installer/.gitignore b/installer/.gitignore
new file mode 100644
index 00000000..1c7be0fd
--- /dev/null
+++ b/installer/.gitignore
@@ -0,0 +1,2 @@
+# ignore the tmp directory if it is present
+tmp
diff --git a/installer/install.sql b/installer/install.sql
index 860d552c..7109236f 100755
--- a/installer/install.sql
+++ b/installer/install.sql
@@ -333,6 +333,6 @@ CREATE TABLE {vars} (
`value` text,
PRIMARY KEY (`id`),
UNIQUE KEY `module_name` (`module_name`,`name`)
-) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;
SET character_set_client = @saved_cs_client;
-INSERT INTO {vars} VALUES (1,'gallery','active_site_theme','default'),(2,'gallery','active_admin_theme','admin_default'),(3,'gallery','page_size','9'),(4,'gallery','thumb_size','200'),(5,'gallery','resize_size','640'),(6,'gallery','default_locale','en_US'),(7,'gallery','image_quality','75'),(9,'gallery','blocks_dashboard_sidebar','a:4:{i:1021536970;a:2:{i:0;s:7:\"gallery\";i:1;s:11:\"block_adder\";}i:62586177;a:2:{i:0;s:7:\"gallery\";i:1;s:5:\"stats\";}i:1314474428;a:2:{i:0;s:7:\"gallery\";i:1;s:13:\"platform_info\";}i:2072050158;a:2:{i:0;s:7:\"gallery\";i:1;s:12:\"project_news\";}}'),(14,'gallery','blocks_dashboard_center','a:4:{i:2103644216;a:2:{i:0;s:7:\"gallery\";i:1;s:7:\"welcome\";}i:1234407127;a:2:{i:0;s:7:\"gallery\";i:1;s:12:\"photo_stream\";}i:1844887955;a:2:{i:0;s:7:\"gallery\";i:1;s:11:\"log_entries\";}i:1497904257;a:2:{i:0;s:7:\"comment\";i:1;s:15:\"recent_comments\";}}'),(17,'gallery','version','3.0 pre-beta git'),(18,'gallery','choose_default_tookit','1'),(19,'gallery','credits','Powered by <a href=\"%url\">Gallery %version</a>'),(21,'comment','spam_caught','0');
+INSERT INTO {vars} VALUES (1,'gallery','active_site_theme','default'),(2,'gallery','active_admin_theme','admin_default'),(3,'gallery','page_size','9'),(4,'gallery','thumb_size','200'),(5,'gallery','resize_size','640'),(6,'gallery','default_locale','en_US'),(7,'gallery','image_quality','75'),(9,'gallery','blocks_dashboard_sidebar','a:4:{i:1804289383;a:2:{i:0;s:7:\"gallery\";i:1;s:11:\"block_adder\";}i:846930886;a:2:{i:0;s:7:\"gallery\";i:1;s:5:\"stats\";}i:1681692777;a:2:{i:0;s:7:\"gallery\";i:1;s:13:\"platform_info\";}i:1714636915;a:2:{i:0;s:7:\"gallery\";i:1;s:12:\"project_news\";}}'),(14,'gallery','blocks_dashboard_center','a:4:{i:1957747793;a:2:{i:0;s:7:\"gallery\";i:1;s:7:\"welcome\";}i:424238335;a:2:{i:0;s:7:\"gallery\";i:1;s:12:\"photo_stream\";}i:719885386;a:2:{i:0;s:7:\"gallery\";i:1;s:11:\"log_entries\";}i:1649760492;a:2:{i:0;s:7:\"comment\";i:1;s:15:\"recent_comments\";}}'),(17,'gallery','version','3.0 pre-beta git'),(18,'gallery','choose_default_tookit','1'),(19,'gallery','credits','Powered by <a href=\"%url\">Gallery %version</a>'),(21,'comment','spam_caught','0');
diff --git a/installer/package.php b/installer/package.php
new file mode 100755
index 00000000..591f12d0
--- /dev/null
+++ b/installer/package.php
@@ -0,0 +1,239 @@
+#!/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");
+?> \ No newline at end of file