1390782abSAndreas Gohr<?php 2a6bdb2dfSAndreas Gohr 3a6bdb2dfSAndreas Gohruse dokuwiki\Extension\CLIPlugin; 4a6bdb2dfSAndreas Gohruse splitbrain\phpcli\Options; 5a6bdb2dfSAndreas Gohr 677f8004dSAndreas Gohr/** 777f8004dSAndreas Gohr * DokuWiki Plugin elasticsearch (CLI Component) 877f8004dSAndreas Gohr * 977f8004dSAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 1077f8004dSAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de> 1177f8004dSAndreas Gohr */ 12a6bdb2dfSAndreas Gohrclass cli_plugin_elasticsearch extends CLIPlugin 13a6bdb2dfSAndreas Gohr{ 147fe3053fSAndreas Gohr /** @var helper_plugin_elasticsearch_client */ 157fe3053fSAndreas Gohr protected $hlp; 167fe3053fSAndreas Gohr 177fe3053fSAndreas Gohr /** 187fe3053fSAndreas Gohr * Initialize helper plugin 197fe3053fSAndreas Gohr */ 20a6bdb2dfSAndreas Gohr public function __construct() 21a6bdb2dfSAndreas Gohr { 227fe3053fSAndreas Gohr parent::__construct(); 237fe3053fSAndreas Gohr $this->hlp = plugin_load('helper', 'elasticsearch_client'); 247fe3053fSAndreas Gohr } 257fe3053fSAndreas Gohr 26390782abSAndreas Gohr /** 27390782abSAndreas Gohr * Register options and arguments on the given $options object 28390782abSAndreas Gohr * 294ff7cfb8SAnna Dabrowska * @param Options $options 30390782abSAndreas Gohr * @return void 31108a94feSAnna Dabrowska * @throws \splitbrain\phpcli\Exception 32390782abSAndreas Gohr */ 33a6bdb2dfSAndreas Gohr protected function setup(Options $options) 34a6bdb2dfSAndreas Gohr { 35390782abSAndreas Gohr $options->setHelp('Manage the elastic search index'); 367fe3053fSAndreas Gohr 37d0e97744SAnna Dabrowska $options->registerCommand('index', 'Index all pages and/or media in the wiki'); 38d0e97744SAnna Dabrowska $options->registerOption( 39d0e97744SAnna Dabrowska 'only', 40d0e97744SAnna Dabrowska 'Which document type to index: pages or media', 41d0e97744SAnna Dabrowska 'o', 42494c5cb5SAnna Dabrowska 'pages OR media', 43d0e97744SAnna Dabrowska 'index' 44d0e97744SAnna Dabrowska ); 457fe3053fSAndreas Gohr 46d8d5b898SAnna Dabrowska $options->registerCommand( 47d8d5b898SAnna Dabrowska 'createindex', 48494c5cb5SAnna Dabrowska 'Create index named "' . $this->hlp->getConf('indexname') . '" and all required field mappings.' 49d8d5b898SAnna Dabrowska ); 507fe3053fSAndreas Gohr $options->registerOption('clear', 'Remove existing index if any', 'c', false, 'createindex'); 51390782abSAndreas Gohr } 52390782abSAndreas Gohr 53390782abSAndreas Gohr /** 54390782abSAndreas Gohr * Your main program 55390782abSAndreas Gohr * 56390782abSAndreas Gohr * Arguments and options have been parsed when this is run 57390782abSAndreas Gohr * 584ff7cfb8SAnna Dabrowska * @param Options $options 59390782abSAndreas Gohr * @return void 60390782abSAndreas Gohr */ 61a6bdb2dfSAndreas Gohr protected function main(Options $options) 62a6bdb2dfSAndreas Gohr { 63e774dc76SAndreas Gohr // manually initialize auth system 64e774dc76SAndreas Gohr // see https://github.com/splitbrain/dokuwiki/issues/2823 65e774dc76SAndreas Gohr global $AUTH_ACL; 66e774dc76SAndreas Gohr if (!$AUTH_ACL) auth_setup(); 67e774dc76SAndreas Gohr 68390782abSAndreas Gohr $cmd = $options->getCmd(); 69390782abSAndreas Gohr switch ($cmd) { 707fe3053fSAndreas Gohr case 'createindex': 71d8d5b898SAnna Dabrowska try { 72d8d5b898SAnna Dabrowska $this->hlp->createIndex($options->getOpt('clear')); 737fe3053fSAndreas Gohr $this->success('Index created'); 74d8d5b898SAnna Dabrowska } catch (\Exception $e) { 75d8d5b898SAnna Dabrowska $this->error($e->getMessage()); 76390782abSAndreas Gohr } 77390782abSAndreas Gohr break; 787fe3053fSAndreas Gohr case 'index': 79d0e97744SAnna Dabrowska if ($options->getOpt('only') !== 'media') { 807fe3053fSAndreas Gohr $this->indexAllPages(); 81d0e97744SAnna Dabrowska } 82d0e97744SAnna Dabrowska if ($options->getOpt('only') !== 'pages') { 83d0e97744SAnna Dabrowska $this->indexAllMedia(); 84d0e97744SAnna Dabrowska } 857fe3053fSAndreas Gohr break; 86390782abSAndreas Gohr default: 87390782abSAndreas Gohr $this->error('No command provided'); 88390782abSAndreas Gohr exit(1); 89390782abSAndreas Gohr } 90390782abSAndreas Gohr } 91390782abSAndreas Gohr 927fe3053fSAndreas Gohr /** 937fe3053fSAndreas Gohr * Index all the pages 947fe3053fSAndreas Gohr */ 95a6bdb2dfSAndreas Gohr protected function indexAllPages() 96a6bdb2dfSAndreas Gohr { 975b987f97SAnna Dabrowska global $conf; 985b987f97SAnna Dabrowska global $ID; 997fe3053fSAndreas Gohr 1007fe3053fSAndreas Gohr /** @var action_plugin_elasticsearch_indexing $act */ 1017fe3053fSAndreas Gohr $act = plugin_load('action', 'elasticsearch_indexing'); 1027fe3053fSAndreas Gohr 103a6bdb2dfSAndreas Gohr $data = []; 104a6bdb2dfSAndreas Gohr search($data, $conf['datadir'], 'search_allpages', ['skipacl' => true]); 1057fe3053fSAndreas Gohr $pages = count($data); 1067fe3053fSAndreas Gohr $n = 0; 1077fe3053fSAndreas Gohr foreach ($data as $val) { 1087fe3053fSAndreas Gohr $ID = $val['id']; 1097fe3053fSAndreas Gohr $n++; 1107fe3053fSAndreas Gohr $this->info(sprintf("Indexing page %s (%d of %d)\n", $ID, $n, $pages)); 111*6b2832edSAnna Dabrowska try { 112a6bdb2dfSAndreas Gohr $act->indexPage($ID); 113*6b2832edSAnna Dabrowska } catch (Throwable $e) { 114*6b2832edSAnna Dabrowska $this->error("$ID indexing error: " . $e->getMessage()); 115*6b2832edSAnna Dabrowska $this->debug($e->getTraceAsString()); 116*6b2832edSAnna Dabrowska } 1177fe3053fSAndreas Gohr } 1187fe3053fSAndreas Gohr } 119390782abSAndreas Gohr 120d0e97744SAnna Dabrowska /** 121d0e97744SAnna Dabrowska * Index all media 122d0e97744SAnna Dabrowska */ 123a6bdb2dfSAndreas Gohr protected function indexAllMedia() 124a6bdb2dfSAndreas Gohr { 125d0e97744SAnna Dabrowska global $conf; 126d0e97744SAnna Dabrowska 127d0e97744SAnna Dabrowska /** @var action_plugin_elasticsearch_indexing $act */ 128d0e97744SAnna Dabrowska $act = plugin_load('action', 'elasticsearch_indexing'); 129d0e97744SAnna Dabrowska 130d0e97744SAnna Dabrowska $data = []; 131d0e97744SAnna Dabrowska search($data, $conf['mediadir'], 'search_media', ['skipacl' => true]); 132d0e97744SAnna Dabrowska $media = count($data); 133d0e97744SAnna Dabrowska $n = 0; 134d0e97744SAnna Dabrowska foreach ($data as $val) { 135d0e97744SAnna Dabrowska $id = $val['id']; 136d0e97744SAnna Dabrowska $n++; 137d0e97744SAnna Dabrowska $this->info(sprintf("Indexing media %s (%d of %d)\n", $id, $n, $media)); 138d0e97744SAnna Dabrowska 139a6bdb2dfSAndreas Gohr $act->indexFile($id); 140d0e97744SAnna Dabrowska } 141d0e97744SAnna Dabrowska } 142390782abSAndreas Gohr} 143