CBC Slack App "User is not authenticated"

前回の続きです. Carbon Black の PoC を開始してから Slack 通知 App を便利に使っていたのですが.突然通知が来なくなり,うちの環境も綺麗になった!と喜んだのも束の間,コンソールに吐き出されたエラーを見つけてガッカリ.

Traceback (most recent call last):
  File "./CBC_slack.py", line 306, in <module>
    sys.exit(main())
  File "./CBC_slack.py", line 40, in main
    for notification in cb.notification_listener():
  File "/usr/local/vmug/cbapi/lib64/python3.6/site-packages/cbapi/psc/defense/rest_api.py", line 39, in notification_listener
    for notification in self.get_notifications():
  File "/usr/local/vmug/cbapi/lib64/python3.6/site-packages/cbapi/psc/defense/rest_api.py", line 49, in get_notifications
    res = self.get_object("/integrationServices/v3/notification")
  File "/usr/local/vmug/cbapi/lib64/python3.6/site-packages/cbapi/connection.py", line 418, in get_object
    result = self.api_json_request("GET", uri)
  File "/usr/local/vmug/cbapi/lib64/python3.6/site-packages/cbapi/connection.py", line 482, in api_json_request
    result = self.session.http_request(method, uri, headers=headers, data=raw_data, **kwargs)
  File "/usr/local/vmug/cbapi/lib64/python3.6/site-packages/cbapi/connection.py", line 280, in http_request
    raise UnauthorizedError(uri=uri, action=method, message=r.text)
cbapi.errors.UnauthorizedError: Check your API Credentials: {"success": false, "message": "User is not authenticated"}

なんと,UnauthorizedError で止まっているではないですか!どうも一定時間経過すると再度認証する必要があるようです. そこで,while True ループ内で定期的に認証を実施するようにソースを変更してみました.


モジュール追加

まずは schedule モジュールを追加します.

(cbapi) [root@jpvmug cbapi]# pip install schedule
Collecting schedule
  Downloading schedule-1.0.0-py2.py3-none-any.whl (9.0 kB)
Installing collected packages: schedule
Successfully installed schedule-1.0.0

Python Script の編集

schedule モジュールを import します.

import schedule

main() の中で global 変数として cb を定義して,認証を 60 分毎でスケジュールします.

    def cb_auth():
        global cb
        cb = CbDefenseAPI(profile="default")

    schedule.every(60).minutes.do(cb_auth)

while True ループ中で実行させます.

    while True:

        schedule.run_pending()  <-- 該当時間に Task があれば実行
        time.sleep(1)       <--  1 秒 Sleep

        for notification in cb.notification_listener():

これで,オリジナルの Script で発生していた UnauthorizedError は回避する事ができました.案の定,Alert はバンバン飛んで来る事になったので,嬉しいのか悲しいのか微妙なところですw.