xref: /plugin/elasticsearch/cli.php (revision 6b2832ed319839ed98cd429980aaab6d4306c91b)
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