metropolis/cli/metroctl: implement install ssh

This implements another way of installing metropolis via ssh. It does
this by uploading the files to the target machine and then doing a kexec
into the install environment. If it fails at any point it will print the
error and reboot.

Change-Id: I1ac6538896709c386b053a84903fa04940c1f012
Reviewed-on: https://review.monogon.dev/c/monogon/+/2079
Tested-by: Jenkins CI
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
diff --git a/metropolis/cli/takeover/BUILD.bazel b/metropolis/cli/takeover/BUILD.bazel
new file mode 100644
index 0000000..b3af473
--- /dev/null
+++ b/metropolis/cli/takeover/BUILD.bazel
@@ -0,0 +1,64 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
+load("//build/static_binary_tarball:def.bzl", "static_binary_tarball")
+load("//osbase/build:def.bzl", "node_initramfs")
+load("//osbase/build:def.bzl", "platform_transition_binary")
+
+node_initramfs(
+    name = "initramfs",
+    files = {},
+    fsspecs = [
+        "//osbase/build:earlydev.fsspec",
+        "//third_party:firmware",
+    ],
+    visibility = ["//metropolis/cli/takeover:__subpackages__"],
+)
+
+go_library(
+    name = "takeover_lib",
+    srcs = [
+        "boot.go",
+        "install.go",
+        "main.go",
+        "takeover.go",
+    ],
+    embedsrcs = [
+        "//third_party/linux",  #keep
+        "//third_party:ucode",  #keep
+        ":initramfs",  #keep
+        "//metropolis/node/core/abloader",  #keep
+    ],
+    importpath = "source.monogon.dev/metropolis/cli/takeover",
+    visibility = ["//visibility:private"],
+    deps = [
+        "//go/logging",
+        "//metropolis/node/core/devmgr",
+        "//metropolis/proto/api",
+        "//osbase/blockdev",
+        "//osbase/bootparam",
+        "//osbase/bringup",
+        "//osbase/build/mkimage/osimage",
+        "//osbase/efivarfs",
+        "//osbase/kexec",
+        "//osbase/net/dump",
+        "//osbase/net/proto",
+        "//osbase/supervisor",
+        "@com_github_cavaliergopher_cpio//:cpio",
+        "@com_github_klauspost_compress//zstd",
+        "@org_golang_google_protobuf//proto",
+        "@org_golang_x_sys//unix",
+    ],
+)
+
+go_binary(
+    name = "takeover_bin",
+    embed = [":takeover_lib"],
+    pure = "on",
+    visibility = ["//visibility:public"],
+)
+
+platform_transition_binary(
+    name = "takeover",
+    binary = ":takeover_bin",
+    target_platform = "//build/platforms:linux_amd64_static",
+    visibility = ["//visibility:public"],
+)