1 Objetos JavaScript adicionais

Visão geral

Esta seção descreve as adições do Zabbix à linguagem JavaScript implementada com Duktape e as funções globais do JavaScript suportadas.

Não use atribuições não declaradas no pré-processamento do JavaScript. Use var para declarar variáveis locais.

Objetos internos

Zabbix

O objeto Zabbix fornece interação com a funcionalidade interna do Zabbix.

Método Descrição
log(loglevel, message) Grava <message> no log do Zabbix usando o nível de log <loglevel> (veja o parâmetro DebugLevel no arquivo de configuração).

Exemplo:

Zabbix.log(3, "esta é uma entrada de log gravada com o nível de log 'Warning'")

Você pode usar os seguintes aliases:

Alias Alias para
console.log(object) Zabbix.log(4, JSON.stringify(object))
console.warn(object) Zabbix.log(3, JSON.stringify(object))
console.error(object) Zabbix.log(2, JSON.stringify(object))

O tamanho total de todas as mensagens registradas é limitado a 8 MB por execução de script.

Método Descrição
sleep(delay) Atrasar a execução do JavaScript por delay milissegundos.

Exemplo (atrasar a execução por 15 segundos):

Zabbix.sleep(15000)

HttpRequest

Este objeto encapsula o identificador do cURL, permitindo realizar solicitações HTTP simples. Os erros são lançados como exceções.

A inicialização de vários objetos HttpRequest é limitada a 10 por execução de script.

Método Descrição
addHeader(value) Adiciona um campo de cabeçalho HTTP. Esse campo é usado em todas as solicitações seguintes até ser limpo com o método clearHeader().
O comprimento total dos campos de cabeçalho que podem ser adicionados a um único objeto HttpRequest é limitado a 128 Kbytes (incluindo caracteres especiais e nomes de cabeçalho).
clearHeader() Limpa o cabeçalho HTTP. Se nenhum campo de cabeçalho estiver definido, HttpRequest definirá Content-Type como application/json se os dados enviados estiverem no formato JSON; caso contrário, como text/plain.
connect(url) Envia uma solicitação HTTP CONNECT para a URL e retorna a resposta.
customRequest(method, url, data) Permite especificar qualquer método HTTP no primeiro parâmetro. Envia a solicitação do método para a URL com uma carga data opcional e retorna a resposta.
delete(url, data) Envia uma solicitação HTTP DELETE para a URL com uma carga data opcional e retorna a resposta.
getHeaders(<asArray>) Retorna o objeto com os campos de cabeçalho HTTP recebidos.
O parâmetro asArray pode ser definido como "true" (por exemplo, getHeaders(true)), "false" ou ficar indefinido. Se definido como "true", os valores dos campos de cabeçalho HTTP recebidos serão retornados como arrays; isso deve ser usado para recuperar os valores de campos de vários cabeçalhos com o mesmo nome.
Se não for definido ou for definido como "false", os valores dos campos de cabeçalho HTTP recebidos serão retornados como strings.
get(url, data) Envia uma solicitação HTTP GET para a URL com uma carga data opcional e retorna a resposta.
head(url) Envia uma solicitação HTTP HEAD para a URL e retorna a resposta.
options(url) Envia uma solicitação HTTP OPTIONS para a URL e retorna a resposta.
patch(url, data) Envia uma solicitação HTTP PATCH para a URL com uma carga data opcional e retorna a resposta.
put(url, data) Envia uma solicitação HTTP PUT para a URL com uma carga data opcional e retorna a resposta.
post(url, data) Envia uma solicitação HTTP POST para a URL com uma carga data opcional e retorna a resposta.
getStatus() Retorna o código de status da última solicitação HTTP.
setProxy(proxy) Define o proxy HTTP como o valor de "proxy". Se esse parâmetro estiver vazio, nenhum proxy será usado.
setHttpAuth(bitmask, username, password) Define os métodos de autenticação HTTP habilitados (HTTPAUTH_BASIC, HTTPAUTH_DIGEST, HTTPAUTH_NEGOTIATE, HTTPAUTH_NTLM, HTTPAUTH_NONE) no parâmetro 'bitmask'.
O sinalizador HTTPAUTH_NONE permite desabilitar a autenticação HTTP.
Exemplos:
request.setHttpAuth(HTTPAUTH_NTLM | HTTPAUTH_BASIC, username, password)
request.setHttpAuth(HTTPAUTH_NONE)
trace(url, data) Envia uma solicitação HTTP TRACE para a URL com uma carga data opcional e retorna a resposta.

Exemplo:

try {
    Zabbix.log(4, 'jira webhook script value='+value);

    var result = {
        'tags': {
            'endpoint': 'jira'
        }
    },
    params = JSON.parse(value),
    req = new HttpRequest(),
    fields = {},
    resp;

    req.addHeader('Content-Type: application/json');
    req.addHeader('Authorization: Basic '+params.authentication);

    fields.summary = params.summary;
    fields.description = params.description;
    fields.project = {"key": params.project_key};
    fields.issuetype = {"id": params.issue_id};
    resp = req.post('https://jira.example.com/rest/api/2/issue/',
        JSON.stringify({"fields": fields})
    );

    if (req.getStatus() != 201) {
        throw 'Response code: '+req.getStatus();
    }

    resp = JSON.parse(resp);
    result.tags.issue_id = resp.id;
    result.tags.issue_key = resp.key;
} catch (error) {
    Zabbix.log(4, 'jira issue creation failed json : '+JSON.stringify({"fields": fields}));
    Zabbix.log(4, 'jira issue creation failed : '+error);

    result = {};
}

return JSON.stringify(result);

XML

O objeto XML permite o processamento de dados XML no pré-processamento de item e descoberta de baixo nível e webhooks.

Para usar o objeto XML, o server/proxy deve ser compilado com suporte a libxml2.

Método Descrição
XML.query(data, expression) Recupera o conteúdo do nó usando XPath. Retorna null se o nó não for encontrado.
expression - uma expressão XPath;
data - dados XML como uma string.
XML.toJson(data) Converte dados no formato XML para JSON.
XML.fromJson(object) Converte dados no formato JSON para XML.

Exemplo:

Entrada:

<menu>
    <food type = "breakfast">
        <name>Chocolate</name>
        <price>$5.95</price>
        <description></description>
        <calories>650</calories>
    </food>
</menu>

Saída:

{
    "menu": {
        "food": {
            "@type": "breakfast",
            "name": "Chocolate",
            "price": "$5.95",
            "description": null,
            "calories": "650"
        }
    }
}
Regras de serialização

A conversão de XML para JSON será processada de acordo com as seguintes regras (para conversões de JSON para XML, as regras invertidas são aplicadas):

1. Os atributos XML serão convertidos em chaves que têm seus nomes precedidos por '@'.

Exemplo:

Entrada:

<xml foo="FOO">
  <bar>
    <baz>BAZ</baz>
  </bar>
</xml>

Saída:

{
  "xml": {
    "@foo": "FOO",
    "bar": {
      "baz": "BAZ"
    }
  }
}

2. Elementos autocontidos (<foo/>) serão convertidos como tendo valor 'null'.

Exemplo:

Entrada:

<xml>
  <foo/>
</xml>

Saída:

{
  "xml": {
    "foo": null
  }
}

3. Atributos vazios (com valor "") serão convertidos como tendo valor de string vazia ('').

Exemplo:

Entrada:

<xml>
  <foo bar="" />
</xml>

Saída:

{
  "xml": {
    "foo": {
      "@bar": ""
    }
  }
}

4. Múltiplos nós filhos com o mesmo nome de elemento serão convertidos em uma única chave que tem um array de valores como seu valor.

Exemplo:

Entrada:

<xml>
  <foo>BAR</foo>
  <foo>BAZ</foo>
  <foo>QUX</foo>
</xml>

Saída:

{
  "xml": {
    "foo": ["BAR", "BAZ", "QUX"]
  }
}

5. Se um elemento de texto não tiver atributos nem filhos, ele será convertido como uma string.

Exemplo:

Entrada:

<xml>
    <foo>BAZ</foo>
</xml>

Saída:

{
  "xml": {
    "foo": "BAZ"
   }
}

6. Se um elemento de texto não tiver filhos, mas tiver atributos, o conteúdo do texto será convertido em um elemento com a chave '#text' e o conteúdo como valor; os atributos serão convertidos conforme descrito na regra de serialização 1.

Exemplo:

Entrada:

<xml>
  <foo bar="BAR">
    BAZ
  </foo>
</xml>

Saída:

{
  "xml": {
    "foo": {
      "@bar": "BAR",
      "#text": "BAZ"
    }
  }
}

Funções globais do JavaScript

Funções globais adicionais do JavaScript foram implementadas com Duktape:

  • btoa(data) - codifica os dados em uma string base64.
  • atob(base64_string) - decodifica a string base64 como um buffer Uint8Array.
try {
    b64 = btoa("test string");
    buffer = atob(b64);

    // Observe que a lógica de decodificação depende do formato dos dados do buffer.
    decoded = String.fromCharCode.apply(this, [].slice.call(buffer));
} 
catch (error) {
    return {'error.name' : error.name, 'error.message' : error.message};
}
  • md5(data) - calcula o hash MD5 dos dados.
  • sha256(data) - calcula o hash SHA256 dos dados.
  • hmac('<hash type>',key,data) - retorna um hash HMAC como uma string formatada em hexadecimal; md5 e sha256 são suportados como hash type; os parâmetros key e data suportam dados binários.

    Exemplos:

    • hmac('md5',key,data)
    • hmac('sha256',key,data)
  • sign(hash,key,data) - retorna a assinatura calculada (assinatura RSA com SHA-256) como uma string, onde:
    hash - apenas sha256 é permitido, caso contrário, um erro será lançado.
    key - a chave privada. Deve corresponder ao padrão PKCS#1 ou PKCS#8. A chave pode ser fornecida em diferentes formas:

    • com espaços em vez de quebras de linha
    • com \n escapado ou não escapado em vez de quebras de linha
    • sem quebras de linha como uma string de linha única
    • como uma string formatada em JSON

    A chave também pode ser carregada a partir de uma macro de usuário/macro secreta/vault.

    data - os dados que serão assinados. Pode ser uma string (dados binários também são suportados) ou buffer (Uint8Array/ArrayBuffer).

    Exemplo:

    • sign('sha256',key,data)

    OpenSSL ou GnuTLS é usado para calcular as assinaturas. Se o Zabbix foi compilado sem nenhuma dessas bibliotecas de criptografia, um erro será lançado ('missing OpenSSL or GnuTLS library').