nixos-module/collectd: add starlink-stats

This commit is contained in:
Astro 2021-05-23 23:16:28 +02:00
parent e6ba05d34c
commit ef371b32c4
8 changed files with 98 additions and 10 deletions

View File

@ -92,14 +92,20 @@ in
services.dnscache.enable = true; services.dnscache.enable = true;
}; };
upstream1.interfaces.up1.upstream.noNat.subnets6 = [ upstream1.interfaces.up1.upstream = {
"2a02:8106:208:5200::/56" provider = "vodafone";
]; noNat.subnets6 = [
upstream2.interfaces.up2.upstream.noNat.subnets6 = [ "2a02:8106:208:5200::/56"
"2a02:8106:208:e900::/56" ];
]; };
upstream3.interfaces.up3.upstream = {}; upstream2.interfaces.up2.upstream = {
upstream4.interfaces.up4.upstream = {}; provider = "vodafone";
noNat.subnets6 = [
"2a02:8106:208:e900::/56"
];
};
upstream3.interfaces.up3.upstream.provider = "starlink";
upstream4.interfaces.up4.upstream.provider = "dsi";
upstream1.ospf.upstreamInstance = 3; upstream1.ospf.upstreamInstance = 3;
upstream2.ospf.upstreamInstance = 4; upstream2.ospf.upstreamInstance = 4;
anon1.ospf.upstreamInstance = 5; anon1.ospf.upstreamInstance = 5;

View File

@ -103,6 +103,9 @@ let
}; };
}; };
upstreamOpts = { upstreamOpts = {
provider = mkOption {
type = types.str;
};
upBandwidth = mkOption { upBandwidth = mkOption {
type = with types; nullOr int; type = with types; nullOr int;
default = null; default = null;

View File

@ -1,6 +1,7 @@
{ hostName, config, lib, pkgs, ... }: { hostName, self, config, lib, pkgs, ... }:
let let
inherit (pkgs.targetPlatform) system;
hostRole = config.site.hosts.${hostName}.role; hostRole = config.site.hosts.${hostName}.role;
networkPort = 25826; networkPort = 25826;
upstreamTypesDb = pkgs.stdenv.mkDerivation { upstreamTypesDb = pkgs.stdenv.mkDerivation {
@ -12,6 +13,12 @@ let
customTypesDb = builtins.toFile "types.db" '' customTypesDb = builtins.toFile "types.db" ''
stations value:GAUGE:0:U stations value:GAUGE:0:U
''; '';
hasStarlink =
builtins.any ({ upstream, ... }:
if upstream == null
then false
else upstream.provider == "starlink"
) (builtins.attrValues config.site.hosts.${hostName}.interfaces);
in in
{ {
services.collectd = { services.collectd = {
@ -70,6 +77,10 @@ in
exec = '' exec = ''
Exec "collectd" "${pkgs.ruby}/bin/ruby" "${./unbound.rb}" Exec "collectd" "${pkgs.ruby}/bin/ruby" "${./unbound.rb}"
''; '';
}) (lib.optionalAttrs hasStarlink {
exec = ''
Exec "collectd" "${self.packages.${system}.starlink-stats}/bin/starlink-stats" "192.168.100.1:9200"
'';
}) ]; }) ];
}; };
} }

View File

@ -59,7 +59,10 @@ let
inherit self nixpkgs system; inherit self nixpkgs system;
}; };
starlink = import ./starlink {
inherit pkgs;
};
in in
salt-pillars // rootfs-packages // vm-packages // device-templates // { salt-pillars // rootfs-packages // vm-packages // device-templates // starlink // {
inherit export-config dns-slaves; inherit export-config dns-slaves;
} }

View File

@ -0,0 +1,33 @@
#!/usr/bin/env ruby
# Converts Starlink status JSON to a format that is suitable for collectd exec
require 'json'
HOSTNAME = IO::readlines("/proc/sys/kernel/hostname").join.strip
def out path, x
puts "PUTVAL \"#{HOSTNAME}/exec-starlink/current-#{path.join '.'}\" #{x}"
end
def recurse path, x
if x.kind_of? Hash
x.each { |k, v|
recurse path + [k], v
}
elsif x.kind_of? Array
x.each_with_index { |v, i|
recurse path + [i], v
}
elsif x.kind_of? Float
out path, x
elsif x.kind_of? Fixnum
out path, x.to_f
elsif x.kind_of? String and x =~ /^\-?\d*\.?\d+$/
out path, x.to_f
end
end
recurse [], JSON.load(STDIN)

View File

@ -0,0 +1,8 @@
{ pkgs ? import <nixpkgs> {} }:
rec {
starlink-grpc = pkgs.callPackage ./grpc.nix {};
starlink-stats = pkgs.callPackage ./stats.nix {
inherit starlink-grpc;
};
}

View File

@ -0,0 +1,10 @@
{ writeScriptBin, runtimeShell, grpcurl }:
writeScriptBin "grpc" ''
#! ${runtimeShell} -e
DEST=$1
COMMAND=$2
exec ${grpcurl}/bin/grpcurl -plaintext -d "{\"$COMMAND\":{}}" $DEST SpaceX.API.Device.Device/Handle
''

View File

@ -0,0 +1,14 @@
{ writeScriptBin, runtimeShell, starlink-grpc, ruby }:
writeScriptBin "starlink-stats" ''
#! ${runtimeShell} -e
DEST=$1
COMMAND=get_status
while true; do
${starlink-grpc}/bin/grpc $DEST $COMMAND | ${ruby}/bin/ruby ${./convert.rb}
sleep 60
done
''