diff options
4 files changed, 179 insertions, 2 deletions
diff --git a/files/common/openwrt/gpsd_prometheus-node-exporter.lua b/files/common/openwrt/gpsd_prometheus-node-exporter.lua new file mode 100644 index 00000000..b7ed92f1 --- /dev/null +++ b/files/common/openwrt/gpsd_prometheus-node-exporter.lua @@ -0,0 +1,138 @@ +local socket = require "socket" +local cjson = require "cjson.safe" + +local last_error_msg = {} +local last_watch_msg = {} +local last_devices_msg = {} + +function gpsd_setup() + local s, err = socket.tcp4() + if err ~= nil then return nil, err end + s:settimeout(1) + + _, err = s:connect('127.0.0.1', 2947) + if err ~= nil then return nil, err end + + local msg_json, err = s:receive('*l') + if err ~= nil then + s:close() + return nil, err + end + + local msg, err = cjson.decode(msg_json) + if err ~= nil then + s:close() + return nil, err + end + if msg['class'] ~= 'VERSION' then + s:close() + return nil, "got unexpected message class from GPSD: " .. tostring(msg['class']) + end + + _, err = s:send('?WATCH={"enable":"true"}') + if err ~= nil then + s:close() + return nil, err + end + + return s, msg +end + +function gpsd_poll(s) + _, err = s:send('?DEVICES;') + if err ~= nil then + s:close() + return nil, err + end + _, err = s:send('?POLL;') + if err ~= nil then + s:close() + return nil, err + end + + while true do + local msg_json, err = s:receive('*l') + if err ~= nil then + s:close() + return nil, err + end + + local msg, err = cjson.decode(msg_json) + if err ~= nil then + s:close() + return nil, err + end + + if msg['class'] == 'ERROR' then + last_error_msg = msg + elseif msg['class'] == 'WATCH' then + last_watch_msg = msg + elseif msg['class'] == 'DEVICES' then + last_devices_msg = msg + elseif msg['class'] == 'POLL' then + return s, msg + else + print("ignoring unknown message class from GPSD: " .. tostring(msg['class'])) + end + end +end + +function metric_version_info(version_info) + local labels = {} + labels['rev'] = version_info['rev'] + labels['release'] = version_info['release'] + labels['proto_major'] = version_info['proto_major'] + labels['proto_minor'] = version_info['proto_minor'] + + metric("gpsd_version_info", "gauge", labels, 1) +end + +function metric_devices(devices_msg) + if devices_msg['devices'] == nil then return end + for _, dev in ipairs(devices_msg['devices']) do + local labels = {} + labels['device'] = dev['path'] + labels['driver'] = dev['driver'] + labels['subtype'] = dev['subtype'] + labels['subtype1'] = dev['subtype1'] + + metric("gpsd_device_info", "gauge", labels, 1) + end +end + +function metric_poll(poll_msg) + for _, tpv in ipairs(poll_msg['tpv']) do + local labels = {} + labels['device'] = tpv['device'] + + metric("gpsd_tpv_mode", "gauge", labels, tpv['mode']) + if tpv['alt'] ~= nil then + metric("gpsd_tpv_altitude_meters", "gauge", labels, tpv['alt']) + end + if tpv['lat'] ~= nil then + metric("gpsd_tpv_latitude_degrees", "gauge", labels, tpv['lat']) + end + if tpv['lon'] ~= nil then + metric("gpsd_tpv_longitude_degrees", "gauge", labels, tpv['lon']) + end + end +end + +local s, version_info = gpsd_setup() + +local function scrape() + if s == nil then + print("lost connection to gpsd, reconncting...") + s, version_info = gpsd_setup() + if s == nil then return s, version_info end + end + metric_version_info(version_info) + + s, poll_msg = gpsd_poll(s) + if s == nil then return s, poll end + + metric_devices(last_devices_msg) + metric_poll(poll_msg) +end + +return { scrape = scrape } diff --git a/roles/vm/guest/network/templates/interfaces/multihomed-base6.j2 b/roles/vm/guest/network/templates/interfaces/multihomed-base6.j2 new file mode 100644 index 00000000..53d118b0 --- /dev/null +++ b/roles/vm/guest/network/templates/interfaces/multihomed-base6.j2 @@ -0,0 +1,15 @@ + address {{ interface.address6 }} +{% for route in interface.static_routes6 | default([]) %} + up /bin/ip -6 route add {{ route.destination }} via {{ route.gateway }}{% if 'source' in route %} src {{ route.source }}{% endif %}{% if 'table' in route %} table {{ route.table }}{% endif %}{{ '' }} +{% endfor %} +{% if 'gateway6' in interface %} + up /bin/ip -6 route add default via {{ interface.gateway }} table default +{% endif %} + up /bin/ip -6 rule add pref 42000 lookup default + down /bin/ip -6 rule del pref 42000 +{% if 'gateway6' in interface %} + down /bin/ip -6 route del default via {{ interface.gateway }} table default +{% endif %} +{% for route in interface.static_routes6 | default([]) | reverse %} + down /bin/ip -6 route del {{ route.destination }} via {{ route.gateway }}{% if 'source' in route %} src {{ route.source }}{% endif %}{% if 'table' in route %} table {{ route.table }}{% endif %}{{ '' }} +{% endfor %} diff --git a/roles/vm/guest/network/templates/interfaces/multihomed-overlay.j2 b/roles/vm/guest/network/templates/interfaces/multihomed-overlay.j2 index 3fcfbcc7..580abf88 100644 --- a/roles/vm/guest/network/templates/interfaces/multihomed-overlay.j2 +++ b/roles/vm/guest/network/templates/interfaces/multihomed-overlay.j2 @@ -1,10 +1,11 @@ address {{ interface.address | ansible.utils.ipaddr('address') }} netmask {{ interface.address | ansible.utils.ipaddr('netmask') }} + #### overlays {% for overlay in interface.overlays %} {% if 'name' in overlay %} ## {{ overlay.name }} {% endif %} - up /bin/ip addr add dev $IFACE {{ overlay.address }} + up /bin/ip addr add dev $IFACE {{ overlay.address | ansible.utils.ipaddr('address') }}/32 up /bin/ip route add default via {{ overlay.gateway }} src {{ overlay.address | ansible.utils.ipaddr('address') }} table {{ 200 + loop.index0 }} up /bin/ip rule add pref {{ 40000 + loop.index0 }} from {{ overlay.address | ansible.utils.ipaddr('address') }} lookup {{ 200 + loop.index0 }} {% endfor %} @@ -15,5 +16,5 @@ {% endif %} down /bin/ip rule del pref {{ 40000 + loop.revindex0 }} down /bin/ip route del default via {{ overlay.gateway }} src {{ overlay.address | ansible.utils.ipaddr('address') }} table {{ 200 + loop.revindex0 }} - down /bin/ip addr del dev $IFACE {{ overlay.address }} + down /bin/ip addr del dev $IFACE {{ overlay.address | ansible.utils.ipaddr('address') }}/32 {% endfor %} diff --git a/roles/vm/guest/network/templates/interfaces/multihomed-overlay6.j2 b/roles/vm/guest/network/templates/interfaces/multihomed-overlay6.j2 new file mode 100644 index 00000000..0fd59882 --- /dev/null +++ b/roles/vm/guest/network/templates/interfaces/multihomed-overlay6.j2 @@ -0,0 +1,23 @@ + address {{ interface.address6 }} +#### overlays +{% for overlay in interface.overlays %} +{% if 'address6' in overlay %} +{% if 'name' in overlay %} + ## {{ overlay.name }} +{% endif %} + up /bin/ip -6 addr add dev $IFACE {{ overlay.address6 | ansible.utils.ipaddr('address') }}/128 nodad preferred_lft 0 + up /bin/ip -6 route add default via {{ overlay.gateway6 }} src {{ overlay.address6 | ansible.utils.ipaddr('address') }} table {{ 200 + loop.index0 }} + up /bin/ip -6 rule add pref {{ 40000 + loop.index0 }} from {{ overlay.address6 | ansible.utils.ipaddr('address') }} lookup {{ 200 + loop.index0 }} +{% endif %} +{% endfor %} + ########## +{% for overlay in interface.overlays | reverse %} +{% if 'address6' in overlay %} +{% if 'name' in overlay %} + ## {{ overlay.name }} +{% endif %} + down /bin/ip rule del pref {{ 40000 + loop.revindex0 }} + down /bin/ip route del default via {{ overlay.gateway6 }} src {{ overlay.address6 | ansible.utils.ipaddr('address') }} table {{ 200 + loop.revindex0 }} + down /bin/ip addr del dev $IFACE {{ overlay.address6 | ansible.utils.ipaddr('address') }}/128 +{% endif %} +{% endfor %} |