radiobert: add dump1090-influxdb

This commit is contained in:
Astro 2021-10-15 19:14:17 +02:00
parent 79b2b259bc
commit 162ab421a7
10 changed files with 161 additions and 18 deletions

View File

@ -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"
},

View File

@ -435,7 +435,7 @@
modules = [
({ ... }: {
nixpkgs.overlays = with secrets.overlays; [
# bind
bind
];
})
./lib/lxc-container.nix

View File

@ -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" ];

View File

@ -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}"
</Plugin>
'';
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

View File

@ -12,4 +12,6 @@ final: prev:
pi-sensors = prev.callPackage ./pi-sensors { };
hackrf = import ./hackrf.nix prev;
dump1090-influxdb = import ./dump1090-influxdb { pkgs = prev; };
}

View File

@ -0,0 +1,4 @@
source "https://rubygems.org"
gem "influxdb", "~> 0.8"
gem "gis-distance", "~> 1.1"

View File

@ -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

View File

@ -0,0 +1,17 @@
{ pkgs ? import <nixpkgs> {} }:
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}
'';
}

View File

@ -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";
};
}

View File

@ -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