0

ラベル付きの dict を check_mk web-api に送信しようとしていますが、web-api は python2 を使用しており、開発者はラベルが Unicode であることを検証することを主張しています。

p3の私の辞書の例:

"": [
    {
        "condition": {
            "service_description": [
                {
                    "$regex": "Callcentre Queue: OTU"
                }
            ]
        },
        "value": {
            u"max_check_attempts": u"3"
        },
        "options": {
            "description": "Label - max_check_attempts\nService - Callcentre Queue: OTU"
        }
    }]

しかし、送信するとlabel max_check_attempts must be unicode typeエラーが発生します。

Traceback (most recent call last):
  File "./cmk_import.py", line 415, in <module>
    process_service_rulelist()
  File "./cmk_import.py", line 309, in process_service_rulelist
    api().set_ruleset('service_label_rules', total_lbl_ruleset)
  File "/usr/local/lib/python3.6/dist-packages/check_mk_web_api/__init__.py", line 724, in set_ruleset
    return self.make_request('set_ruleset', data=data, query_params={'request_format': 'python'})
  File "/usr/local/lib/python3.6/dist-packages/check_mk_web_api/__init__.py", line 164, in make_request
    raise CheckMkWebApiException(result)
check_mk_web_api.exception.CheckMkWebApiException: Check_MK exception: ERROR: The label ID 'max_check_attempts' is of type <type 'str'>, but should be unicode. Affected Rule {'value': {'max_check_attempts': '3'}, 'condition': {'service_description': [{'$regex': 'Callcentre Queue: OTU'}]}, 'options': {'description': 'Label - max_check_attempts\nService - Callcentre Queue: OTU'}}

エラーは、check_mk web-api によって発行された checkMK 自体からのものです。type()リスニング エージェントは Python2 であるため、Unicode として検証しようとしています。

unicodeP3 が - に組み込まれていることは知っていstrますが、影響を受ける部分をpython2.

Web リクエストはこの lib によって処理されます - https://github.com/brennem/check-mk-web-api

request = urllib.request(self._build_request_path(query_params),WebApi._build_request_data(data, request_format))

その内容は次のとおりです。 Arg1:

http://localhost/preprod/check_mk/webapi.py?effective_attributes=0&action=get_all_hosts&_username=automation&_secret=foobar

そしてスニペット:

{%27condition%27: {%27service_description%27: [
{%27%24regex%27: %27VPN: Premier Ping - 1.1.1.1%27}

]}, %27value%27:
{%27check_interval%27: %275%27, %27max_check_attempts%27: %273%27, %27retry_interval%27: %271%27, %27check_period%27: %2724x7%27, %27notification_period%27: %2724x7%27, %27notification_interval%27: %27120%27, %27notifications_enabled%27: %271%27, %27active_checks_enabled%27: %271%27, %27check_freshness%27: %270%27, %27event_handler_enabled%27: %271%27, %27flap_detection_enabled%27: %271%27, %27is_volatile%27: %270%27, %27obsess_over_service%27: %271%27, %27passive_checks_enabled%27: %271%27, %27process_perf_data%27: %271%27, %27retain_nonstatus_information%27: %271%27, %27retain_status_information%27: %271%27}
, %27options%27: {%27description%27: %27Labels for Service - VPN: Premier Ping - 1.1.1.1%27}}
4

1 に答える 1

0

APIクライアントは、基本的str()にそれを呼び出したdictである「python」形式でデータを送信します。その意図は、サーバーがast.literal_eval()この辞書文字列を呼び出すことです。クライアントは、応答の本文で同じことを行います。それを Python dict に変換します。

API 全体を通して、要求/応答処理のために JSON をサポートする場所があり、これは一部の関数のクエリ パラメータで設定できます。残念ながら、ここで失敗している特定のリクエスト (set_ruleset) では、JSON はオプションではありません。

サーバーがこのリクエストの処理に失敗した理由は明らかではありません。メッセージの本文の引用符を外して、それをliteral_eval()Python 2 で実行しようとしましたが、うまくいくようです。

私が気づいたことの 1 つは、リクエスト dict に改行文字が埋め込まれていること"Label - max_check_attempts\nService - Callcentre Queue: OTU"です。サーバーが「ラベル ID 'max_check_attempts'」に言及したときに不平を言っているのはおそらくそれです。

さらに問題を追跡するには、サーバーのログと、場合によってはコードを調べて、そこで何が起こっているかを確認する必要があります。

于 2021-01-29T14:00:11.543 に答える