From 162ab421a7a392d65ac7b7f40a3a6413807e221d Mon Sep 17 00:00:00 2001 From: Astro Date: Fri, 15 Oct 2021 19:14:17 +0200 Subject: [PATCH] radiobert: add dump1090-influxdb --- flake.lock | 8 +-- flake.nix | 2 +- hosts/containers/bind/default.nix | 13 +---- hosts/radiobert/dump1090.nix | 21 +++++++- overlay/default.nix | 2 + overlay/dump1090-influxdb/Gemfile | 4 ++ overlay/dump1090-influxdb/Gemfile.lock | 15 ++++++ overlay/dump1090-influxdb/default.nix | 17 ++++++ overlay/dump1090-influxdb/gemset.nix | 22 ++++++++ overlay/dump1090-influxdb/main.rb | 75 ++++++++++++++++++++++++++ 10 files changed, 161 insertions(+), 18 deletions(-) create mode 100644 overlay/dump1090-influxdb/Gemfile create mode 100644 overlay/dump1090-influxdb/Gemfile.lock create mode 100644 overlay/dump1090-influxdb/default.nix create mode 100644 overlay/dump1090-influxdb/gemset.nix create mode 100644 overlay/dump1090-influxdb/main.rb diff --git a/flake.lock b/flake.lock index 4adc85d2..262ee6d9 100644 --- a/flake.lock +++ b/flake.lock @@ -127,11 +127,11 @@ }, "secrets": { "locked": { - "lastModified": 1634253091, - "narHash": "sha256-aEKQ8bzsK/0RwNXcBcch1J9M369C83QpzU7PWuaCW6w=", + "lastModified": 1634253643, + "narHash": "sha256-uX2zviwxBDWPnacMfLWpmsddJR5zLKfhqdxs04+UakM=", "ref": "master", - "rev": "4b502a1f949417f0c9c9bba57837041cf6d06e9e", - "revCount": 102, + "rev": "3b337a981efaca600fc268d31a553522a578d7dd", + "revCount": 103, "type": "git", "url": "ssh://gitea@gitea.c3d2.de/c3d2-admins/secrets.git" }, diff --git a/flake.nix b/flake.nix index fde684e8..0f4a8cae 100644 --- a/flake.nix +++ b/flake.nix @@ -435,7 +435,7 @@ modules = [ ({ ... }: { nixpkgs.overlays = with secrets.overlays; [ - # bind + bind ]; }) ./lib/lxc-container.nix diff --git a/hosts/containers/bind/default.nix b/hosts/containers/bind/default.nix index 50b6f969..fd82a665 100644 --- a/hosts/containers/bind/default.nix +++ b/hosts/containers/bind/default.nix @@ -61,18 +61,7 @@ in # Build script systemd.services.deploy-c3d2-dns = let - # inherit (pkgs.bind-secrets) giteaToken sshPrivkey; - giteaToken = "8bcab04863519d239a0b42d4fd3c02dce144b0c0"; - - sshPrivkey = '' - -----BEGIN OPENSSH PRIVATE KEY----- - b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW - QyNTUxOQAAACCbHM7kAahk7NZQ4bMwEVJv3d2RzLJB5Tdsgi6aaUEQYwAAAJDq6piE6uqY - hAAAAAtzc2gtZWQyNTUxOQAAACCbHM7kAahk7NZQ4bMwEVJv3d2RzLJB5Tdsgi6aaUEQYw - AAAEAs34c89xB1x4ZHPQywNuIIcbDqiuVtYWC9NhFwVQGo2JsczuQBqGTs1lDhszARUm/d - 3ZHMskHlN2yCLpppQRBjAAAADXN0ZXBoYW5AYmxhemU= - -----END OPENSSH PRIVATE KEY----- - ''; + inherit (pkgs.bind-secrets) giteaToken sshPrivkey; in { wantedBy = [ "multi-user.target" ]; before = [ "bind.service" ]; diff --git a/hosts/radiobert/dump1090.nix b/hosts/radiobert/dump1090.nix index 3bf5edb9..286e795d 100644 --- a/hosts/radiobert/dump1090.nix +++ b/hosts/radiobert/dump1090.nix @@ -7,7 +7,7 @@ ]; users.users.dump1090 = { isSystemUser = true; - group = "dump10190"; + group = "dump1090"; }; users.groups.dump1090 = {}; systemd.tmpfiles.rules = [ @@ -44,6 +44,25 @@ Exec "${config.services.collectd.user}" "${pkgs.ruby}/bin/ruby" "-I${libDir}" "${./collectd-adsb.rb}" ''; + systemd.services.collectd.requires = [ "dump1090.service" ]; + + users.users.dump1090-influxdb = { + isSystemUser = true; + group = "dump1090"; + }; + systemd.services.dump1090-influxdb = { + wantedBy = [ "multi-user.target" ]; + requires = [ "dump1090.services" ]; + serviceConfig = { + ExecStart = "${pkgs.dump1090-influxdb}/bin/dump1090-influxdb"; + User = "dump1090-influxdb"; + Group = "dump1090"; + ProtectSystem = "full"; + ProtectHome = true; + Restart = "always"; + RestartSec = "10s"; + }; + }; environment.systemPackages = with pkgs; [ dump1090_sdrplus diff --git a/overlay/default.nix b/overlay/default.nix index 7da6bae6..7096ae6b 100644 --- a/overlay/default.nix +++ b/overlay/default.nix @@ -12,4 +12,6 @@ final: prev: pi-sensors = prev.callPackage ./pi-sensors { }; hackrf = import ./hackrf.nix prev; + + dump1090-influxdb = import ./dump1090-influxdb { pkgs = prev; }; } diff --git a/overlay/dump1090-influxdb/Gemfile b/overlay/dump1090-influxdb/Gemfile new file mode 100644 index 00000000..8d52fd12 --- /dev/null +++ b/overlay/dump1090-influxdb/Gemfile @@ -0,0 +1,4 @@ +source "https://rubygems.org" + +gem "influxdb", "~> 0.8" +gem "gis-distance", "~> 1.1" diff --git a/overlay/dump1090-influxdb/Gemfile.lock b/overlay/dump1090-influxdb/Gemfile.lock new file mode 100644 index 00000000..453a0e58 --- /dev/null +++ b/overlay/dump1090-influxdb/Gemfile.lock @@ -0,0 +1,15 @@ +GEM + remote: https://rubygems.org/ + specs: + gis-distance (1.1.0) + influxdb (0.8.1) + +PLATFORMS + ruby + +DEPENDENCIES + gis-distance (~> 1.1) + influxdb (~> 0.8) + +BUNDLED WITH + 2.1.4 diff --git a/overlay/dump1090-influxdb/default.nix b/overlay/dump1090-influxdb/default.nix new file mode 100644 index 00000000..7b4ca5fa --- /dev/null +++ b/overlay/dump1090-influxdb/default.nix @@ -0,0 +1,17 @@ +{ pkgs ? import {} }: + +with pkgs; +let + gems = bundlerEnv { + name = "dump1090-influxdb-gems"; + gemdir = ./.; + }; +in +stdenv.mkDerivation rec { + name = "dump1090-influxdb"; + buildInputs = [ gems.wrappedRuby ]; + buildCommand = '' + install -D -m755 ${./main.rb} $out/bin/${name} + patchShebangs $out/bin/${name} + ''; +} diff --git a/overlay/dump1090-influxdb/gemset.nix b/overlay/dump1090-influxdb/gemset.nix new file mode 100644 index 00000000..d9b0f3af --- /dev/null +++ b/overlay/dump1090-influxdb/gemset.nix @@ -0,0 +1,22 @@ +{ + gis-distance = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1kgv1scv25b65d9xfricj1ayd2iry7imgk7qw4mryd91mhriibaf"; + type = "gem"; + }; + version = "1.1.0"; + }; + influxdb = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1l2sjf8kaw3adjjg3l7zg1j735yxdfldf04gl9kjc3hbpdcd7d4w"; + type = "gem"; + }; + version = "0.8.1"; + }; +} diff --git a/overlay/dump1090-influxdb/main.rb b/overlay/dump1090-influxdb/main.rb new file mode 100644 index 00000000..2e460f1b --- /dev/null +++ b/overlay/dump1090-influxdb/main.rb @@ -0,0 +1,75 @@ +#!/usr/bin/env ruby + +require 'socket' +require 'influxdb' +require 'gis/distance' + +HOSTNAME = IO::readlines("/proc/sys/kernel/hostname").join.chomp +INTERVAL = 1 +SERIES = 'adsb' +POS = [ 51.08102, 13.72806 ] + +db = InfluxDB::Client.new(url: "http://grafana.serv.zentralwerk.org:8086/adsb") +msg_type_count = {} + +sock = TCPSocket.new "radiobert.serv.zentralwerk.org", 30003 +STDERR.puts "Connected to dump1090" + +while line = sock.gets + begin + fields = line.chomp.split(/,/) + msg_type = fields[1].to_i + msg_type_count[msg_type] = 0 unless msg_type_count[msg_type] + aircraft = fields[4] + points = [ { series: SERIES, + tags: { + data: "msg_type", + msg_type: msg_type, + }, + values: { + count: msg_type_count[msg_type] += 1, + }, + } ] + + case msg_type + when 3 + values = {} + unless fields[14].empty? or fields[15].empty? + values[:lat] = fields[14].to_f + values[:lon] = fields[15].to_f + values[:dist] = GIS::Distance::new(POS[0], POS[1], values[:lat], values[:lon]).distance + end + unless fields[11].empty? + values[:alt] = fields[11].to_i + end + + points.push({ series: SERIES, + tags: { + data: "pos", + aircraft: aircraft, + }, + values: values, + }) + when 4 + values = {} + unless fields[12].empty? + values[:ground_speed] = fields[12].to_i + end + unless fields[13].empty? + values[:track] = fields[13].to_i + end + points.push({ series: SERIES, + tags: { + data: "velocity", + aircraft: aircraft, + }, + values: values, + }) + end + + db.write_points points, 'm' + + rescue + STDERR.puts $! + end +end