From ef371b32c483d3a76f8e605320329c84ff1bba52 Mon Sep 17 00:00:00 2001 From: Astro Date: Sun, 23 May 2021 23:16:28 +0200 Subject: [PATCH] nixos-module/collectd: add starlink-stats --- nix/lib/config/legacy.nix | 22 +++++++++++------- nix/lib/config/options.nix | 3 +++ nix/nixos-module/collectd/default.nix | 13 ++++++++++- nix/pkgs/default.nix | 5 +++- nix/pkgs/starlink/convert.rb | 33 +++++++++++++++++++++++++++ nix/pkgs/starlink/default.nix | 8 +++++++ nix/pkgs/starlink/grpc.nix | 10 ++++++++ nix/pkgs/starlink/stats.nix | 14 ++++++++++++ 8 files changed, 98 insertions(+), 10 deletions(-) create mode 100644 nix/pkgs/starlink/convert.rb create mode 100644 nix/pkgs/starlink/default.nix create mode 100644 nix/pkgs/starlink/grpc.nix create mode 100644 nix/pkgs/starlink/stats.nix diff --git a/nix/lib/config/legacy.nix b/nix/lib/config/legacy.nix index 6c2b78a..7fb429f 100644 --- a/nix/lib/config/legacy.nix +++ b/nix/lib/config/legacy.nix @@ -92,14 +92,20 @@ in services.dnscache.enable = true; }; - upstream1.interfaces.up1.upstream.noNat.subnets6 = [ - "2a02:8106:208:5200::/56" - ]; - upstream2.interfaces.up2.upstream.noNat.subnets6 = [ - "2a02:8106:208:e900::/56" - ]; - upstream3.interfaces.up3.upstream = {}; - upstream4.interfaces.up4.upstream = {}; + upstream1.interfaces.up1.upstream = { + provider = "vodafone"; + noNat.subnets6 = [ + "2a02:8106:208:5200::/56" + ]; + }; + upstream2.interfaces.up2.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; upstream2.ospf.upstreamInstance = 4; anon1.ospf.upstreamInstance = 5; diff --git a/nix/lib/config/options.nix b/nix/lib/config/options.nix index 693cb86..3e44c13 100644 --- a/nix/lib/config/options.nix +++ b/nix/lib/config/options.nix @@ -103,6 +103,9 @@ let }; }; upstreamOpts = { + provider = mkOption { + type = types.str; + }; upBandwidth = mkOption { type = with types; nullOr int; default = null; diff --git a/nix/nixos-module/collectd/default.nix b/nix/nixos-module/collectd/default.nix index a79b038..e54c762 100644 --- a/nix/nixos-module/collectd/default.nix +++ b/nix/nixos-module/collectd/default.nix @@ -1,6 +1,7 @@ -{ hostName, config, lib, pkgs, ... }: +{ hostName, self, config, lib, pkgs, ... }: let + inherit (pkgs.targetPlatform) system; hostRole = config.site.hosts.${hostName}.role; networkPort = 25826; upstreamTypesDb = pkgs.stdenv.mkDerivation { @@ -12,6 +13,12 @@ let customTypesDb = builtins.toFile "types.db" '' 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 { services.collectd = { @@ -70,6 +77,10 @@ in exec = '' 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" + ''; }) ]; }; } diff --git a/nix/pkgs/default.nix b/nix/pkgs/default.nix index f153c51..8a29fbd 100644 --- a/nix/pkgs/default.nix +++ b/nix/pkgs/default.nix @@ -59,7 +59,10 @@ let inherit self nixpkgs system; }; + starlink = import ./starlink { + inherit pkgs; + }; in -salt-pillars // rootfs-packages // vm-packages // device-templates // { +salt-pillars // rootfs-packages // vm-packages // device-templates // starlink // { inherit export-config dns-slaves; } diff --git a/nix/pkgs/starlink/convert.rb b/nix/pkgs/starlink/convert.rb new file mode 100644 index 000000000..79ce2ee --- /dev/null +++ b/nix/pkgs/starlink/convert.rb @@ -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) diff --git a/nix/pkgs/starlink/default.nix b/nix/pkgs/starlink/default.nix new file mode 100644 index 000000000..70b4ad5 --- /dev/null +++ b/nix/pkgs/starlink/default.nix @@ -0,0 +1,8 @@ +{ pkgs ? import {} }: + +rec { + starlink-grpc = pkgs.callPackage ./grpc.nix {}; + starlink-stats = pkgs.callPackage ./stats.nix { + inherit starlink-grpc; + }; +} diff --git a/nix/pkgs/starlink/grpc.nix b/nix/pkgs/starlink/grpc.nix new file mode 100644 index 000000000..f79dc43 --- /dev/null +++ b/nix/pkgs/starlink/grpc.nix @@ -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 +'' diff --git a/nix/pkgs/starlink/stats.nix b/nix/pkgs/starlink/stats.nix new file mode 100644 index 000000000..4274337 --- /dev/null +++ b/nix/pkgs/starlink/stats.nix @@ -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 +''