#!/usr/bin/env ruby require 'open-uri' require 'json' require 'uri' require 'influxdb' HOST = ARGV[0] data = JSON.parse open("http://#{HOST}/sysinfo-json.cgi").read() values = {} def recurse(data, values, prefix='') new_prefix = proc do |name| if prefix == "" name else "#{prefix}.#{name}" end end if data.kind_of? Hash data.each do |k, v| recurse v, values, new_prefix.call(k) end elsif data.kind_of? Array data.zip(0..).each do |(v, i)| recurse v, values, new_prefix.call(i) end elsif data.kind_of? String and data != "" data.strip! data = data.split(/,/) if data.length > 1 data.zip(0..).each do |(v, i)| recurse v, values, new_prefix.call(i) end else data = data[0].split(/ +/) if data.length > 1 data.zip(0..).each do |(v, i)| recurse v, values, new_prefix.call(i) end else if data[0] =~ /^\d+$/ values[prefix] = data[0].to_f end end end elsif data.kind_of? Integer or data.kind_of? Float values[prefix] = data.to_f end end node_id = data['data']['common']['node'] node_name = URI::decode data['data']['contact']['name'] recurse data['data'], values points = values.map do |k, v| { series: 'node', tags: { node_id: node_id, node_name: node_name, key: k, }, values: { value: v, }, } end db = InfluxDB::Client.new(url: "http://grafana.hq.c3d2.de:8086/freifunk") db.write_points points