Splunk: カスタムコマンド入門(4/4) - 様々な機能を追加してみる2


###### 実施環境

CentOS 8-Stream

Splunk Free 8.2.2

Python 3.7.10

splunk-sdk-python 1.7.3

### 0. 概要

前回は入出力に関する部分について機能を追加しました。
今回は以下のプログラムに対し、それ以外の様々な機能を追加してみます。

```python:test.py
#!/usr/bin/env python

import sys

sys.path.insert(0, "/opt/splunk/etc/apps/search/lib")
from splunklib.searchcommands import \
    dispatch, GeneratingCommand, Configuration

@Configuration()
class test_class(GeneratingCommand):
    def generate(self):
        return [{"test_field": "Hello World !"}]

dispatch(test_class)
```

### 1. セッション情報の取得

サーチを実行している App やユーザなどのセッション情報を取得したい場合は、「 metadata 」の「 searchinfo 」から取得できます。

```python:test.py
#!/usr/bin/env python

import sys

sys.path.insert(0, "/opt/splunk/etc/apps/search/lib")
from splunklib.searchcommands import \
    dispatch, GeneratingCommand, Configuration

@Configuration()
class test_class(GeneratingCommand):
    def generate(self):
        test_result = {}
        test_result["app"] = self.metadata.searchinfo.app
        test_result["user"] = self.metadata.searchinfo.username
        test_result["sid"] = self.metadata.searchinfo.sid
        return [test_result]

dispatch(test_class)
```

```splunk:splunk
| TestCommand
| table app, user, sid
```

![WS000046.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/734e79e7-61be-afcc-c26a-0c1e80365507.jpeg "sessioninfo")

### 2. ルックアップ情報の取得

ルックアップ情報を取得したい場合は、「 service.get 」で RestAPI を呼び出して使用します。

```python:test.py
#!/usr/bin/env python

import sys, json

sys.path.insert(0, "/opt/splunk/etc/apps/search/lib")
from splunklib.searchcommands import \
    dispatch, GeneratingCommand, Configuration

@Configuration()
class test_class(GeneratingCommand):
    def generate(self):
        objapi = self.service.get( \
            "/servicesNS/-/" + \
            self.metadata.searchinfo.app + \
            "/data/lookup-table-files", \
            **{"output_mode":"json","count":0})
        objjson = json.loads(objapi.body.read())
        for objentry in objjson["entry"]:
            test_result = {}
            test_result["name"] = objentry["name"]
            test_result["path"] = objentry["content"]["eai:data"]
            test_result["_raw"] = str(objentry)
            yield test_result

dispatch(test_class)
```

```splunk:splunk
| TestCommand
| table name, path, _raw
```

![WS000052.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/bc6babcb-18cb-931b-26e4-c5c6c6536852.jpeg "api")

### 3. エラーメッセージの出力

エラーメッセージを画面に出力したい場合は、「 `_record_writer` 」の「 `write_message` 」を使用します。

```python:test.py
#!/usr/bin/env python

import sys

sys.path.insert(0, "/opt/splunk/etc/apps/search/lib")
from splunklib.searchcommands import \
    dispatch, GeneratingCommand, Configuration

@Configuration()
class test_class(GeneratingCommand):
    def generate(self):
        self._record_writer.write_message("ERROR", "エラーメッセージです")
        return [{"test_field": "Hello World !"}]

dispatch(test_class)
```

```splunk:splunk
| TestCommand
```

![WS000050.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/f9111a71-7194-f8d7-74d3-d8f3b40c87d7.jpeg "エラー")

「 ERROR 」を「 WARN 」に変えると、警告メッセージになります。

```python:test.py
#!/usr/bin/env python

import sys

sys.path.insert(0, "/opt/splunk/etc/apps/search/lib")
from splunklib.searchcommands import \
    dispatch, GeneratingCommand, Configuration

@Configuration()
class test_class(GeneratingCommand):
    def generate(self):
        self._record_writer.write_message("WARN", "警告メッセージです")
        return [{"test_field": "Hello World !"}]

dispatch(test_class)
```

```splunk:splunk
| TestCommand
```

![WS000051.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/a083e39c-5288-4e06-de1c-07369b1a4473.jpeg "警告")

[戻る](https://qiita.com/frozencatpisces/items/14e4de24c306502efcc8)