1 <?php 2 3 use dokuwiki\Extension\CLIPlugin; 4 use splitbrain\phpcli\Options; 5 6 /** 7 * DokuWiki Plugin elasticsearch (CLI Component) 8 * 9 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 10 * @author Andreas Gohr <gohr@cosmocode.de> 11 */ 12 class cli_plugin_elasticsearch extends CLIPlugin 13 { 14 /** @var helper_plugin_elasticsearch_client */ 15 protected $hlp; 16 17 /** 18 * Initialize helper plugin 19 */ 20 public function __construct() 21 { 22 parent::__construct(); 23 $this->hlp = plugin_load('helper', 'elasticsearch_client'); 24 } 25 26 /** 27 * Register options and arguments on the given $options object 28 * 29 * @param Options $options 30 * @return void 31 * @throws \splitbrain\phpcli\Exception 32 */ 33 protected function setup(Options $options) 34 { 35 $options->setHelp('Manage the elastic search index'); 36 37 $options->registerCommand('index', 'Index all pages and/or media in the wiki'); 38 $options->registerOption( 39 'only', 40 'Which document type to index: pages or media', 41 'o', 42 'pages OR media', 43 'index' 44 ); 45 46 $options->registerCommand( 47 'createindex', 48 'Create index named "' . $this->hlp->getConf('indexname') . '" and all required field mappings.' 49 ); 50 $options->registerOption('clear', 'Remove existing index if any', 'c', false, 'createindex'); 51 } 52 53 /** 54 * Your main program 55 * 56 * Arguments and options have been parsed when this is run 57 * 58 * @param Options $options 59 * @return void 60 */ 61 protected function main(Options $options) 62 { 63 // manually initialize auth system 64 // see https://github.com/splitbrain/dokuwiki/issues/2823 65 global $AUTH_ACL; 66 if (!$AUTH_ACL) auth_setup(); 67 68 $cmd = $options->getCmd(); 69 switch ($cmd) { 70 case 'createindex': 71 try { 72 $this->hlp->createIndex($options->getOpt('clear')); 73 $this->success('Index created'); 74 } catch (\Exception $e) { 75 $this->error($e->getMessage()); 76 } 77 break; 78 case 'index': 79 if ($options->getOpt('only') !== 'media') { 80 $this->indexAllPages(); 81 } 82 if ($options->getOpt('only') !== 'pages') { 83 $this->indexAllMedia(); 84 } 85 break; 86 default: 87 $this->error('No command provided'); 88 exit(1); 89 } 90 } 91 92 /** 93 * Index all the pages 94 */ 95 protected function indexAllPages() 96 { 97 global $conf; 98 global $ID; 99 100 /** @var action_plugin_elasticsearch_indexing $act */ 101 $act = plugin_load('action', 'elasticsearch_indexing'); 102 103 $data = []; 104 search($data, $conf['datadir'], 'search_allpages', ['skipacl' => true]); 105 $pages = count($data); 106 $n = 0; 107 foreach ($data as $val) { 108 $ID = $val['id']; 109 $n++; 110 $this->info(sprintf("Indexing page %s (%d of %d)\n", $ID, $n, $pages)); 111 $act->indexPage($ID); 112 } 113 } 114 115 /** 116 * Index all media 117 */ 118 protected function indexAllMedia() 119 { 120 global $conf; 121 122 /** @var action_plugin_elasticsearch_indexing $act */ 123 $act = plugin_load('action', 'elasticsearch_indexing'); 124 125 $data = []; 126 search($data, $conf['mediadir'], 'search_media', ['skipacl' => true]); 127 $media = count($data); 128 $n = 0; 129 foreach ($data as $val) { 130 $id = $val['id']; 131 $n++; 132 $this->info(sprintf("Indexing media %s (%d of %d)\n", $id, $n, $media)); 133 134 $act->indexFile($id); 135 } 136 } 137 } 138