summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2022-09-28 16:30:24 +0200
committerChristian Pointner <equinox@spreadspace.org>2022-09-28 16:30:24 +0200
commit2bc7f22198ba4b21db501d00f1924b3211273194 (patch)
treea871c4249f4a9f97e2267c0e251b627baebeb1f4
parentraspios: rename keyring file (diff)
import some stuff from helsinki ansible
-rw-r--r--files/common/openwrt/gpsd_prometheus-node-exporter.lua138
-rw-r--r--roles/vm/guest/network/templates/interfaces/multihomed-base6.j215
-rw-r--r--roles/vm/guest/network/templates/interfaces/multihomed-overlay.j25
-rw-r--r--roles/vm/guest/network/templates/interfaces/multihomed-overlay6.j223
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 %}