about summary refs log tree commit diff
path: root/tools
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@google.com>2019-12-20T20·18+0000
committerVincent Ambo <tazjin@google.com>2019-12-20T20·18+0000
commit03bfe08e1dd9faf48b06cb146bfa446575cde88a (patch)
tree55317968922a9b2a01516f1b79527874df037517 /tools
parente52eed3cd4f73779c2e7c350537fb346835ba9f3 (diff)
chore: Significantly restructure folder layout r/237
This moves the various projects from "type-based" folders (such as
"services" or "tools") into more appropriate semantic folders (such as
"nix", "ops" or "web").

Deprecated projects (nixcon-demo & gotest) which only existed for
testing/demonstration purposes have been removed.

(Note: *all* builds are broken with this commit)
Diffstat (limited to 'tools')
-rw-r--r--tools/aoc2019/default.nix22
-rw-r--r--tools/aoc2019/solution-day1.el28
-rw-r--r--tools/aoc2019/solution-day2.el53
-rw-r--r--tools/aoc2019/solution-day3.el64
-rw-r--r--tools/aoc2019/solution-day4.el73
-rwxr-xr-xtools/bin/__dispatch.sh44
l---------tools/bin/aoc20191
l---------tools/bin/blog_cli1
l---------tools/bin/kms_pass1
l---------tools/bin/kontemplate1
l---------tools/bin/rink1
l---------tools/bin/stern1
l---------tools/bin/terraform1
-rw-r--r--tools/gotest/default.nix27
-rw-r--r--tools/gotest/lib.go11
-rw-r--r--tools/gotest/main.go16
-rw-r--r--tools/gotest/test.proto9
-rw-r--r--tools/journaldriver/.gitignore3
-rw-r--r--tools/journaldriver/Cargo.lock816
-rw-r--r--tools/journaldriver/Cargo.toml21
-rw-r--r--tools/journaldriver/README.md152
-rw-r--r--tools/journaldriver/build.rs6
-rw-r--r--tools/journaldriver/default.nix9
-rw-r--r--tools/journaldriver/src/main.rs665
-rw-r--r--tools/journaldriver/src/tests.rs95
-rw-r--r--tools/kms_pass.nix60
26 files changed, 0 insertions, 2181 deletions
diff --git a/tools/aoc2019/default.nix b/tools/aoc2019/default.nix
deleted file mode 100644
index a53586eea9..0000000000
--- a/tools/aoc2019/default.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-# Solutions for Advent of Code 2019, written in Emacs Lisp.
-#
-# For each day a new file is created as "solution-day$n.el".
-{ pkgs, ... }:
-
-let
-  inherit (builtins) attrNames filter head listToAttrs match readDir;
-  dir = readDir ./.;
-  matchSolution = match "solution-(.*)\.el";
-  isSolution = f: (matchSolution f) != null;
-  getDay = f: head (matchSolution f);
-
-  solutionFiles = filter (e: dir."${e}" == "regular" && isSolution e) (attrNames dir);
-  solutions = map (f: let day = getDay f; in {
-    name = day;
-    value = pkgs.writeElispBin {
-      name = "aoc2019";
-      deps = p: with p; [ dash s ht ];
-      src = ./. + ("/" + f);
-    };
-  }) solutionFiles;
-in listToAttrs solutions
diff --git a/tools/aoc2019/solution-day1.el b/tools/aoc2019/solution-day1.el
deleted file mode 100644
index d805c22ec8..0000000000
--- a/tools/aoc2019/solution-day1.el
+++ /dev/null
@@ -1,28 +0,0 @@
-;; Advent of Code 2019 - Day 1
-(require 'dash)
-
-;; Puzzle 1:
-
-(defvar day-1/input
-  '(83285 96868 121640 51455 128067 128390 141809 52325 68310 140707 124520 149678
-          87961 52040 133133 52203 117483 85643 84414 86558 65402 122692 88565 61895
-          126271 128802 140363 109764 53600 114391 98973 124467 99574 69140 144856
-          56809 149944 138738 128823 82776 77557 51994 74322 64716 114506 124074
-          73096 97066 96731 149307 135626 121413 69575 98581 50570 60754 94843 72165
-          146504 53290 63491 50936 79644 119081 70218 85849 133228 114550 131943
-          67288 68499 80512 148872 99264 119723 68295 90348 146534 52661 99146 95993
-          130363 78956 126736 82065 77227 129950 97946 132345 107137 79623 148477
-          88928 118911 75277 97162 80664 149742 88983 74518))
-
-(defun calculate-fuel (mass)
-  (- (/ mass 3) 2))
-
-(message "Solution to day1/1: %d" (apply #'+ (-map #'calculate-fuel day-1/input)))
-
-;; Puzzle 2:
-(defun calculate-recursive-fuel (mass)
-  (let ((fuel (calculate-fuel mass)))
-    (if (< fuel 0) 0
-      (+ fuel (calculate-recursive-fuel fuel)))))
-
-(message "Solution to day1/2: %d" (apply #'+ (-map #'calculate-recursive-fuel day-1/input)))
diff --git a/tools/aoc2019/solution-day2.el b/tools/aoc2019/solution-day2.el
deleted file mode 100644
index 6ecac1e201..0000000000
--- a/tools/aoc2019/solution-day2.el
+++ /dev/null
@@ -1,53 +0,0 @@
-;; -*- lexical-binding: t; -*-
-;; Advent of Code 2019 - Day 2
-(require 'dash)
-(require 'ht)
-
-(defvar day2/input
-  [1 0 0 3 1 1 2 3 1 3 4 3 1 5 0 3 2 1 9 19 1 19 5 23 1 13 23 27 1 27 6 31
-     2 31 6 35 2 6 35 39 1 39 5 43 1 13 43 47 1 6 47 51 2 13 51 55 1 10 55
-     59 1 59 5 63 1 10 63 67 1 67 5 71 1 71 10 75 1 9 75 79 2 13 79 83 1 9
-     83 87 2 87 13 91 1 10 91 95 1 95 9 99 1 13 99 103 2 103 13 107 1 107 10
-     111 2 10 111 115 1 115 9 119 2 119 6 123 1 5 123 127 1 5 127 131 1 10
-     131 135 1 135 6 139 1 10 139 143 1 143 6 147 2 147 13 151 1 5 151 155 1
-     155 5 159 1 159 2 163 1 163 9 0 99 2 14 0 0])
-
-;; Puzzle 1
-
-(defun day2/single-op (f state idx)
-  (let* ((a (aref state (aref state (+ 1 idx))))
-         (b (aref state (aref state (+ 2 idx))))
-         (p (aref state (+ 3 idx)))
-         (result (funcall f a b)))
-    (aset state p (funcall f a b))))
-
-(defun day2/operate (state idx)
-  (pcase (aref state idx)
-    (99 (aref state 0))
-    (1 (day2/single-op #'+ state idx)
-       (day2/operate state (+ 4 idx)))
-    (2 (day2/single-op #'* state idx)
-       (day2/operate state (+ 4 idx)))
-    (other (error "Unknown opcode: %s" other))))
-
-(defun day2/program-with-inputs (noun verb)
-  (let* ((input (copy-tree day2/input t)))
-    (aset input 1 noun)
-    (aset input 2 verb)
-    (day2/operate input 0)))
-
-(message "Solution to day2/1: %s" (day2/program-with-inputs 12 2))
-
-;; Puzzle 2
-(let* ((used (ht))
-       (noun 0)
-       (verb 0)
-       (result (day2/program-with-inputs noun verb)))
-  (while (/= 19690720 result)
-    (setq noun (random 100))
-    (setq verb (random 100))
-    (unless (ht-get used (format "%d%d" noun verb))
-      (ht-set used (format "%d%d" noun verb) t)
-      (setq result (day2/program-with-inputs noun verb))))
-
-  (message "Solution to day2/2: %s%s" noun verb))
diff --git a/tools/aoc2019/solution-day3.el b/tools/aoc2019/solution-day3.el
deleted file mode 100644
index b7dfdd245f..0000000000
--- a/tools/aoc2019/solution-day3.el
+++ /dev/null
@@ -1,64 +0,0 @@
-;; -*- lexical-binding: t; -*-
-;; Advent of Code 2019 - Day 3
-
-(require 'cl-lib)
-(require 'dash)
-(require 'ht)
-(require 's)
-
-(defvar day3/input/wire1
-  "R1010,D422,L354,U494,L686,U894,R212,U777,L216,U9,L374,U77,R947,U385,L170,U916,R492,D553,L992,D890,L531,U360,R128,U653,L362,U522,R817,U198,L126,D629,L569,U300,L241,U145,R889,D196,L450,D576,L319,D147,R985,U889,L941,U837,L608,D77,L864,U911,L270,D869,R771,U132,L249,U603,L36,D328,L597,U992,L733,D370,L947,D595,L308,U536,L145,U318,R55,D773,R175,D505,R483,D13,R780,U778,R445,D107,R490,U245,L587,U502,R446,U639,R150,U35,L455,D522,R866,U858,R394,D975,R513,D378,R58,D646,L374,D675,R209,U228,R530,U543,L480,U677,L912,D164,L573,U587,L784,D626,L994,U250,L215,U985,R684,D79,L877,U811,L766,U617,L665,D246,L408,U800,L360,D272,L436,U138,R240,U735,L681,U68,L608,D59,R532,D808,L104,U968,R887,U819,R346,U698,L317,U582,R516,U55,L303,U607,L457,U479,L510,D366,L583,U519,R878,D195,R970,D267,R842,U784,R9,D946,R833,D238,L232,D94,L860,D47,L346,U951,R491,D745,R849,U273,R263,U392,L341,D808,R696,U326,R886,D296,L865,U833,R241,U644,R729,D216,R661,D712,L466,D699,L738,U5,L556,D693,R912,D13,R48,U63,L877,U628,L689,D929,R74,U924,R612,U153,R417,U425,L879,D378,R79,D248,L3,U519,R366,U281,R439,D823,R149,D668,R326,D342,L213,D735,R504,U265,L718,D842,L565,U105,L214,U963,R518,D681,R642,U170,L111,U6,R697,U572,R18,U331,L618,D255,R534,D322,L399,U595,L246,U651,L836,U757,R417,D795,R291,U759,L568,U965,R828,D570,R350,U317,R338,D173,L74,D833,L650,D844,L70,U913,R594,U407,R674,D684,L481,D564,L128,D277,R851,D274,L435,D582,R469,U729,R387,D818,R443,U504,R414,U8,L842,U845,R275,U986,R53,U660,R661,D225,R614,U159,R477")
-
-(defvar day3/input/wire2
-  "L1010,D698,R442,U660,L719,U702,L456,D86,R938,D177,L835,D639,R166,D285,L694,U468,L569,D104,L234,D574,L669,U299,L124,D275,L179,D519,R617,U72,L985,D248,R257,D276,L759,D834,R490,U864,L406,U181,R911,U873,R261,D864,R260,U759,R648,U158,R308,D386,L835,D27,L745,U91,R840,U707,R275,U543,L663,U736,L617,D699,R924,U103,R225,U455,R708,U319,R569,U38,R315,D432,L179,D975,R519,D546,L295,U680,L685,U603,R262,D250,R7,U171,R261,U519,L832,U534,L471,U431,L474,U886,R10,D179,L79,D555,R452,U452,L832,U863,L367,U538,L237,D160,R441,U605,R942,U259,L811,D552,R646,D353,L225,D94,L35,D307,R752,U23,R698,U610,L379,D932,R698,D751,R178,D347,R325,D156,R471,D555,R558,D593,R773,U2,L955,U764,L735,U438,R364,D640,L757,U534,R919,U409,R361,U407,R336,D808,R877,D648,R610,U198,R340,U94,R795,D667,R811,U975,L965,D224,R565,D681,L64,U567,R621,U922,L665,U329,R242,U592,L727,D481,L339,U402,R213,D280,R656,U169,R976,D962,L294,D505,L251,D689,L497,U133,R230,D441,L90,D220,L896,D657,L500,U331,R502,U723,R762,D613,L447,D256,L226,U309,L935,U384,L740,D459,R309,D707,R952,D747,L304,D105,R977,D539,R941,D21,R291,U216,R132,D543,R515,U453,L854,D42,R982,U102,L469,D639,R559,D68,R302,U734,R980,D214,R107,D191,L730,D793,L63,U17,R807,U196,R412,D592,R330,D941,L87,D291,L44,D94,L272,D780,R968,U837,L712,D704,R163,U981,R537,U778,R220,D303,L196,D951,R163,D446,R11,D623,L72,D778,L158,U660,L189,D510,L247,D716,L89,U887,L115,U114,L36,U81,R927,U293,L265,U183,R331,D267,R745,D298,L561,D918,R299,U810,L322,U679,L739,D854,L581,U34,L862,D779,R23")
-
-;; Puzzle 1
-
-(defun wire-from (raw)
-  (-map (lambda (s)
-          (cons (substring s 0 1) (string-to-number (substring s 1))))
-        (s-split "," raw)))
-
-(defun day3/move (x y next)
-  (cl-flet ((steps (by op)
-                   (-map op (reverse (number-sequence 1 by)))))
-    (pcase next
-      (`("L" . ,by) (steps by (lambda (n) (cons (- x n) y))))
-      (`("R" . ,by) (steps by (lambda (n) (cons (+ x n) y))))
-      (`("U" . ,by) (steps by (lambda (n) (cons x (+ y n)))))
-      (`("D" . ,by) (steps by (lambda (n) (cons x (- y n))))))))
-
-(defun day3/wire-points (wire)
-  (let ((points (ht))
-        (point-list (-reduce-from
-                     (lambda (acc point)
-                       (-let* (((x . y) (car acc))
-                               (next (day3/move x y point)))
-                         (-concat next acc)))
-                     '((0 . 0)) wire)))
-    (-map (-lambda ((s . p)) (ht-set! points p s))
-          (-zip (reverse (number-sequence 0 (- (length point-list) 1))) point-list))
-    (ht-remove! points '(0 . 0))
-    points))
-
-(defun day3/closest-intersection (crossed-points)
-  (car (-sort #'<
-              (-map (-lambda ((x . y))
-                      (+ (abs x) (abs y)))
-                    crossed-points))))
-
-(defun day3/minimum-steps (wire1 wire2 crossed)
-  (car (-sort #'<
-              (-map (-lambda (p)
-                      (+ (ht-get wire1 p) (ht-get wire2 p)))
-                    crossed))))
-
-;; Example:
-(let* ((wire1-points (day3/wire-points (wire-from day3/input/wire1)))
-       (wire2-points (day3/wire-points (wire-from day3/input/wire2)))
-       (crossed-points (-filter (lambda (p) (ht-contains? wire1-points p))
-                                (ht-keys wire2-points))))
-  (message "Solution for day3/1: %d" (day3/closest-intersection crossed-points))
-  (message "Solution for day3/2: %d" (day3/minimum-steps wire1-points
-                                                         wire2-points
-                                                         crossed-points)))
diff --git a/tools/aoc2019/solution-day4.el b/tools/aoc2019/solution-day4.el
deleted file mode 100644
index 2805f3f4e9..0000000000
--- a/tools/aoc2019/solution-day4.el
+++ /dev/null
@@ -1,73 +0,0 @@
-;; -*- lexical-binding: t; -*-
-;; Advent of Code 2019 - Day 4
-
-(require 'cl-lib)
-(require 'dash)
-
-;; Puzzle 1
-
-(defun day4/to-digits (num)
-  "Convert NUM to a list of its digits."
-  (cl-labels ((steps (n digits)
-                     (if (= n 0) digits
-                       (steps (/ n 10) (cons (% n 10) digits)))))
-    (steps num '())))
-
-(defvar day4/input (-map #'day4/to-digits (number-sequence 128392 643281)))
-
-(defun day4/filter-password (digits)
-  "Determines whether the given rules match the supplied
-  number."
-
-  (and
-   ;; It is a six digit number
-   (= 6 (length digits))
-
-   ;; Value is within the range given in puzzle input
-   ;; (noop because the range is generated from the input)
-
-   ;; Two adjacent digits are the same (like 22 in 122345).
-   (car (-reduce-from (-lambda ((acc . prev) next)
-                        (cons (or acc (= prev next)) next))
-                      '(nil . 0) digits))
-
-   ;; Going from left to right, the digits never decrease; they only
-   ;; ever increase or stay the same (like 111123 or 135679).
-   (car (-reduce-from (-lambda ((acc . prev) next)
-                        (cons (and acc (>= next prev)) next))
-                      '(t . 0) digits))))
-
-;; Puzzle 2
-;;
-;; Additional criteria: If there's matching digits, they're not in a group.
-
-(cl-defstruct day4/acc state prev count)
-
-(defun day4/filter-longer-groups (digits)
-  (let ((res (-reduce-from
-              (lambda (acc next)
-                (cond ;; sequence is broken and count was at 1 ->
-                 ;; match!
-                 ((and (= (day4/acc-count acc) 2)
-                       (/= (day4/acc-prev acc) next))
-                  (setf (day4/acc-state acc) t))
-
-                 ;; sequence continues, counter increment!
-                 ((= (day4/acc-prev acc) next)
-                  (setf (day4/acc-count acc) (+ 1 (day4/acc-count acc))))
-
-                 ;; sequence broken, reset counter
-                 ((/= (day4/acc-prev acc) next)
-                  (setf (day4/acc-count acc) 1)))
-
-                (setf (day4/acc-prev acc) next)
-                acc)
-              (make-day4/acc :prev 0 :count 0) digits)))
-    (or (day4/acc-state res)
-        (= 2 (day4/acc-count res)))))
-
-(let* ((simple (-filter #'day4/filter-password day4/input))
-       (complex (-filter #'day4/filter-longer-groups simple)))
-  (message "Solution to day4/1: %d" (length simple))
-  (message "Solution to day4/2: %d" (length complex)))
-
diff --git a/tools/bin/__dispatch.sh b/tools/bin/__dispatch.sh
deleted file mode 100755
index 473342769d..0000000000
--- a/tools/bin/__dispatch.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env bash
-# This script dispatches invocations transparently to programs instantiated from
-# Nix.
-#
-# To add a new tool, insert it into the case statement below by setting `attr`
-# to the key in nixpkgs which represents the program you want to run.
-set -ueo pipefail
-
-readonly REPO_ROOT=$(dirname $0)/../..
-TARGET_TOOL=$(basename $0)
-
-case "${TARGET_TOOL}" in
-  terraform)
-    attr="third_party.terraform-gcp"
-    ;;
-  kontemplate)
-    attr="kontemplate"
-    ;;
-  blog_cli)
-    attr="tools.blog_cli"
-    ;;
-  stern)
-    attr="third_party.stern"
-    ;;
-  kms_pass)
-    attr="tools.kms_pass"
-    TARGET_TOOL="pass"
-    ;;
-  aoc2019)
-    attr="tools.aoc2019.${1}"
-    ;;
-  rink)
-    attr="third_party.rink"
-    ;;
-  *)
-    echo "The tool '${TARGET_TOOL}' is currently not installed in this repository."
-    exit 1
-    ;;
-esac
-
-result=$(nix-build --no-out-link --attr "${attr}" "${REPO_ROOT}")
-PATH="${result}/bin:$PATH"
-
-exec "${TARGET_TOOL}" "${@}"
diff --git a/tools/bin/aoc2019 b/tools/bin/aoc2019
deleted file mode 120000
index 8390ec9c96..0000000000
--- a/tools/bin/aoc2019
+++ /dev/null
@@ -1 +0,0 @@
-__dispatch.sh
\ No newline at end of file
diff --git a/tools/bin/blog_cli b/tools/bin/blog_cli
deleted file mode 120000
index 8390ec9c96..0000000000
--- a/tools/bin/blog_cli
+++ /dev/null
@@ -1 +0,0 @@
-__dispatch.sh
\ No newline at end of file
diff --git a/tools/bin/kms_pass b/tools/bin/kms_pass
deleted file mode 120000
index 8390ec9c96..0000000000
--- a/tools/bin/kms_pass
+++ /dev/null
@@ -1 +0,0 @@
-__dispatch.sh
\ No newline at end of file
diff --git a/tools/bin/kontemplate b/tools/bin/kontemplate
deleted file mode 120000
index 8390ec9c96..0000000000
--- a/tools/bin/kontemplate
+++ /dev/null
@@ -1 +0,0 @@
-__dispatch.sh
\ No newline at end of file
diff --git a/tools/bin/rink b/tools/bin/rink
deleted file mode 120000
index 8390ec9c96..0000000000
--- a/tools/bin/rink
+++ /dev/null
@@ -1 +0,0 @@
-__dispatch.sh
\ No newline at end of file
diff --git a/tools/bin/stern b/tools/bin/stern
deleted file mode 120000
index 8390ec9c96..0000000000
--- a/tools/bin/stern
+++ /dev/null
@@ -1 +0,0 @@
-__dispatch.sh
\ No newline at end of file
diff --git a/tools/bin/terraform b/tools/bin/terraform
deleted file mode 120000
index 8390ec9c96..0000000000
--- a/tools/bin/terraform
+++ /dev/null
@@ -1 +0,0 @@
-__dispatch.sh
\ No newline at end of file
diff --git a/tools/gotest/default.nix b/tools/gotest/default.nix
deleted file mode 100644
index 168d15748e..0000000000
--- a/tools/gotest/default.nix
+++ /dev/null
@@ -1,27 +0,0 @@
-# This file demonstrates how to make use of pkgs.buildGo.
-#
-# It introduces libraries and protobuf support, however gRPC support
-# is not yet included.
-#
-# From the root of this repository this example can be built with
-# `nix-build -A tools.gotest`
-{ pkgs, ... }:
-
-let
-  inherit (pkgs) buildGo;
-
-  somelib = buildGo.package {
-    name = "somelib";
-    srcs = [ ./lib.go ];
-  };
-
-  someproto = buildGo.proto {
-    name = "someproto";
-    proto = ./test.proto;
-  };
-
-in buildGo.program {
-  name = "gotest";
-  srcs = [ ./main.go ];
-  deps = [ somelib someproto ];
-} // { meta.enableCI = true; }
diff --git a/tools/gotest/lib.go b/tools/gotest/lib.go
deleted file mode 100644
index 0aeebb2aea..0000000000
--- a/tools/gotest/lib.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package somelib
-
-import "fmt"
-
-func Name() string {
-	return "edef"
-}
-
-func Greet(s string) string {
-	return fmt.Sprintf("Hello %s", s)
-}
diff --git a/tools/gotest/main.go b/tools/gotest/main.go
deleted file mode 100644
index 99218c0776..0000000000
--- a/tools/gotest/main.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// This program just exists to import some libraries and demonstrate
-// that the build works, it doesn't do anything useful.
-package main
-
-import (
-	"fmt"
-	"somelib"
-	"someproto"
-)
-
-func main() {
-	p := someproto.Person{
-		Name: somelib.Name(),
-	}
-	fmt.Println(somelib.Greet(fmt.Sprintf("%v", p)))
-}
diff --git a/tools/gotest/test.proto b/tools/gotest/test.proto
deleted file mode 100644
index 76af63072b..0000000000
--- a/tools/gotest/test.proto
+++ /dev/null
@@ -1,9 +0,0 @@
-syntax = "proto3";
-package someproto;
-
-import "google/protobuf/timestamp.proto";
-
-message Person {
-  string name = 1;
-  google.protobuf.Timestamp last_updated = 2;
-}
diff --git a/tools/journaldriver/.gitignore b/tools/journaldriver/.gitignore
deleted file mode 100644
index 29e65519ba..0000000000
--- a/tools/journaldriver/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-result
-/target
-**/*.rs.bk
diff --git a/tools/journaldriver/Cargo.lock b/tools/journaldriver/Cargo.lock
deleted file mode 100644
index 40bdc96280..0000000000
--- a/tools/journaldriver/Cargo.lock
+++ /dev/null
@@ -1,816 +0,0 @@
-[[package]]
-name = "aho-corasick"
-version = "0.6.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "ascii"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "atty"
-version = "0.2.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
- "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "backtrace"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
- "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
- "rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "backtrace-sys"
-version = "0.1.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "base64"
-version = "0.9.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "bitflags"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "byteorder"
-version = "1.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "cc"
-version = "1.0.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "cfg-if"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "chrono"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
- "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "chunked_transfer"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "cloudabi"
-version = "0.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "cookie"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
- "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "core-foundation"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "core-foundation-sys"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "cstr-argument"
-version = "0.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "env_logger"
-version = "0.5.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "failure"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "failure_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "failure_derive"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "synstructure 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "foreign-types"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "foreign-types-shared"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "fuchsia-zircon"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "fuchsia-zircon-sys"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "humantime"
-version = "1.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "idna"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "itoa"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "journaldriver"
-version = "1.1.0"
-dependencies = [
- "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "failure 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "medallion 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)",
- "systemd 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "ureq 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "lazy_static"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "libc"
-version = "0.2.43"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "libsystemd-sys"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
- "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "log"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "matches"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "medallion"
-version = "2.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "openssl 0.10.12 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)",
- "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "memchr"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "memchr"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
- "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "native-tls"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
- "openssl 0.10.12 (registry+https://github.com/rust-lang/crates.io-index)",
- "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "openssl-sys 0.9.36 (registry+https://github.com/rust-lang/crates.io-index)",
- "schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
- "security-framework 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "tempfile 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.39"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "openssl"
-version = "0.10.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
- "openssl-sys 0.9.36 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "openssl-probe"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "openssl-sys"
-version = "0.9.36"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
- "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
- "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "percent-encoding"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "pkg-config"
-version = "0.3.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "proc-macro2"
-version = "0.4.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "qstring"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "quick-error"
-version = "1.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "quote"
-version = "0.6.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "rand"
-version = "0.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
- "rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "redox_syscall"
-version = "0.1.40"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "redox_termios"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "regex"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "aho-corasick 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "utf8-ranges 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "remove_dir_all"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "rustc-demangle"
-version = "0.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "ryu"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "safemem"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "schannel"
-version = "0.1.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "security-framework"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
- "security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "security-framework-sys"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "serde"
-version = "1.0.79"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "serde_derive"
-version = "1.0.79"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.15.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "syn"
-version = "0.14.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "syn"
-version = "0.15.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "synstructure"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "systemd"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cstr-argument 0.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
- "libsystemd-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "utf8-cstr 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "tempfile"
-version = "3.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
- "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
- "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "termcolor"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "termion"
-version = "1.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
- "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
- "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "thread_local"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "time"
-version = "0.1.40"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
- "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "ucd-util"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "unicode-bidi"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "unicode-normalization"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "unicode-xid"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "ureq"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "ascii 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "chunked_transfer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "cookie 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "native-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "qstring 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)",
- "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "url"
-version = "1.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "utf8-cstr"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "utf8-ranges"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "vcpkg"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "version_check"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "winapi"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "winapi-util"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "wincolor"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[metadata]
-"checksum aho-corasick 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "68f56c7353e5a9547cbd76ed90f7bb5ffc3ba09d4ea9bd1d8c06c8b1142eeb5a"
-"checksum ascii 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a5fc969a8ce2c9c0c4b0429bb8431544f6658283c8326ba5ff8c762b75369335"
-"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
-"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a"
-"checksum backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c66d56ac8dabd07f6aacdaf633f4b8262f5b3601a810a0dcddffd5c22c69daa0"
-"checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643"
-"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
-"checksum byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "90492c5858dd7d2e78691cfb89f90d273a2800fc11d98f60786e5d87e2f83781"
-"checksum cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "f159dfd43363c4d08055a07703eb7a3406b0dac4d0584d96965a3262db3c9d16"
-"checksum cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4e7bb64a8ebb0d856483e1e682ea3422f883c5f5615a90d51a2c82fe87fdd3"
-"checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878"
-"checksum chunked_transfer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "498d20a7aaf62625b9bf26e637cf7736417cde1d0c99f1d04d1170229a85cf87"
-"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
-"checksum cookie 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1465f8134efa296b4c19db34d909637cb2bf0f7aaf21299e23e18fa29ac557cf"
-"checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980"
-"checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa"
-"checksum cstr-argument 0.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "514570a4b719329df37f93448a70df2baac553020d0eb43a8dfa9c1f5ba7b658"
-"checksum env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)" = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38"
-"checksum failure 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7efb22686e4a466b1ec1a15c2898f91fa9cb340452496dca654032de20ff95b9"
-"checksum failure_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "946d0e98a50d9831f5d589038d2ca7f8f455b1c21028c0db0e84116a12696426"
-"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
-"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
-"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
-"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
-"checksum humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0484fda3e7007f2a4a0d9c3a703ca38c71c54c55602ce4660c419fd32e188c9e"
-"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
-"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b"
-"checksum lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca488b89a5657b0a2ecd45b95609b3e848cf1755da332a0da46e2b2b1cb371a7"
-"checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d"
-"checksum libsystemd-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e751b723417158e0949ba470bee4affd6f1dd6b67622b5240d79186631b6a0d9"
-"checksum log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fcce5fa49cc693c312001daf1d13411c4a5283796bac1084299ea3e567113f"
-"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
-"checksum medallion 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b2e6f0713b388174fc3de9b63a0a63dfcee191a8abc8e06c0a9c6d80821c1891"
-"checksum memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "148fab2e51b4f1cfc66da2a7c32981d1d3c083a803978268bb11fe4b86925e7a"
-"checksum memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b3629fe9fdbff6daa6c33b90f7c08355c1aca05a3d01fa8063b822fcf185f3b"
-"checksum native-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8b0a7bd714e83db15676d31caf968ad7318e9cc35f93c85a90231c8f22867549"
-"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
-"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1"
-"checksum openssl 0.10.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5e2e79eede055813a3ac52fb3915caf8e1c9da2dec1587871aec9f6f7b48508d"
-"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de"
-"checksum openssl-sys 0.9.36 (registry+https://github.com/rust-lang/crates.io-index)" = "409d77eeb492a1aebd6eb322b2ee72ff7c7496b4434d98b3bf8be038755de65e"
-"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
-"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c"
-"checksum proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "3d7b7eaaa90b4a90a932a9ea6666c95a389e424eff347f0f793979289429feee"
-"checksum qstring 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "545ec057a36a93e25fb5883baed912e4984af4e2543bbf0e3463d962e0408469"
-"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
-"checksum quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dd636425967c33af890042c483632d33fa7a18f19ad1d7ea72e8998c6ef8dea5"
-"checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c"
-"checksum rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1961a422c4d189dfb50ffa9320bf1f2a9bd54ecb92792fb9477f99a1045f3372"
-"checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db"
-"checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1"
-"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
-"checksum regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2069749032ea3ec200ca51e4a31df41759190a88edca0d2d86ee8bedf7073341"
-"checksum regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "747ba3b235651f6e2f67dfa8bcdcd073ddb7c243cb21c442fc12395dfcac212d"
-"checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5"
-"checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395"
-"checksum ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7153dd96dade874ab973e098cb62fcdbb89a03682e46b144fd09550998d4a4a7"
-"checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9"
-"checksum schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "0e1a231dc10abf6749cfa5d7767f25888d484201accbd919b66ab5413c502d56"
-"checksum security-framework 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "697d3f3c23a618272ead9e1fb259c1411102b31c6af8b93f1d64cca9c3b0e8e0"
-"checksum security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab01dfbe5756785b5b4d46e0289e5a18071dfa9a7c2b24213ea00b9ef9b665bf"
-"checksum serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "84257ccd054dc351472528c8587b4de2dbf0dc0fe2e634030c1a90bfdacebaa9"
-"checksum serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "31569d901045afbff7a9479f793177fe9259819aff10ab4f89ef69bbc5f567fe"
-"checksum serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "43344e7ce05d0d8280c5940cabb4964bea626aa58b1ec0e8c73fa2a8512a38ce"
-"checksum syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)" = "261ae9ecaa397c42b960649561949d69311f08eeaea86a65696e6e46517cf741"
-"checksum syn 0.15.8 (registry+https://github.com/rust-lang/crates.io-index)" = "356d1c5043597c40489e9af2d2498c7fefc33e99b7d75b43be336c8a59b3e45e"
-"checksum synstructure 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "85bb9b7550d063ea184027c9b8c20ac167cd36d3e06b3a40bceb9d746dc1a7b7"
-"checksum systemd 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b62a732355787f960c25536210ae0a981aca2e5dae9dab8491bdae39613ce48"
-"checksum tempfile 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "55c1195ef8513f3273d55ff59fe5da6940287a0d7a98331254397f464833675b"
-"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f"
-"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
-"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
-"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b"
-"checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d"
-"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
-"checksum unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25"
-"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
-"checksum ureq 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5f3f941c0434783c82e46d30508834be5f3c1f2c85dd1b98f0681984c7be8e03"
-"checksum url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2a321979c09843d272956e73700d12c4e7d3d92b2ee112b31548aef0d4efc5a6"
-"checksum utf8-cstr 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "55bcbb425141152b10d5693095950b51c3745d019363fc2929ffd8f61449b628"
-"checksum utf8-ranges 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd70f467df6810094968e2fce0ee1bd0e87157aceb026a8c083bcf5e25b9efe4"
-"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d"
-"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
-"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
-"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-"checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab"
-"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-"checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba"
diff --git a/tools/journaldriver/Cargo.toml b/tools/journaldriver/Cargo.toml
deleted file mode 100644
index 248b22807f..0000000000
--- a/tools/journaldriver/Cargo.toml
+++ /dev/null
@@ -1,21 +0,0 @@
-[package]
-name = "journaldriver"
-version = "1.1.0"
-authors = ["Vincent Ambo <mail@tazj.in>"]
-license = "GPL-3.0-or-later"
-
-[dependencies]
-chrono = { version = "0.4", features = [ "serde" ]}
-env_logger = "0.5"
-failure = "0.1"
-lazy_static = "1.0"
-log = "0.4"
-medallion = "2.2"
-serde = "1.0"
-serde_derive = "1.0"
-serde_json = "1.0"
-systemd = "0.3"
-ureq = { version = "0.6.2", features = [ "json" ]}
-
-[build-dependencies]
-pkg-config = "0.3"
diff --git a/tools/journaldriver/README.md b/tools/journaldriver/README.md
deleted file mode 100644
index 4dc9de0f61..0000000000
--- a/tools/journaldriver/README.md
+++ /dev/null
@@ -1,152 +0,0 @@
-journaldriver
-=============
-
-This is a small daemon used to forward logs from `journald` (systemd's
-logging service) to [Stackdriver Logging][].
-
-Many existing log services are written in inefficient dynamic
-languages with error-prone "cover every possible use-case"
-configuration. `journaldriver` instead aims to fit a specific use-case
-very well, instead of covering every possible logging setup.
-
-`journaldriver` can be run on GCP-instances with no additional
-configuration as authentication tokens are retrieved from the
-[metadata server][].
-
-<!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc-refresh-toc -->
-**Table of Contents**
-
-- [Features](#features)
-- [Usage on Google Cloud Platform](#usage-on-google-cloud-platform)
-- [Usage outside of Google Cloud Platform](#usage-outside-of-google-cloud-platform)
-- [Log levels / severities / priorities](#log-levels--severities--priorities)
-- [NixOS module](#nixos-module)
-- [Stackdriver Error Reporting](#stackdriver-error-reporting)
-
-<!-- markdown-toc end -->
-
-# Features
-
-* `journaldriver` persists the last forwarded position in the journal
-  and will resume forwarding at the same position after a restart
-* `journaldriver` will recognise log entries in JSON format and
-  forward them appropriately to make structured log entries available
-  in Stackdriver
-* `journaldriver` can be used outside of GCP by configuring static
-  credentials
-* `journaldriver` will recognise journald's log priority levels and
-  convert them into equivalent Stackdriver log severity levels
-
-# Usage on Google Cloud Platform
-
-`journaldriver` does not require any configuration when running on GCP
-instances.
-
-1. Install `journaldriver` on the instance from which you wish to
-   forward logs.
-
-2. Ensure that the instance has the appropriate permissions to write
-   to Stackdriver. Google continously changes how IAM is implemented
-   on GCP, so you will have to refer to [Google's documentation][].
-
-   By default instances have the required permissions if Stackdriver
-   Logging support is enabled in the project.
-
-3. Start `journaldriver`, for example via `systemd`.
-
-# Usage outside of Google Cloud Platform
-
-When running outside of GCP, the following extra steps need to be
-performed:
-
-1. Create a Google Cloud Platform service account with the "Log
-   Writer" role and download its private key in JSON-format.
-2. When starting `journaldriver`, configure the following environment
-   variables:
-
-   * `GOOGLE_CLOUD_PROJECT`: Name of the GCP project to which logs
-     should be written.
-   * `GOOGLE_APPLICATION_CREDENTIALS`: Filesystem path to the
-     JSON-file containing the service account's private key.
-   * `LOG_STREAM`: Name of the target log stream in Stackdriver Logging.
-     This will be automatically created if it does not yet exist.
-   * `LOG_NAME`: Name of the target log to write to. This defaults to
-     `journaldriver` if unset, but it is recommended to - for
-     example - set it to the machine hostname.
-
-# Log levels / severities / priorities
-
-`journaldriver` recognises [journald's priorities][] and converts them
-into [equivalent severities][] in Stackdriver. Both sets of values
-correspond to standard `syslog` priorities.
-
-The easiest way to emit log messages with priorites from an
-application is to use [priority prefixes][], which are compatible with
-structured log messages.
-
-For example, to emit a simple warning message (structured and
-unstructured):
-
-```
-$ echo '<4>{"fnord":true, "msg":"structured log (warning)"}' | systemd-cat
-$ echo '<4>unstructured log (warning)' | systemd-cat
-```
-
-# NixOS module
-
-The NixOS package repository [contains a module][] for setting up
-`journaldriver` on NixOS machines. NixOS by default uses `systemd` for
-service management and `journald` for logging, which means that log
-output from most services will be captured automatically.
-
-On a GCP instance the only required option is this:
-
-```nix
-services.journaldriver.enable = true;
-```
-
-When running outside of GCP, the configuration looks as follows:
-
-```nix
-services.journaldriver = {
-  enable                 = true;
-  logStream              = "prod-environment";
-  logName                = "hostname";
-  googleCloudProject     = "gcp-project-name";
-  applicationCredentials = keyFile;
-};
-```
-
-**Note**: The `journaldriver`-module is included in stable releases of
-NixOS since NixOS 18.09.
-
-# Stackdriver Error Reporting
-
-The [Stackdriver Error Reporting][] service of Google's monitoring
-toolbox supports automatically detecting and correlating errors from
-log entries.
-
-To use this functionality log messages must be logged in the expected
-[log format][].
-
-*Note*: Reporting errors from non-GCP instances requires that the
-`LOG_STREAM` environment variable is set to the special value
-`global`.
-
-This value changes the monitored resource descriptor from a log stream
-to the project-global stream. Due to a limitation in Stackdriver Error
-Reporting, this is the only way to correctly ingest errors from
-non-GCP machines. Please see [issue #4][] for more information about
-this.
-
-[Stackdriver Logging]: https://cloud.google.com/logging/
-[metadata server]: https://cloud.google.com/compute/docs/storing-retrieving-metadata
-[Google's documentation]: https://cloud.google.com/logging/docs/access-control
-[NixOS]: https://nixos.org/
-[contains a module]: https://github.com/NixOS/nixpkgs/pull/42134
-[journald's priorities]: http://0pointer.de/public/systemd-man/sd-daemon.html
-[equivalent severities]: https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#logseverity
-[priority prefixes]: http://0pointer.de/public/systemd-man/sd-daemon.html
-[Stackdriver Error Reporting]: https://cloud.google.com/error-reporting/
-[log format]: https://cloud.google.com/error-reporting/docs/formatting-error-messages
-[issue #4]: https://github.com/tazjin/journaldriver/issues/4
diff --git a/tools/journaldriver/build.rs b/tools/journaldriver/build.rs
deleted file mode 100644
index d64c82a88a..0000000000
--- a/tools/journaldriver/build.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-extern crate pkg_config;
-
-fn main() {
-    pkg_config::probe_library("libsystemd")
-        .expect("Could not probe libsystemd");
-}
diff --git a/tools/journaldriver/default.nix b/tools/journaldriver/default.nix
deleted file mode 100644
index 2df5e58fc8..0000000000
--- a/tools/journaldriver/default.nix
+++ /dev/null
@@ -1,9 +0,0 @@
-{ pkgs, ... }:
-
-pkgs.third_party.naersk.buildPackage {
-  src = ./.;
-
-  buildInputs = with pkgs.third_party; [
-    pkgconfig openssl systemd.dev    
-  ];
-}
diff --git a/tools/journaldriver/src/main.rs b/tools/journaldriver/src/main.rs
deleted file mode 100644
index a57bb3505d..0000000000
--- a/tools/journaldriver/src/main.rs
+++ /dev/null
@@ -1,665 +0,0 @@
-// Copyright (C) 2018 Vincent Ambo <mail@tazj.in>
-//
-// journaldriver is free software: you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation, either version 3 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-//! This file implements journaldriver, a small application that
-//! forwards logs from journald (systemd's log facility) to
-//! Stackdriver Logging.
-//!
-//! Log entries are read continously from journald and are forwarded
-//! to Stackdriver in batches.
-//!
-//! Stackdriver Logging has a concept of monitored resources. In the
-//! simplest case this monitored resource will be the GCE instance on
-//! which journaldriver is running.
-//!
-//! Information about the instance, the project and required security
-//! credentials are retrieved from Google's metadata instance on GCP.
-//!
-//! To run journaldriver on non-GCP machines, users must specify the
-//! `GOOGLE_APPLICATION_CREDENTIALS`, `GOOGLE_CLOUD_PROJECT` and
-//! `LOG_NAME` environment variables.
-
-#[macro_use] extern crate failure;
-#[macro_use] extern crate log;
-#[macro_use] extern crate serde_derive;
-#[macro_use] extern crate serde_json;
-#[macro_use] extern crate lazy_static;
-
-extern crate chrono;
-extern crate env_logger;
-extern crate medallion;
-extern crate serde;
-extern crate systemd;
-extern crate ureq;
-
-use chrono::offset::LocalResult;
-use chrono::prelude::*;
-use failure::ResultExt;
-use serde_json::{from_str, Value};
-use std::env;
-use std::fs::{self, File, rename};
-use std::io::{self, Read, ErrorKind, Write};
-use std::mem;
-use std::path::PathBuf;
-use std::process;
-use std::time::{Duration, Instant};
-use systemd::journal::*;
-
-#[cfg(test)]
-mod tests;
-
-const LOGGING_SERVICE: &str = "https://logging.googleapis.com/google.logging.v2.LoggingServiceV2";
-const ENTRIES_WRITE_URL: &str = "https://logging.googleapis.com/v2/entries:write";
-const METADATA_TOKEN_URL: &str = "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token";
-const METADATA_ID_URL: &str = "http://metadata.google.internal/computeMetadata/v1/instance/id";
-const METADATA_ZONE_URL: &str = "http://metadata.google.internal/computeMetadata/v1/instance/zone";
-const METADATA_PROJECT_URL: &str = "http://metadata.google.internal/computeMetadata/v1/project/project-id";
-
-/// Convenience type alias for results using failure's `Error` type.
-type Result<T> = std::result::Result<T, failure::Error>;
-
-/// Representation of static service account credentials for GCP.
-#[derive(Debug, Deserialize)]
-struct Credentials {
-    /// PEM encoded private key
-    private_key: String,
-
-    /// `kid` of this private key
-    private_key_id: String,
-
-    /// "email" address of the service account
-    client_email: String,
-}
-
-lazy_static! {
-    /// ID of the GCP project to which to send logs.
-    static ref PROJECT_ID: String = get_project_id();
-
-    /// Name of the log to write to (this should only be manually
-    /// configured if not running on GCP):
-    static ref LOG_NAME: String = env::var("LOG_NAME")
-        .unwrap_or("journaldriver".into());
-
-    /// Service account credentials (if configured)
-    static ref SERVICE_ACCOUNT_CREDENTIALS: Option<Credentials> =
-        env::var("GOOGLE_APPLICATION_CREDENTIALS").ok()
-        .and_then(|path| File::open(path).ok())
-        .and_then(|file| serde_json::from_reader(file).ok());
-
-    /// Descriptor of the currently monitored instance. Refer to the
-    /// documentation of `determine_monitored_resource` for more
-    /// information.
-    static ref MONITORED_RESOURCE: Value = determine_monitored_resource();
-
-    /// Path to the directory in which journaldriver should persist
-    /// its cursor state.
-    static ref CURSOR_DIR: PathBuf = env::var("CURSOR_POSITION_DIR")
-        .unwrap_or("/var/lib/journaldriver".into())
-        .into();
-
-    /// Path to the cursor position file itself.
-    static ref CURSOR_FILE: PathBuf = {
-        let mut path = CURSOR_DIR.clone();
-        path.push("cursor.pos");
-        path
-    };
-
-    /// Path to the temporary file used for cursor position writes.
-    static ref CURSOR_TMP_FILE: PathBuf = {
-        let mut path = CURSOR_DIR.clone();
-        path.push("cursor.tmp");
-        path
-    };
-}
-
-/// Convenience helper for retrieving values from the metadata server.
-fn get_metadata(url: &str) -> Result<String> {
-    let response = ureq::get(url)
-        .set("Metadata-Flavor", "Google")
-        .timeout_connect(5000)
-        .timeout_read(5000)
-        .call();
-
-    if response.ok() {
-        // Whitespace is trimmed to remove newlines from responses.
-        let body = response.into_string()
-            .context("Failed to decode metadata response")?
-            .trim().to_string();
-
-        Ok(body)
-    } else {
-        let status = response.status_line().to_string();
-        let body = response.into_string()
-            .unwrap_or_else(|e| format!("Metadata body error: {}", e));
-        bail!("Metadata failure: {} ({})", body, status)
-    }
-}
-
-/// Convenience helper for determining the project ID.
-fn get_project_id() -> String {
-    env::var("GOOGLE_CLOUD_PROJECT")
-        .map_err(Into::into)
-        .or_else(|_: failure::Error| get_metadata(METADATA_PROJECT_URL))
-        .expect("Could not determine project ID")
-}
-
-/// Determines the monitored resource descriptor used in Stackdriver
-/// logs. On GCP this will be set to the instance ID as returned by
-/// the metadata server.
-///
-/// On non-GCP machines the value is determined by using the
-/// `GOOGLE_CLOUD_PROJECT` and `LOG_STREAM` environment variables.
-///
-/// [issue #4]: https://github.com/tazjin/journaldriver/issues/4
-fn determine_monitored_resource() -> Value {
-    if let Ok(log) = env::var("LOG_STREAM") {
-        // The special value `global` is recognised as a log stream name that
-        // results in a `global`-type resource descriptor. This is useful in
-        // cases where Stackdriver Error Reporting is intended to be used on
-        // a non-GCE instance. See [issue #4][] for details.
-        if log == "global" {
-            return json!({
-                "type": "global",
-                "labels": {
-                    "project_id": PROJECT_ID.as_str(),
-                }
-            });
-        }
-
-        json!({
-            "type": "logging_log",
-            "labels": {
-                "project_id": PROJECT_ID.as_str(),
-                "name": log,
-            }
-        })
-    } else {
-        let instance_id = get_metadata(METADATA_ID_URL)
-            .expect("Could not determine instance ID");
-
-        let zone = get_metadata(METADATA_ZONE_URL)
-            .expect("Could not determine instance zone");
-
-        json!({
-            "type": "gce_instance",
-            "labels": {
-                "project_id": PROJECT_ID.as_str(),
-                "instance_id": instance_id,
-                "zone": zone,
-            }
-        })
-    }
-}
-
-/// Represents the response returned by the metadata server's token
-/// endpoint. The token is normally valid for an hour.
-#[derive(Deserialize)]
-struct TokenResponse {
-    expires_in: u64,
-    access_token: String,
-}
-
-/// Struct used to store a token together with a sensible
-/// representation of when it expires.
-struct Token {
-    token: String,
-    fetched_at: Instant,
-    expires: Duration,
-}
-
-impl Token {
-    /// Does this token need to be renewed?
-    fn is_expired(&self) -> bool {
-        self.fetched_at.elapsed() > self.expires
-    }
-}
-
-/// Retrieves a token from the GCP metadata service. Retrieving these
-/// tokens requires no additional authentication.
-fn get_metadata_token() -> Result<Token> {
-    let body = get_metadata(METADATA_TOKEN_URL)?;
-    let token: TokenResponse = from_str(&body)?;
-
-    debug!("Fetched new token from metadata service");
-
-    Ok(Token {
-        fetched_at: Instant::now(),
-        expires: Duration::from_secs(token.expires_in / 2),
-        token: token.access_token,
-    })
-}
-
-/// Signs a token using static client credentials configured for a
-/// service account. This service account must have been given the
-/// `Log Writer` role in Google Cloud IAM.
-///
-/// The process for creating and signing these tokens is described
-/// here:
-///
-/// https://developers.google.com/identity/protocols/OAuth2ServiceAccount#jwt-auth
-fn sign_service_account_token(credentials: &Credentials) -> Result<Token> {
-    use medallion::{Algorithm, Header, Payload};
-
-    let iat = Utc::now();
-    let exp = iat.checked_add_signed(chrono::Duration::seconds(3600))
-        .ok_or_else(|| format_err!("Failed to calculate token expiry"))?;
-
-    let header = Header {
-        alg: Algorithm::RS256,
-        headers: Some(json!({
-            "kid": credentials.private_key_id,
-        })),
-    };
-
-    let payload: Payload<()> = Payload {
-        iss: Some(credentials.client_email.clone()),
-        sub: Some(credentials.client_email.clone()),
-        aud: Some(LOGGING_SERVICE.to_string()),
-        iat: Some(iat.timestamp() as u64),
-        exp: Some(exp.timestamp() as u64),
-        ..Default::default()
-    };
-
-    let token = medallion::Token::new(header, payload)
-        .sign(credentials.private_key.as_bytes())
-        .context("Signing service account token failed")?;
-
-    debug!("Signed new service account token");
-
-    Ok(Token {
-        token,
-        fetched_at: Instant::now(),
-        expires: Duration::from_secs(3000),
-    })
-}
-
-/// Retrieve the authentication token either by using static client
-/// credentials, or by talking to the metadata server.
-///
-/// Which behaviour is used is controlled by the environment variable
-/// `GOOGLE_APPLICATION_CREDENTIALS`, which should be configured to
-/// point at a JSON private key file if service account authentication
-/// is to be used.
-fn get_token() -> Result<Token> {
-    if let Some(credentials) = SERVICE_ACCOUNT_CREDENTIALS.as_ref() {
-        sign_service_account_token(credentials)
-    } else {
-        get_metadata_token()
-    }
-}
-
-/// This structure represents the different types of payloads
-/// supported by journaldriver.
-///
-/// Currently log entries can either contain plain text messages or
-/// structured payloads in JSON-format.
-#[derive(Debug, Serialize, PartialEq)]
-#[serde(untagged)]
-enum Payload {
-    TextPayload {
-        #[serde(rename = "textPayload")]
-        text_payload: String,
-    },
-    JsonPayload {
-        #[serde(rename = "jsonPayload")]
-        json_payload: Value,
-    },
-}
-
-/// Attempt to parse a log message as JSON and return it as a
-/// structured payload. If parsing fails, return the entry in plain
-/// text format.
-fn message_to_payload(message: Option<String>) -> Payload {
-    match message {
-        None => Payload::TextPayload { text_payload: "empty log entry".into() },
-        Some(text_payload) => {
-            // Attempt to deserialize the text payload as a generic
-            // JSON value.
-            if let Ok(json_payload) = serde_json::from_str::<Value>(&text_payload) {
-                // If JSON-parsing succeeded on the payload, check
-                // whether we parsed an object (Stackdriver does not
-                // expect other types of JSON payload) and return it
-                // in that case.
-                if json_payload.is_object() {
-                    return Payload::JsonPayload { json_payload }
-                }
-            }
-
-            Payload::TextPayload { text_payload }
-        }
-    }
-}
-
-/// Attempt to parse journald's microsecond timestamps into a UTC
-/// timestamp.
-///
-/// Parse errors are dismissed and returned as empty options: There
-/// simply aren't any useful fallback mechanisms other than defaulting
-/// to ingestion time for journaldriver's use-case.
-fn parse_microseconds(input: String) -> Option<DateTime<Utc>> {
-    if input.len() != 16 {
-        return None;
-    }
-
-    let seconds: i64 = (&input[..10]).parse().ok()?;
-    let micros: u32 = (&input[10..]).parse().ok()?;
-
-    match Utc.timestamp_opt(seconds, micros * 1000) {
-        LocalResult::Single(time) => Some(time),
-        _ => None,
-    }
-}
-
-/// Converts a journald log message priority to a
-/// Stackdriver-compatible severity number.
-///
-/// Both Stackdriver and journald specify equivalent
-/// severities/priorities. Conveniently, the names are the same.
-/// Inconveniently, the numbers are not.
-///
-/// For more information on the journald priorities, consult these
-/// man-pages:
-///
-/// * systemd.journal-fields(7) (section 'PRIORITY')
-/// * sd-daemon(3)
-/// * systemd.exec(5) (section 'SyslogLevelPrefix')
-///
-/// Note that priorities can be logged by applications via the prefix
-/// concept described in these man pages, without interfering with
-/// structured JSON-payloads.
-///
-/// For more information on the Stackdriver severity levels, please
-/// consult Google's documentation:
-///
-/// https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity
-///
-/// Any unknown priority values result in no severity being set.
-fn priority_to_severity(priority: String) -> Option<u32> {
-    match priority.as_ref() {
-        "0" => Some(800), // emerg
-        "1" => Some(700), // alert
-        "2" => Some(600), // crit
-        "3" => Some(500), // err
-        "4" => Some(400), // warning
-        "5" => Some(300), // notice
-        "6" => Some(200), // info
-        "7" => Some(100), // debug
-        _ => None,
-    }
-}
-
-/// This structure represents a log entry in the format expected by
-/// the Stackdriver API.
-#[derive(Debug, Serialize)]
-#[serde(rename_all = "camelCase")]
-struct LogEntry {
-    labels: Value,
-
-    #[serde(skip_serializing_if = "Option::is_none")]
-    timestamp: Option<DateTime<Utc>>,
-
-    #[serde(flatten)]
-    payload: Payload,
-
-    // https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity
-    #[serde(skip_serializing_if = "Option::is_none")]
-    severity: Option<u32>,
-}
-
-impl From<JournalRecord> for LogEntry {
-    // Converts from the fields contained in a journald record to the
-    // representation required by Stackdriver Logging.
-    //
-    // The fields are documented in systemd.journal-fields(7).
-    fn from(mut record: JournalRecord) -> LogEntry {
-        // The message field is technically just a convention, but
-        // journald seems to default to it when ingesting unit
-        // output.
-        let payload = message_to_payload(record.remove("MESSAGE"));
-
-        // Presumably this is always set, but who can be sure
-        // about anything in this world.
-        let hostname = record.remove("_HOSTNAME");
-
-        // The unit is seemingly missing on kernel entries, but
-        // present on all others.
-        let unit = record.remove("_SYSTEMD_UNIT");
-
-        // The source timestamp (if present) is specified in
-        // microseconds since epoch.
-        //
-        // If it is not present or can not be parsed, journaldriver
-        // will not send a timestamp for the log entry and it will
-        // default to the ingestion time.
-        let timestamp = record
-            .remove("_SOURCE_REALTIME_TIMESTAMP")
-            .and_then(parse_microseconds);
-
-        // Journald uses syslogd's concept of priority. No idea if this is
-        // always present, but it's optional in the Stackdriver API, so we just
-        // omit it if we can't find or parse it.
-        let severity = record
-            .remove("PRIORITY")
-            .and_then(priority_to_severity);
-
-        LogEntry {
-            payload,
-            timestamp,
-            labels: json!({
-                "host": hostname,
-                "unit": unit.unwrap_or_else(|| "syslog".into()),
-            }),
-            severity,
-        }
-    }
-}
-
-/// Attempt to read from the journal. If no new entry is present,
-/// await the next one up to the specified timeout.
-fn receive_next_record(timeout: Duration, journal: &mut Journal)
-                       -> Result<Option<JournalRecord>> {
-    let next_record = journal.next_record()?;
-    if next_record.is_some() {
-        return Ok(next_record);
-    }
-
-    Ok(journal.await_next_record(Some(timeout))?)
-}
-
-/// This function starts a double-looped, blocking receiver. It will
-/// buffer messages for half a second before flushing them to
-/// Stackdriver.
-fn receiver_loop(mut journal: Journal) -> Result<()> {
-    let mut token = get_token()?;
-
-    let mut buf: Vec<LogEntry> = Vec::new();
-    let iteration = Duration::from_millis(500);
-
-    loop {
-        trace!("Beginning outer iteration");
-        let now = Instant::now();
-
-        loop {
-            if now.elapsed() > iteration {
-                break;
-            }
-
-            if let Ok(Some(entry)) = receive_next_record(iteration, &mut journal) {
-                trace!("Received a new entry");
-                buf.push(entry.into());
-            }
-        }
-
-        if !buf.is_empty() {
-            let to_flush = mem::replace(&mut buf, Vec::new());
-            flush(&mut token, to_flush, journal.cursor()?)?;
-        }
-
-        trace!("Done outer iteration");
-    }
-}
-
-/// Writes the current cursor into `/var/journaldriver/cursor.pos`. To
-/// avoid issues with journaldriver being terminated while the cursor
-/// is still being written, this will first write the cursor into a
-/// temporary file and then move it.
-fn persist_cursor(cursor: String) -> Result<()> {
-    // This code exists to aid in tracking down if there are other
-    // causes of issue #2 than what has already been taken care of.
-    //
-    // One theory is that journald (or the Rust library to interface
-    // with it) may occasionally return empty cursor strings. If this
-    // is ever the case, we would like to know about it.
-    if cursor.is_empty() {
-        error!("Received empty journald cursor position, refusing to persist!");
-        error!("Please report this message at https://github.com/tazjin/journaldriver/issues/2");
-        return Ok(())
-    }
-
-    let mut file = File::create(&*CURSOR_TMP_FILE)
-        .context("Failed to create cursor file")?;
-
-    write!(file, "{}", cursor).context("Failed to write cursor file")?;
-
-    rename(&*CURSOR_TMP_FILE, &*CURSOR_FILE)
-        .context("Failed to move cursor file")
-        .map_err(Into::into)
-}
-
-/// Flushes all drained records to Stackdriver. Any Stackdriver
-/// message can at most contain 1000 log entries which means they are
-/// chunked up here.
-///
-/// In some cases large payloads seem to cause errors in Stackdriver -
-/// the chunks are therefore made smaller here.
-///
-/// If flushing is successful the last cursor position will be
-/// persisted to disk.
-fn flush(token: &mut Token,
-         entries: Vec<LogEntry>,
-         cursor: String) -> Result<()> {
-    if token.is_expired() {
-        debug!("Refreshing Google metadata access token");
-        let new_token = get_token()?;
-        mem::replace(token, new_token);
-    }
-
-    for chunk in entries.chunks(750) {
-        let request = prepare_request(chunk);
-        if let Err(write_error) = write_entries(token, request) {
-            error!("Failed to write {} entries: {}", chunk.len(), write_error)
-        } else {
-            debug!("Wrote {} entries to Stackdriver", chunk.len())
-        }
-    }
-
-    persist_cursor(cursor)
-}
-
-/// Convert a slice of log entries into the format expected by
-/// Stackdriver. This format is documented here:
-///
-/// https://cloud.google.com/logging/docs/reference/v2/rest/v2/entries/write
-fn prepare_request(entries: &[LogEntry]) -> Value {
-    json!({
-        "logName": format!("projects/{}/logs/{}", PROJECT_ID.as_str(), LOG_NAME.as_str()),
-        "resource": &*MONITORED_RESOURCE,
-        "entries": entries,
-        "partialSuccess": true
-    })
-}
-
-/// Perform the log entry insertion in Stackdriver Logging.
-fn write_entries(token: &Token, request: Value) -> Result<()> {
-    let response = ureq::post(ENTRIES_WRITE_URL)
-        .set("Authorization", format!("Bearer {}", token.token).as_str())
-        // The timeout values are set relatively high, not because of
-        // an expectation of Stackdriver being slow but just to
-        // eventually hit an error case in case of network troubles.
-        // Presumably no request in a functioning environment will
-        // ever hit these limits.
-        .timeout_connect(2000)
-        .timeout_read(5000)
-        .send_json(request);
-
-    if response.ok() {
-        Ok(())
-    } else {
-        let status = response.status_line().to_string();
-        let body = response.into_string()
-            .unwrap_or_else(|_| "no response body".into());
-        bail!("Write failure: {} ({})", body, status)
-    }
-}
-
-/// Attempt to read the initial cursor position from the configured
-/// file. If there is no initial cursor position set, read from the
-/// tail of the log.
-///
-/// The only "acceptable" error when reading the cursor position is
-/// the cursor position file not existing, other errors are fatal
-/// because they indicate a misconfiguration of journaldriver.
-fn initial_cursor() -> Result<JournalSeek> {
-    let read_result: io::Result<String> = (|| {
-        let mut contents = String::new();
-        let mut file = File::open(&*CURSOR_FILE)?;
-        file.read_to_string(&mut contents)?;
-        Ok(contents.trim().into())
-    })();
-
-    match read_result {
-        Ok(cursor) => Ok(JournalSeek::Cursor { cursor }),
-        Err(ref err) if err.kind() == ErrorKind::NotFound => {
-            info!("No previous cursor position, reading from journal tail");
-            Ok(JournalSeek::Tail)
-        },
-        Err(err) => {
-            (Err(err).context("Could not read cursor position"))?
-        }
-    }
-}
-
-fn main () {
-    env_logger::init();
-
-    // The directory in which cursor positions are persisted should
-    // have been created:
-    if !CURSOR_DIR.exists() {
-        error!("Cursor directory at '{:?}' does not exist", *CURSOR_DIR);
-        process::exit(1);
-    }
-
-    let cursor_position_dir = CURSOR_FILE.parent()
-        .expect("Invalid cursor position file path");
-
-    fs::create_dir_all(cursor_position_dir)
-        .expect("Could not create directory to store cursor position in");
-
-    let mut journal = Journal::open(JournalFiles::All, false, true)
-        .expect("Failed to open systemd journal");
-
-    let seek_position = initial_cursor()
-        .expect("Failed to determine initial cursor position");
-
-    match journal.seek(seek_position) {
-        Ok(cursor) => info!("Opened journal at cursor '{}'", cursor),
-        Err(err) => {
-            error!("Failed to set initial journal position: {}", err);
-            process::exit(1)
-        }
-    }
-
-    receiver_loop(journal).expect("log receiver encountered an unexpected error");
-}
diff --git a/tools/journaldriver/src/tests.rs b/tools/journaldriver/src/tests.rs
deleted file mode 100644
index 779add7a70..0000000000
--- a/tools/journaldriver/src/tests.rs
+++ /dev/null
@@ -1,95 +0,0 @@
-use super::*;
-use serde_json::to_string;
-
-#[test]
-fn test_text_entry_serialization() {
-    let entry = LogEntry {
-        labels: Value::Null,
-        timestamp: None,
-        payload: Payload::TextPayload {
-            text_payload: "test entry".into(),
-        },
-        severity: None,
-    };
-
-    let expected = "{\"labels\":null,\"textPayload\":\"test entry\"}";
-    let result = to_string(&entry).expect("serialization failed");
-
-    assert_eq!(expected, result, "Plain text payload should serialize correctly")
-}
-
-#[test]
-fn test_json_entry_serialization() {
-    let entry = LogEntry {
-        labels: Value::Null,
-        timestamp: None,
-        payload: Payload::JsonPayload {
-            json_payload: json!({
-                "message": "JSON test"
-            })
-        },
-        severity: None,
-    };
-
-    let expected = "{\"labels\":null,\"jsonPayload\":{\"message\":\"JSON test\"}}";
-    let result = to_string(&entry).expect("serialization failed");
-
-    assert_eq!(expected, result, "JSOn payload should serialize correctly")
-}
-
-#[test]
-fn test_plain_text_payload() {
-    let message = "plain text payload".into();
-    let payload = message_to_payload(Some(message));
-    let expected = Payload::TextPayload {
-        text_payload: "plain text payload".into(),
-    };
-
-    assert_eq!(expected, payload, "Plain text payload should be detected correctly");
-}
-
-#[test]
-fn test_empty_payload() {
-    let payload = message_to_payload(None);
-    let expected = Payload::TextPayload {
-        text_payload: "empty log entry".into(),
-    };
-
-    assert_eq!(expected, payload, "Empty payload should be handled correctly");
-}
-
-#[test]
-fn test_json_payload() {
-    let message = "{\"someKey\":\"someValue\", \"otherKey\": 42}".into();
-    let payload = message_to_payload(Some(message));
-    let expected = Payload::JsonPayload {
-        json_payload: json!({
-            "someKey": "someValue",
-            "otherKey": 42
-        })
-    };
-
-    assert_eq!(expected, payload, "JSON payload should be detected correctly");
-}
-
-#[test]
-fn test_json_no_object() {
-    // This message can be parsed as valid JSON, but it is not an
-    // object - it should be returned as a plain-text payload.
-    let message = "42".into();
-    let payload = message_to_payload(Some(message));
-    let expected = Payload::TextPayload {
-        text_payload: "42".into(),
-    };
-
-    assert_eq!(expected, payload, "Non-object JSON payload should be plain text");
-}
-
-#[test]
-fn test_parse_microseconds() {
-    let input: String = "1529175149291187".into();
-    let expected: DateTime<Utc> = "2018-06-16T18:52:29.291187Z"
-        .to_string().parse().unwrap();
-
-    assert_eq!(Some(expected), parse_microseconds(input));
-}
diff --git a/tools/kms_pass.nix b/tools/kms_pass.nix
deleted file mode 100644
index 14989b392d..0000000000
--- a/tools/kms_pass.nix
+++ /dev/null
@@ -1,60 +0,0 @@
-# This tool mimics a subset of the interface of 'pass', but uses
-# Google Cloud KMS for encryption.
-#
-# It is intended to be compatible with how 'kontemplate' invokes
-# 'pass.'
-#
-# Only the 'show' and 'insert' commands are supported.
-
-{ pkgs, kms, ... }:
-
-let inherit (pkgs.third_party) google-cloud-sdk tree writeShellScriptBin;
-in (writeShellScriptBin "pass" ''
-  set -eo pipefail
-
-  CMD="$1"
-  readonly SECRET=$2
-  readonly SECRET_PATH="$SECRETS_DIR/$SECRET"
-
-  function secret_check {
-    if [[ -z $SECRET ]]; then
-      echo 'Secret must be specified'
-      exit 1
-    fi
-  }
-
-  if [[ -z $CMD ]]; then
-    CMD="ls"
-  fi
-
-  case "$CMD" in
-    ls)
-       ${tree}/bin/tree $SECRETS_DIR
-       ;;
-    show)
-      secret_check
-      ${google-cloud-sdk}/bin/gcloud kms decrypt \
-        --project ${kms.project} \
-        --location ${kms.region} \
-        --keyring ${kms.keyring} \
-        --key ${kms.key} \
-        --ciphertext-file $SECRET_PATH \
-        --plaintext-file -
-      ;;
-    insert)
-      secret_check
-      ${google-cloud-sdk}/bin/gcloud kms encrypt \
-        --project ${kms.project} \
-        --location ${kms.region} \
-        --keyring ${kms.keyring} \
-        --key ${kms.key} \
-        --ciphertext-file $SECRET_PATH \
-        --plaintext-file -
-      echo "Inserted secret '$SECRET'"
-      ;;
-    *)
-      echo "Usage: pass show/insert <secret>"
-      exit 1
-      ;;
-  esac
-'') // { meta.enableCI = true; }