前回の続きです. 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.