Skip to main content

Módulo System

O módulo system fornece funções para obter informações sobre o sistema operacional, rede e ambiente de execução do agente. Este módulo é útil para scripts que precisam adaptar seu comportamento com base no ambiente, coletar informações de inventário ou realizar diagnósticos do sistema.

Características principais:

  • Informações detalhadas do sistema operacional
  • Nome do host e informações de rede
  • Dados do agente (UUID, versão)
  • Informações de kernel e distribuição
  • Interface unificada para diferentes sistemas operacionais

Funções Disponíveis

1. system.env()

Retorna informações completas sobre o ambiente de execução do agente.

Parâmetros:

  • Nenhum

Retorno:

  • tabela: Estrutura com os seguintes campos:
    • os_type (string): Tipo do sistema operacional (ex: "linux", "windows", "macos")
    • os_name (string): Nome do sistema operacional (ex: "Ubuntu", "Windows 10", "macOS")
    • os_version (string): Versão do sistema operacional
    • kernel_version (string): Versão do kernel
    • agent (tabela ou nil): Informações do agente Monagent (se disponível):
      • uuid (string): UUID único do agente
      • version (string): Versão do Monagent

Exemplo de Uso:

-- Obter todas as informações do ambiente
local env_info = system.env()

print("Tipo do SO:", env_info.os_type)
print("Nome do SO:", env_info.os_name)
print("Versão do SO:", env_info.os_version)
print("Versão do Kernel:", env_info.kernel_version)

if env_info.agent then
    print("UUID do Agente:", env_info.agent.uuid)
    print("Versão do Monagent:", env_info.agent.version)
else
    print("Informações do agente não disponíveis")
end

-- Adaptar comportamento baseado no SO
local env = system.env()

if env.os_type == "linux" then
    -- Comandos específicos para Linux
    local saida, erro = process.exec("ps", "aux")
elseif env.os_type == "windows" then
    -- Comandos específicos para Windows
    local saida, erro = process.exec("tasklist")
elseif env.os_type == "macos" then
    -- Comandos específicos para macOS
    local saida, erro = process.exec("ps", "-ef")
end

2. system.hostname()

Retorna o nome do host do sistema.

Parâmetros:

  • Nenhum

Retorno:

  • string: Nome do host do sistema, ou "unknown" se não puder ser determinado

Exemplo de Uso:

-- Obter nome do host
local nome_host = system.hostname()
print("Nome do host:", nome_host)

-- Usar em identificadores únicos
local identificador = nome_host .. "_" .. os.date("%Y%m%d_%H%M%S")
print("Identificador único:", identificador)

-- Verificar se é um host específico
if nome_host == "servidor-producao" then
    log.info("Executando em servidor de produção")
    config.modo = "producao"
elseif string.find(nome_host:lower(), "test") then
    log.info("Executando em ambiente de teste")
    config.modo = "teste"
else
    log.info("Executando em host desconhecido:", nome_host)
    config.modo = "desenvolvimento"
end

-- Criar tags para métricas
local tags_metricas = {
    host = nome_host,
    ambiente = config.modo,
    timestamp = os.time()
}

3. system.networks()

Retorna uma lista de endereços IP de rede não-loopback do sistema.

Parâmetros:

  • Nenhum

Retorno:

  • array de strings: Lista de endereços IP das interfaces de rede (excluindo loopback)

Comportamento:

  • Exclui endereços de loopback (127.0.0.1, ::1, etc.)
  • Inclui endereços IPv4 e IPv6
  • Atualiza a lista de interfaces antes de retornar
  • Retorna apenas endereços IP, não nomes de interface

Exemplo de Uso:

-- Obter todos os endereços IP do sistema
local enderecos_ip = system.networks()

print("Endereços IP disponíveis:")
for i, ip in ipairs(enderecos_ip) do
    print("  " .. i .. ". " .. ip)
end

-- Identificar endereços IPv4 vs IPv6
local function classificar_enderecos()
    local enderecos = system.networks()
    local classificacao = {
        ipv4 = {},
        ipv6 = {},
        outros = {}
    }

    for _, ip in ipairs(enderecos) do
        if string.find(ip, ":") then
            -- IPv6
            table.insert(classificacao.ipv6, ip)
        elseif string.match(ip, "^%d+%.%d+%.%d+%.%d+$") then
            -- IPv4
            table.insert(classificacao.ipv4, ip)
        else
            -- Outro formato
            table.insert(classificacao.outros, ip)
        end
    end

    return classificacao
end

local ips = classificar_enderecos()
print("IPv4:", #ips.ipv4, "endereços")
print("IPv6:", #ips.ipv6, "endereços")

-- Encontrar endereço preferido para comunicação
local function encontrar_endereco_preferido()
    local enderecos = system.networks()

    -- Prioridade: IPv4 privado > IPv4 público > IPv6
    for _, ip in ipairs(enderecos) do
        -- Verificar se é IPv4 privado
        if string.match(ip, "^10%.") or
           string.match(ip, "^172%.%d?%d?%d?%.") or
           string.match(ip, "^192%.168%.") then