Анализ паролей JSON Файл и использование API PU SH для выбранных полей - PullRequest
0 голосов
/ 15 января 2020

Я ищу совет о том, как проанализировать файл и выбрать определенные поля. Затем выбранные поля должны быть включены в API pu sh для отдельной системы с помощью curl.

Сложность заключается в том, что количество необходимых полей может меняться при каждом заполнении файла. Однако я могу использовать ключи "key" и значения, указанные после этого в "value".

Так что в следующем примере я хочу захватить эти значения (хотя отдельное сообщение может иметь больше или меньше) :

{
    "result": {
        "problems": [{
            "id": "8103182743126107297_1579010239089V2",
            "startTime": 1579010239089,
            "endTime": -1,
            "displayName": "297",
            "impactLevel": "INFRASTRUCTURE",
            "status": "OPEN",
            "severityLevel": "AVAILABILITY",
            "commentCount": 0,
            "tagsOfAffectedEntities": [{
                "context": "CONTEXTLESS",
                "key": "JBOSS"
            }, {
                "context": "CONTEXTLESS",
                "key": "AC"
            }, {
                "context": "CONTEXTLESS",
                "key": "Host Name",
                "value": "servernameX.com"
            }, {
                "context": "CONTEXTLESS",
                "key": "Tomcat"
            }],
            "rankedImpacts": [{
                "entityId": "PROCESS_GROUP_INSTANCE-2XXXE58A78A142D7",
                "entityName": "service Tomcat *",
                "severityLevel": "AVAILABILITY",
                "impactLevel": "INFRASTRUCTURE",
                "eventType": "PROCESS_UNAVAILABLE"
            }, {
                "entityId": "PROCESS_GROUP_INSTANCE-A2F65660B538D9CF",
                "entityName": "JBoss EAP",
                "severityLevel": "AVAILABILITY",
                "impactLevel": "INFRASTRUCTURE",
                "eventType": "PROCESS_UNAVAILABLE"
            }],
            "affectedCounts": {
                "INFRASTRUCTURE": 2,
                "SERVICE": 0,
                "APPLICATION": 0,
                "ENVIRONMENT": 0
            },
            "recoveredCounts": {
                "INFRASTRUCTURE": 0,
                "SERVICE": 0,
                "APPLICATION": 0,
                "ENVIRONMENT": 0
            },
            "hasRootCause": true
        }],
        "monitored": {
            "INFRASTRUCTURE": 235,
            "SERVICE": 19,
            "APPLICATION": 1,
            "ENVIRONMENT": 1
        }
    }
}

Затем ... как только эти значения будут получены, преобразуйте их в новую строку JSON, например, такую ​​(изменится только значение "Host"):

{
    "State": "OPEN",
    "ProblemID": "55555",
    "ImpactedEntity": "Alert from Maintenance Window",
    "ProblemTitle": "Process unavailable",
    "Host": "captured value 1(JBOSS), captured value 2(AC), captured value 3(HostName), captured value 4(servernameX.com),captured value 5(Tomcat), "
}

Мне нужно вписать их в POST и выполнить его.

curl -v -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '(the JSON above)' 'http://serverA.com/?apiKey=8675309:p'

Это ящик Linux, и у меня есть python 2.7 на нем

Итак, подведем итог:

  • Нам нужно проанализировать плоский файл для значений интереса (назовите его file.x Количество значений может варьироваться, но всегда есть ключевое слово / s для идентификации)

  • Нам нужно взять эти значения, представляющие интерес, и поместить их в оператор CURL
    , который выполняет API pu sh (формат указан выше)

Как это можно сделать быть достигнутым? В конечном счете, я планирую это в задаче cron для разных времен. Пожалуйста, советуйте и благодарим всех вас так любезно!

1 Ответ

1 голос
/ 16 января 2020

Если доступно jq, попробуйте следующее:

i=1
while IFS=$'\n' read -r x; do
    str+=$(printf "captured value %d(%s), " "$i" "$x")
    ((i++))
done < <(jq -r '.. | .key? // empty, .value? // empty' < file.json)

cat <<EOS
{
    "State": "OPEN",
    "ProblemID": "55555",
    "ImpactedEntity": "Alert from Maintenance Window",
    "ProblemTitle": "Process unavailable",
    "Host": "$str"
}
EOS

Вывод:

{
    "State": "OPEN",
    "ProblemID": "55555",
    "ImpactedEntity": "Alert from Maintenance Window",
    "ProblemTitle": "Process unavailable",
    "Host": "captured value 1(JBOSS), captured value 2(AC), captured value 3(Host Name), captured value 4(servernameX.com), captured value 5(Tomcat), "
}

Если вы хотите присвоить переменную json для вывода выше измените оператор cat следующим образом:

json=$(cat <<EOS
{
    "State": "OPEN",
    "ProblemID": "55555",
    "ImpactedEntity": "Alert from Maintenance Window",
    "ProblemTitle": "Process unavailable",
    "Host": "$str"
}
EOS
)

Затем вы можете встроить переменную json в командную строку curl.

[Пояснения]

  • Фильтр .. для команды jq рекурсивно обходит дерево json и получает все значения, набранные .key или .value. Значения null удаляются с помощью // empty.
  • Вывод команды jq подается на while l oop, а отформатированные значения добавляются к строке str one по одному.
...