summaryrefslogtreecommitdiffstats
path: root/update.php
diff options
context:
space:
mode:
authorAlexander Sulfrian <alex@spline.inf.fu-berlin.de>2013-08-30 00:54:37 +0000
committerAlexander Sulfrian <alex@spline.inf.fu-berlin.de>2013-08-30 00:54:51 +0000
commit1c70b0447570619f537147db8ca491c054467a12 (patch)
tree3fecb0d65303531487ff26592181e93fca911acb /update.php
downloaddokuwiki-1c70b0447570619f537147db8ca491c054467a12.tar.gz
dokuwiki-1c70b0447570619f537147db8ca491c054467a12.tar.bz2
dokuwiki-1c70b0447570619f537147db8ca491c054467a12.zip
initial commit
Diffstat (limited to 'update.php')
-rwxr-xr-xupdate.php355
1 files changed, 355 insertions, 0 deletions
diff --git a/update.php b/update.php
new file mode 100755
index 0000000..15fa8d8
--- /dev/null
+++ b/update.php
@@ -0,0 +1,355 @@
+#!/usr/bin/env php
+<?php
+if ('cli' != php_sapi_name()) die();
+
+// fake enviroment
+$_SERVER['HTTP_HOST'] = 'doku.spline.inf.fu-berlin.de';
+$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
+
+ini_set('memory_limit','128M');
+if(!defined('DOKU_INC')) define('DOKU_INC', '/usr/share/dokuwiki/');
+require_once(DOKU_INC.'inc/init.php');
+require_once(DOKU_INC.'inc/cliopts.php');
+require_once('SymfonyComponents/YAML/sfYaml.php');
+session_write_close();
+
+#------------------------------------------------------------------------------
+# handle options
+
+$short_opts = 'hcq';
+$long_opts = array('help', 'clear', 'quiet');
+$OPTS = Doku_Cli_Opts::getOptions(__FILE__, $short_opts, $long_opts);
+if ( $OPTS->isError() ) {
+ fwrite( STDERR, $OPTS->getMessage() . "\n");
+ _usage();
+ exit(1);
+}
+$CLEAR = false;
+$QUIET = false;
+$PAGES = array();
+
+foreach ($OPTS->options as $key => $val) {
+ switch ($key) {
+ case 'h':
+ case 'help':
+ _usage();
+ exit;
+ case 'c':
+ case 'clear':
+ $CLEAR = true;
+ break;
+ case 'q':
+ case 'quiet':
+ $QUIET = true;
+ break;
+ }
+}
+
+if (!$OPTS->hasArgs()) {
+ _usage();
+ exit;
+}
+
+#------------------------------------------------------------------------------
+# Doku_Indexer_Mass_Remover
+
+class Doku_Indexer_Mass_Remover extends Doku_Indexer {
+ function deletePages($pages) {
+ if (!$this->lock()) {
+ die('Locked');
+ }
+
+ foreach($pages as $page) {
+ _quietecho('Removing from index: ' . $page);
+ $this->deletePageNoLock($page);
+ _quietecho(" done.\n");
+ }
+
+ $this->unlock();
+ }
+}
+
+#------------------------------------------------------------------------------
+# main()
+
+$path_to_hostinfo = $OPTS->arg(0);
+_load_hostinfo_data($path_to_hostinfo);
+
+_find_current_pages();
+if (!$CLEAR) {
+ _update_content();
+ _render('start', 'start', array('HOSTINFO' => $HOSTINFO));
+ _update_index();
+}
+_remove_outdated();
+
+
+#------------------------------------------------------------------------------
+# _find_current_pages
+
+function _find_current_pages() {
+ global $conf, $PAGES;
+
+ $data = array();
+ search($data, $conf['datadir'], 'search_allpages', array('skipacl' => true), 'hostinfo');
+
+ foreach ($data as $page) {
+ $PAGES[$page['id']] = 'delete';
+ }
+}
+
+#------------------------------------------------------------------------------
+# _load_hostinfo_data
+
+function _load_hostinfo_data($path) {
+ global $HOSTINFO;
+
+ $hosts_file = $path . '/metadata/hosts';
+ if (!file_exists($hosts_file)) {
+ die("Invalid hostinfo path: $path\n");
+ }
+
+ $hosts = sfYaml::load($hosts_file);
+ foreach ($hosts['hosts'] as $host) {
+ $HOSTINFO[$host] = sfYaml::load($path . '/' . $host);
+ }
+}
+
+#------------------------------------------------------------------------------
+# _update_content
+
+function _update_content() {
+ global $conf, $HOSTINFO;
+
+ // render sites
+ foreach ($HOSTINFO as $host => $host_data) {
+ _render($host, 'host', $host_data);
+ }
+}
+
+#------------------------------------------------------------------------------
+# _render
+
+function _render($target, $file, $vars=null) {
+ global $conf, $PAGES;
+
+ _quietecho("Rendering $file into $target");
+ $content = _render_template($file, $vars);
+ if ($content === false) {
+ _quietecho(" FAILED (missing template)\n");
+ return false;
+ }
+ else {
+ $pagename = cleanID('hostinfo:' . $target);
+ $page = wikiFN($pagename);
+
+ $old_content = '';
+ if (file_exists($page)) {
+ $old_content = file_get_contents($page);
+ }
+
+ if ($content != $old_content) {
+ $PAGES[$pagename] = 'update';
+ saveWikiText($pagename, $content, 'auto generated');
+ _quietecho(" done\n");
+ }
+ else {
+ unset($PAGES[$pagename]);
+ _quietecho(" no change\n");
+ }
+ return true;
+ }
+}
+
+#------------------------------------------------------------------------------
+# default
+
+function echo_with_default($value, $default) {
+ if (!isset($value) || empty($value)) {
+ echo $default;
+ }
+ else {
+ echo $value;
+ }
+}
+
+#------------------------------------------------------------------------------
+# get_contact_info
+
+function get_contact_info($maintainer) {
+ if (preg_match('/^([^:]*): (.*@.*)$/', $maintainer, $match)) {
+ return array($match[1], $match[2]);
+ }
+
+ return array($maintainer, $maintainer . '@spline.inf.fu-berlin.de');
+}
+
+#------------------------------------------------------------------------------
+# get_bcfg2_groups
+
+function get_bcfg2_groups($hostinfo) {
+ $groups = array();
+
+ foreach ($hostinfo as $host => $data) {
+ foreach ($data['groups'] as $group) {
+ $groups[$group] = array();
+ }
+ }
+
+ foreach (array_keys($groups) as $group) {
+ foreach ($hostinfo as $host => $data) {
+ if (in_array($group, $data['groups'])) {
+ $groups[$group][$host] = $data;
+ }
+ }
+ }
+
+ foreach ($groups as $group => $hosts) {
+ if (count($hosts) < 2) {
+ unset($groups[$group]);
+ }
+
+ if (count($hosts) == count($hostinfo)) {
+ $groups[$group] = 'all';
+ }
+ }
+
+ return $groups;
+}
+
+#------------------------------------------------------------------------------
+# group_by
+
+function group_by($data, $key) {
+ $result = array();
+
+ foreach ($data as $value) {
+ if (array_key_exists($key, $value)) {
+ $result[$value[$key]][] = $value;
+ }
+ }
+
+ return $result;
+}
+
+#------------------------------------------------------------------------------
+# select_by
+
+function select_by($data, $key, $exists = true) {
+ $result = array();
+
+ if (is_array($data)) {
+ foreach ($data as $value) {
+ if (array_key_exists($key, $value) === $exists) {
+ $result[] = $value;
+ }
+ }
+ }
+
+ return $result;
+}
+
+#------------------------------------------------------------------------------
+# _render_template
+
+function _render_template($file, $vars=null) {
+ // validate $file
+ $file = preg_replace('/^(?:.+\/)?([a-zA-Z_-]*)(?:\.[a-zA-Z])?$/', '$1', $file);
+ $file = 'templates/' . $file . '.tpl.php';
+
+ if (!file_exists($file)) {
+ // template does not exists
+ return false;
+ }
+
+ if (is_array($vars) && !empty($vars)) {
+ if (array_key_exists('file', $vars)) {
+ // if $vars would contain a 'file' key, this would overwrite the
+ // first parameter of the template file
+ unset($vars['file']);
+ }
+
+ extract($vars);
+ }
+
+ ob_start();
+ include $file;
+ return ob_get_clean();
+}
+
+#------------------------------------------------------------------------------
+# _update_index
+
+function _update_index() {
+ global $conf, $PAGES;
+
+
+ foreach ($PAGES as $page => $state) {
+ if ($state != 'delete') {
+ _quietecho('Add to index: ' . $page);
+ idx_addPage($page, false, true);
+ _quietecho(" done.\n");
+ }
+ }
+}
+
+#------------------------------------------------------------------------------
+# _remove_index
+
+function _remove_index() {
+ global $PAGES;
+
+ $data = array();
+ foreach ($PAGES as $page => $state) {
+ if ($state == 'delete') {
+ $data[] = $page;
+ }
+ }
+
+ $idx = new Doku_Indexer_Mass_Remover();
+ $idx->deletePages($data);
+}
+
+#------------------------------------------------------------------------------
+# _remove_outdated
+
+function _remove_outdated() {
+ global $PAGES;
+
+ foreach ($PAGES as $page => $state) {
+ if ($state == 'delete') {
+ _quietecho('Removing old page: ' . $page);
+ unlink(wikiFN($page));
+ _quietecho(" done.\n");
+ }
+ }
+ _remove_index();
+}
+
+#------------------------------------------------------------------------------
+# _usage
+
+function _usage() {
+ print "Usage: update.php <options> <path to hostinfo>
+
+Updates the hostinfo information by first removing all pages in the hostinfo
+namespace from the fulltext index, generating the new files and then
+reindexing all pages.
+When the -c option is given the index is only cleared and nothing is updated.
+
+OPTIONS
+ -h, --help show this help and exit
+ -c, --clear only clear the index
+ -q, --quiet don't produce any output
+";
+}
+
+#------------------------------------------------------------------------------
+# _quietecho
+
+function _quietecho($msg) {
+ global $QUIET;
+ if(!$QUIET) echo $msg;
+}
+
+?>