diff options
Diffstat (limited to 'krebs')
| -rw-r--r-- | krebs/4lib/default.nix | 3 | ||||
| -rw-r--r-- | krebs/4lib/shell.nix | 22 | ||||
| -rw-r--r-- | krebs/5pkgs/builders.nix | 2 | ||||
| -rw-r--r-- | krebs/5pkgs/logf/default.nix | 103 | 
4 files changed, 106 insertions, 24 deletions
| diff --git a/krebs/4lib/default.nix b/krebs/4lib/default.nix index f62c033bd..49241cc82 100644 --- a/krebs/4lib/default.nix +++ b/krebs/4lib/default.nix @@ -3,7 +3,7 @@  with builtins;  with lib; -let out = rec { +let out = import <stockholm/lib> // rec {    eq = x: y: x == y;    ne = x: y: x != y; @@ -35,7 +35,6 @@ let out = rec {    genid = import ./genid.nix { lib = lib // out; };    genid_signed = x: ((genid x) + 16777216) / 2;    git = import ./git.nix { lib = lib // out; }; -  shell = import ./shell.nix { inherit lib; };    tree = import ./tree.nix { inherit lib; };    lpad = n: c: s: diff --git a/krebs/4lib/shell.nix b/krebs/4lib/shell.nix deleted file mode 100644 index 5910adacc..000000000 --- a/krebs/4lib/shell.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ lib, ... }: - -with builtins; -with lib; - -rec { -  escape = -    let -      isSafeChar = c: match "[-+./0-9:=A-Z_a-z]" c != null; -    in -    stringAsChars (c: -      if isSafeChar c then c -      else if c == "\n" then "'\n'" -      else "\\${c}"); - -  # -  # shell script generators -  # - -  # example: "${cat (toJSON { foo = "bar"; })} | jq -r .foo" -  cat = s: "printf '%s' ${escape s}"; -} diff --git a/krebs/5pkgs/builders.nix b/krebs/5pkgs/builders.nix index da7052f38..4c087bc44 100644 --- a/krebs/5pkgs/builders.nix +++ b/krebs/5pkgs/builders.nix @@ -242,6 +242,8 @@ rec {      cp src.jq "$out"    ''; +  writeJSON = name: value: pkgs.writeText name (toJSON value); +    writeNixFromCabal =      trace (toString [        "The function `writeNixFromCabal` has been deprecated in favour of" diff --git a/krebs/5pkgs/logf/default.nix b/krebs/5pkgs/logf/default.nix new file mode 100644 index 000000000..246e4d954 --- /dev/null +++ b/krebs/5pkgs/logf/default.nix @@ -0,0 +1,103 @@ +{ lib, pkgs, ... }: + +with import <stockholm/lib>; + +let +  default-host-colors = pkgs.writeJSON "logf.default-host-colors.json" { +  }; +  default-prio-colors = pkgs.writeJSON "logf.default-prio-colors.json" { +    "0" = 196; # emerg +    "1" = 160; # alert +    "2" = 124; # crit +    "3" = 009; # err +    "4" = 011; # warning +    "5" = 255; # notice +    "6" = 250; # info +    "7" = 139; # debug +  }; +in + +pkgs.writeDashBin "logf" '' +  export LOGF_HOST_COLORS LOGF_PRIO_COLORS +  LOGF_HOST_COLORS=$(cat "''${LOGF_HOST_COLORS-${default-host-colors}}") +  LOGF_PRIO_COLORS=$(cat "''${LOGF_PRIO_COLORS-${default-prio-colors}}") +  printf '%s\0' "$@" \ +    | ${pkgs.findutils}/bin/xargs -0 -P 0 -n 1 ${pkgs.writeDash "logf-remote" '' +        target=$1 \ +        target_host=$(echo "$1" | sed 's/^.*@//;s/\..*//') \ +        exec 3>&1; +        2>&1 1>&3 ssh "$target" -T \ +            -o PreferredAuthentications=publickey \ +            -o StrictHostKeyChecking=yes \ +            exec journalctl -af -n 0 -o json \ +          | stdbuf -oL jq -Rf ${pkgs.writeJq "logf-remote-error.jq" '' +              { +                PRIORITY: "4", +                MESSAGE: ., +                SYSLOG_IDENTIFIER: env.target_host, +              } +            ''} +        sleep 10m +        exec "$0" "$@" +      ''} \ +    | ${pkgs.jq}/bin/jq -rf ${pkgs.writeJq "logf-filter.jq" '' +        (env.LOGF_HOST_COLORS | fromjson) as $host_colors | +        (env.LOGF_PRIO_COLORS | fromjson) as $prio_colors | + +        def when(c; f): if c then f else . end; + +        # anaphoric gsub +        def agsub(re; f): +          gsub("(?<it>\(re))"; .it | f); + +        # :: [int] -> sgr +        def sgr: "\u001b[\(map(tostring) | join(";"))m"; + +        # :: sgr +        def rst: [] | sgr; + +        # :: int -> sgr +        def fg(i): [38,5,i]|sgr; +        # TODO def fg(r;g;b): [38,2,r,g,b]|sgr; +        # http://cvs.schmorp.de/rxvt-unicode/src/command.C?revision=1.570&view=markup&sortby=log&sortdir=down + +        # (sgr; sgr) | (null; any) :: str -> str +        def col(a; b): when(a != null; a + . + b); +        def col(a): col(a; rst); + + +        def p_time: +          ._SOURCE_REALTIME_TIMESTAMP +          | if . != null then . | fromjson | . / 1000000 else now end +          | gmtime +          | todateiso8601 +          | col(fg(237)); + +        def p_host: +          ._HOSTNAME +          | if . != null then . else "-" end +          | col($host_colors[.]|when(. != null; fg(.))); + +        def p_ident: +          if .SYSLOG_IDENTIFIER != null then .SYSLOG_IDENTIFIER +          else ._COMM end +          | col(fg(244)); + +        def p_message: +          fg($prio_colors[if has("PRIORITY") then .PRIORITY else "-" end]) +            as $prio_c | +          .MESSAGE +          | sub("\r$"; "") +          | agsub("\\btv@nomic\\b"; "\(.)\u0007" | col(fg(219); $prio_c)) +          #| agsub("Start queue"; "\(.)\u0007" | col(fg(42); $prio_c)) +          | col($prio_c); + + +        [ p_time +        , p_host +        , p_ident +        , p_message +        ] +        | join(" ") +      ''} +'' | 
