#!/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(); } } #------------------------------------------------------------------------------ # 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 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; } ?>