Ad Widget

Collapse

Api и bash

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • tuban
    Senior Member
    Zabbix Certified Specialist
    • Sep 2012
    • 286

    #1

    Api и bash

    Доброго времени суток, есть такой скрипт на bash
    Code:
    curl -i -k -X POST -H 'Content-Type: application/json-rpc' -d "
    {
        \"jsonrpс\": \"2.0\",
        \"method\": \"host.exists\",
        \"params\": {
            \"host\": \"Zabbix Server\"
        },
        \"auth\": \"$qwerty\",
        \"id\": 1
    } " http://192.168.0.1/api_jsonrpc.php
    $qwerty - содержит хэш сессии.
    Если сделать
    Code:
    echo "
    curl -i -k -X POST -H \'Content-Type: application/json-rpc\' -d \"
    {
        \"jsonrpс\": \"2.0\",
        \"method\": \"host.exists\",
        \"params\": {
            \"host\": \"Zabbix Server\"
        },
        \"auth\": \"$qwerty\",
        \"id\": 1
    } \" http://192.168.0.1/api_jsonrpc.php
    "
    Получу
    Code:
    curl -i -k -X POST -H \'Content-Type: application/json-rpc\' -d "
    {
        "jsonrpс": "2.0",
        "method": "host.exists",
        "params": {
            "host": "Zabbix Server"
        },
        "auth": "c3a93ad91f2da3181fba81cda8bce831",
        "id": 1
    } " http://192.168.0.1/api_jsonrpc.php
    Однако, запрос не выполняется даже если подставить хэш руками. Он выполняется только в случае одинарных кавычек:
    Code:
    curl -i -k -X POST -H 'Content-Type: application/json-rpc' -d '
    {
        "jsonrpc": "2.0",
        "method": "host.exists",
        "params": {
            "host": "Zabbix Server"
        },
        "auth": "c3a93ad91f2da3181fba81cda8bce831",
        "id": 1
    } ' http://192.168.0.1/api_jsonrpc.php
    Но тогда невозможно подставить переменную. В чём может быть дело?
  • sadman
    Senior Member
    • Dec 2010
    • 1611

    #2
    Originally posted by tuban
    Доброго времени суток, есть такой скрипт на bash
    Code:
    # Who have access to API
    zbxUser='Admin' #Make user with API access and put name here
    # His pass
    zbxPass='zabbix' #Make user with API access and put password here
    # API location
    zbxAPI='http://localhost/zabbix/api_jsonrpc.php'
    # address of Arduino
    zbxAlarmMachine='192.168.0.99'
    
    # Get auth token from zabbix
    curlOutput=`curl -sS -i -X POST -H 'Content-Type: application/json-rpc' -d "{\"params\": {\"password\": \"$zbxPass\", \"user\": \"$zbxUser\"}, \"jsonrpc\":\"2.0\", \"method\": \"user.login\", \"id\": 0}" $zbxAPI`
    authToken=`echo $curlOutput | sed -n 's/.*result":"\(.*\)",.*/\1/p'`
    #echo $authToken
    
    # Get all monitored and problem state triggers
    curlData="{\"jsonrpc\": \"2.0\", \"method\": \"trigger.get\", \"params\": {\"output\": [\"priority\", \"value\"], \"filter\": { \"value\": 1}, \"monitored\":1}, \"auth\":\"$authToken\", \"id\": 1}"
    curlOutput=`curl -sS -i -X POST -H 'Content-Type: application/json-rpc' -d "$curlData" $zbxAPI`
    #echo "$curlOutput"
    Вот это у меня работало. Думаю, что поможет найти дефект в вашем коде.

    Comment

    • tuban
      Senior Member
      Zabbix Certified Specialist
      • Sep 2012
      • 286

      #3
      Originally posted by sadman
      Code:
      # Who have access to API
      zbxUser='Admin' #Make user with API access and put name here
      # His pass
      zbxPass='zabbix' #Make user with API access and put password here
      # API location
      zbxAPI='http://localhost/zabbix/api_jsonrpc.php'
      # address of Arduino
      zbxAlarmMachine='192.168.0.99'
      
      # Get auth token from zabbix
      curlOutput=`curl -sS -i -X POST -H 'Content-Type: application/json-rpc' -d "{\"params\": {\"password\": \"$zbxPass\", \"user\": \"$zbxUser\"}, \"jsonrpc\":\"2.0\", \"method\": \"user.login\", \"id\": 0}" $zbxAPI`
      authToken=`echo $curlOutput | sed -n 's/.*result":"\(.*\)",.*/\1/p'`
      #echo $authToken
      
      # Get all monitored and problem state triggers
      curlData="{\"jsonrpc\": \"2.0\", \"method\": \"trigger.get\", \"params\": {\"output\": [\"priority\", \"value\"], \"filter\": { \"value\": 1}, \"monitored\":1}, \"auth\":\"$authToken\", \"id\": 1}"
      curlOutput=`curl -sS -i -X POST -H 'Content-Type: application/json-rpc' -d "$curlData" $zbxAPI`
      #echo "$curlOutput"
      Вот это у меня работало. Думаю, что поможет найти дефект в вашем коде.
      Спасибо. А может подскажете каким запросом можно получить hostname и ip всех узлов в группе сети.

      Comment

      • sadman
        Senior Member
        • Dec 2010
        • 1611

        #4
        Такого не делал, но предполагаю, что сначала нужно выцепить Group ID через https://www.zabbix.com/documentation.../hostgroup/get , а потом подсунуть его в https://www.zabbix.com/documentation...rence/host/get без указания filter by host

        Comment

        • tuban
          Senior Member
          Zabbix Certified Specialist
          • Sep 2012
          • 286

          #5
          Originally posted by sadman
          Такого не делал, но предполагаю, что сначала нужно выцепить Group ID через https://www.zabbix.com/documentation.../hostgroup/get , а потом подсунуть его в https://www.zabbix.com/documentation...rence/host/get без указания filter by host
          Спасибо. А как потом это лучше пропарсить средствами bash, чтобы на выходе получился файлик вида:
          Code:
          host1 192.168.0.1
          host2 192.168.0.2
          host3 192.168.0.3
          Кстати, host.get не отдаёт ip...

          Comment

          • sadman
            Senior Member
            • Dec 2010
            • 1611

            #6
            Originally posted by tuban
            Спасибо. А как потом это лучше пропарсить средствами bash, чтобы на выходе получился файлик вида:
            Code:
            host1 192.168.0.1
            host2 192.168.0.2
            host3 192.168.0.3
            В общем случае - разобрать JSON, потом сформировать выходные строки. Но JSON в баше разбирать - дело не для слабонервных, честно говоря. Поэтому я пользуюсь JSON::XS в Perl.
            Но начните поиски отсюда - может и выйдет что-то: http://www.zabbix.org/wiki/Docs/api/libraries

            Originally posted by tuban
            Кстати, host.get не отдаёт ip...
            Придется, значит, по HostID ещё и сюда лазить.

            Comment

            • fredushka
              Member
              • May 2009
              • 53

              #7
              Originally posted by sadman
              Но JSON в баше разбирать - дело не для слабонервных, честно говоря.
              Утилитка jq успокоит немного нервы
              jq is sed for JSON

              Comment

              • Kos
                Senior Member
                Zabbix Certified SpecialistZabbix Certified Professional
                • Aug 2015
                • 3406

                #8
                Спасибо за ссылку, круто!

                Comment

                • yukra
                  Senior Member
                  • Apr 2013
                  • 1359

                  #9
                  Originally posted by fredushka
                  Утилитка jq успокоит немного нервы
                  jq is sed for json
                  Чем люди не занимаются, лишь бы нормальный <ВАШ_ЛЮБИМЫЙ_ЯЗЫК_ПРОГРАММИРОВАНИЯ> не использовать.

                  Comment

                  Working...