#!/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->setConfigDir(__DIR__ . '/configs/'); $this->default_resource_type = 'dokuwiki'; $this->addPluginsDir(__DIR__ . '/plugins/'); $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; } } #------------------------------------------------------------------------------ # 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; } #------------------------------------------------------------------------------ # _render_template function _render_template($template, $vars=null) { global $smarty; $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 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; } ?>