#!/usr/bin/env php 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(); } } #------------------------------------------------------------------------------ # Smarty class Smarty_Hostinfo extends Smarty { function __construct() { parent::__construct(); $this->setCompileDir(__DIR__ . '/templates_c/'); $this->addPluginsDir(__DIR__ . '/plugins/'); $this->default_resource_type = 'dokuwiki'; $this->loadFilter("pre", 'whitespace_control'); $this->caching = Smarty::CACHING_OFF; } } $smarty = new Smarty_Hostinfo(); #------------------------------------------------------------------------------ # 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(); $opts = array( 'skipacl' => true, // ignore pages in subnamespaces (templates) 'depth' => 2, ); search($data, $conf['datadir'], 'search_allpages', $opts, '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; } } #------------------------------------------------------------------------------ # _render_template function _render_template($template, $vars=null) { global $smarty; $smarty->clearAllAssign(); $smarty->assign($vars); return $smarty->fetch($template . '.tpl'); } #------------------------------------------------------------------------------ # _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] Updates the hostinfo information by first generating all changed pages and add them to the fulltext index. Pages that should not exists anymore are removed (also from the fulltext index) afterwards. 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; } ?>