go/svc: finish porting services to Bazel

The following services were never ported:
 - cmc-proxy
 - arista-proxy
 - m6220-proxy
 - topo

They now build.

Change-Id: I0688bfe43cdff946e6662e21969ef539382c0e86
diff --git a/WORKSPACE b/WORKSPACE
index 0b764bb..aee5f12 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -104,7 +104,6 @@
     downloaded_file_path = "factorio.tar.xz",
 )
 
-
 # Go rules
 
 http_archive(
@@ -219,3 +218,135 @@
     commit = "72a7793efd38728796273861bb27d590cc33d9d4",
     importpath = "github.com/sebastiaanklippert/go-wkhtmltopdf",
 )
+
+go_repository(
+    name = "com_github_ziutek_telnet",
+    commit = "c3b780dc415b28894076b4ec975ea3ea69e3980f",
+    importpath = "github.com/ziutek/telnet",
+)
+
+go_repository(
+    name = "com_github_ybbus_jsonrpc",
+    commit = "94088458a1e880219bd312fc0ccb8548993ebf80",
+    importpath = "github.com/ybbus/jsonrpc",
+)
+
+go_repository(
+    name = "com_github_digitalocean_go_netbox",
+    commit = "29433ec527e78486ea0a5758817ab672d977f90e",
+    importpath = "github.com/digitalocean/go-netbox",
+)
+
+go_repository(
+    name = "com_github_cenkalti_backoff",
+    commit = "4b4cebaf850ec58f1bb1fec5bdebdf8501c2bc3f",
+    importpath = "github.com/cenkalti/backoff",
+)
+
+go_repository(
+    name = "ml_vbom_util",
+    commit = "efcd4e0f97874370259c7d93e12aad57911dea81",
+    importpath = "vbom.ml/util",
+)
+
+go_repository(
+    name = "com_github_go_openapi_strfmt",
+    commit = "6faa644e1cdafc07f7b38eb06c1af5f92128f289",
+    importpath = "github.com/go-openapi/strfmt",
+)
+
+go_repository(
+    name = "com_github_go_openapi_swag",
+    commit = "de649ffb9e02183a414820c5b1b4582f7b009792",
+    importpath = "github.com/go-openapi/swag",
+)
+
+go_repository(
+    name = "com_github_go_openapi_errors",
+    commit = "9b273e805998abc751853b4e1574d66e5df888b4",
+    importpath = "github.com/go-openapi/errors",
+)
+
+go_repository(
+    name = "com_github_go_openapi_runtime",
+    commit = "58872d9a7ca5f28beff9effa19ac4c17d3e42cd3",
+    importpath = "github.com/go-openapi/runtime",
+)
+
+go_repository(
+    name = "com_github_go_openapi_validate",
+    commit = "6405b9095e4c96aabb45856da08a9323d50d9336",
+    importpath = "github.com/go-openapi/validate",
+)
+
+go_repository(
+    name = "com_github_mitchellh_mapstructure",
+    commit = "3536a929edddb9a5b34bd6861dc4a9647cb459fe",
+    importpath = "github.com/mitchellh/mapstructure",
+)
+
+go_repository(
+    name = "org_mongodb_go_mongo_driver",
+    commit = "9ec4480161a76f5267d56fc836b7f6d357fd9209",
+    importpath = "go.mongodb.org/mongo-driver",
+)
+
+go_repository(
+    name = "in_gopkg_yaml_v2",
+    commit = "51d6538a90f86fe93ac480b35f37b2be17fef232",
+    importpath = "gopkg.in/yaml.v2",
+)
+
+go_repository(
+    name = "com_github_asaskevich_govalidator",
+    commit = "f61b66f89f4a311bef65f13e575bcf1a2ffadda6",
+    importpath = "github.com/asaskevich/govalidator",
+)
+
+go_repository(
+    name = "com_github_go_openapi_spec",
+    commit = "bdfd7e07daecc404d77868a88b2364d0aed0ee5a",
+    importpath = "github.com/go-openapi/spec",
+)
+
+go_repository(
+    name = "com_github_mailru_easyjson",
+    commit = "b2ccc519800e761ac8000b95e5d57c80a897ff9e",
+    importpath = "github.com/mailru/easyjson",
+)
+
+go_repository(
+    name = "com_github_go_openapi_analysis",
+    commit = "48f4521ad6c3df9d6192efb04287c4a411e1f806",
+    importpath = "github.com/go-openapi/analysis",
+)
+
+go_repository(
+    name = "com_github_go_openapi_jsonpointer",
+    commit = "a105a905c5e6ad147f08504784917f3e178e0ba5",
+    importpath = "github.com/go-openapi/jsonpointer",
+)
+
+go_repository(
+    name = "com_github_go_openapi_loads",
+    commit = "8548893a17237be4a5b2f74773f23002f4179bbe",
+    importpath = "github.com/go-openapi/loads",
+)
+
+go_repository(
+    name = "com_github_go_openapi_jsonreference",
+    commit = "2903bfd4bfbaf188694f1edf731f2725a8fa344f",
+    importpath = "github.com/go-openapi/jsonreference",
+)
+
+go_repository(
+    name = "com_github_puerkitobio_purell",
+    commit = "44968752391892e1b0d0b821ee79e9a85fa13049",
+    importpath = "github.com/PuerkitoBio/purell",
+)
+
+go_repository(
+    name = "com_github_puerkitobio_urlesc",
+    commit = "de5bf2ad457846296e2031421a34e2568e304e35",
+    importpath = "github.com/PuerkitoBio/urlesc",
+)
diff --git a/go/proto/.gitignore b/go/proto/.gitignore
deleted file mode 100644
index 44edf7f..0000000
--- a/go/proto/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-infra
diff --git a/go/proto/BUILD.bazel b/go/proto/BUILD.bazel
deleted file mode 100644
index d2f24fb..0000000
--- a/go/proto/BUILD.bazel
+++ /dev/null
@@ -1,8 +0,0 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
-
-go_library(
-    name = "go_default_library",
-    srcs = ["generate.go"],
-    importpath = "code.hackerspace.pl/hscloud/go/proto",
-    visibility = ["//visibility:public"],
-)
diff --git a/go/proto/generate.go b/go/proto/generate.go
deleted file mode 100644
index 2f009ca..0000000
--- a/go/proto/generate.go
+++ /dev/null
@@ -1,3 +0,0 @@
-//go:generate protoc -I../../proto ../../proto/infra/control.proto --go_out=plugins=grpc:.
-
-package proto
diff --git a/go/svc/arista-proxy/BUILD.bazel b/go/svc/arista-proxy/BUILD.bazel
index 0d88e08..5699607 100644
--- a/go/svc/arista-proxy/BUILD.bazel
+++ b/go/svc/arista-proxy/BUILD.bazel
@@ -1,19 +1,4 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
-load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
-
-proto_library(
-    name = "proto_proto",
-    srcs = ["arista.proto"],
-    visibility = ["//visibility:public"],
-)
-
-go_proto_library(
-    name = "proto_go_proto",
-    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
-    importpath = "code.hackerspace.pl/hscloud/go/svc/arista-proxy",
-    proto = ":proto_proto",
-    visibility = ["//visibility:public"],
-)
 
 go_library(
     name = "go_default_library",
@@ -21,7 +6,6 @@
         "main.go",
         "service.go",
     ],
-    embed = [":proto_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/go/svc/arista-proxy",
     visibility = ["//visibility:private"],
     deps = [
diff --git a/go/svc/arista-proxy/proto/BUILD.bazel b/go/svc/arista-proxy/proto/BUILD.bazel
index ae4ee9b..af116e3 100644
--- a/go/svc/arista-proxy/proto/BUILD.bazel
+++ b/go/svc/arista-proxy/proto/BUILD.bazel
@@ -1,8 +1,23 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library")
+load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
+
+proto_library(
+    name = "proto_proto",
+    srcs = ["arista.proto"],
+    visibility = ["//visibility:public"],
+)
+
+go_proto_library(
+    name = "proto_go_proto",
+    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
+    importpath = "code.hackerspace.pl/hscloud/go/svc/arista-proxy/proto",
+    proto = ":proto_proto",
+    visibility = ["//visibility:public"],
+)
 
 go_library(
     name = "go_default_library",
-    srcs = ["generate.go"],
+    embed = [":proto_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/go/svc/arista-proxy/proto",
     visibility = ["//visibility:public"],
 )
diff --git a/go/svc/arista-proxy/arista.proto b/go/svc/arista-proxy/proto/arista.proto
similarity index 90%
rename from go/svc/arista-proxy/arista.proto
rename to go/svc/arista-proxy/proto/arista.proto
index d6bf105..d306b43 100644
--- a/go/svc/arista-proxy/arista.proto
+++ b/go/svc/arista-proxy/proto/arista.proto
@@ -1,6 +1,6 @@
 syntax = "proto3";
-
 package proto;
+option go_package = "code.hackerspace.pl/hscloud/go/svc/arista-proxy/proto";
 
 message ShowVersionRequest {
 };
diff --git a/go/svc/arista-proxy/proto/generate.go b/go/svc/arista-proxy/proto/generate.go
deleted file mode 100644
index 92f2720..0000000
--- a/go/svc/arista-proxy/proto/generate.go
+++ /dev/null
@@ -1,3 +0,0 @@
-//go:generate protoc -I.. ../arista.proto --go_out=plugins=grpc:.
-
-package proto
diff --git a/go/svc/cmc-proxy/BUILD.bazel b/go/svc/cmc-proxy/BUILD.bazel
index a142dc9..56f3495 100644
--- a/go/svc/cmc-proxy/BUILD.bazel
+++ b/go/svc/cmc-proxy/BUILD.bazel
@@ -1,19 +1,4 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
-load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
-
-proto_library(
-    name = "proto_proto",
-    srcs = ["proxy.proto"],
-    visibility = ["//visibility:public"],
-)
-
-go_proto_library(
-    name = "proto_go_proto",
-    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
-    importpath = "code.hackerspace.pl/hscloud/go/svc/cmc-proxy",
-    proto = ":proto_proto",
-    visibility = ["//visibility:public"],
-)
 
 go_library(
     name = "go_default_library",
@@ -21,7 +6,6 @@
         "client.go",
         "main.go",
     ],
-    embed = [":proto_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/go/svc/cmc-proxy",
     visibility = ["//visibility:private"],
     deps = [
diff --git a/go/svc/cmc-proxy/proto/BUILD.bazel b/go/svc/cmc-proxy/proto/BUILD.bazel
index e924906..605570c 100644
--- a/go/svc/cmc-proxy/proto/BUILD.bazel
+++ b/go/svc/cmc-proxy/proto/BUILD.bazel
@@ -1,8 +1,23 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library")
+load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
+
+proto_library(
+    name = "proto_proto",
+    srcs = ["proxy.proto"],
+    visibility = ["//visibility:public"],
+)
+
+go_proto_library(
+    name = "proto_go_proto",
+    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
+    importpath = "code.hackerspace.pl/hscloud/go/svc/cmc-proxy/proto",
+    proto = ":proto_proto",
+    visibility = ["//visibility:public"],
+)
 
 go_library(
     name = "go_default_library",
-    srcs = ["generate.go"],
+    embed = [":proto_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/go/svc/cmc-proxy/proto",
     visibility = ["//visibility:public"],
 )
diff --git a/go/svc/cmc-proxy/proto/generate.go b/go/svc/cmc-proxy/proto/generate.go
deleted file mode 100644
index fc6193d..0000000
--- a/go/svc/cmc-proxy/proto/generate.go
+++ /dev/null
@@ -1,3 +0,0 @@
-//go:generate protoc -I.. ../proxy.proto --go_out=plugins=grpc:.
-
-package proto
diff --git a/go/svc/cmc-proxy/proxy.proto b/go/svc/cmc-proxy/proto/proxy.proto
similarity index 76%
rename from go/svc/cmc-proxy/proxy.proto
rename to go/svc/cmc-proxy/proto/proxy.proto
index f34b905..a231693 100644
--- a/go/svc/cmc-proxy/proxy.proto
+++ b/go/svc/cmc-proxy/proto/proxy.proto
@@ -1,6 +1,6 @@
 syntax = "proto3";
-
 package proto;
+option go_package = "code.hackerspace.pl/hscloud/go/svc/cmc-proxy/proto";
 
 message GetKVMDataRequest {
     int64 blade_num = 1;
diff --git a/go/svc/m6220-proxy/BUILD.bazel b/go/svc/m6220-proxy/BUILD.bazel
index ee500a9..90bfb1e 100644
--- a/go/svc/m6220-proxy/BUILD.bazel
+++ b/go/svc/m6220-proxy/BUILD.bazel
@@ -1,19 +1,4 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
-load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
-
-proto_library(
-    name = "proto_proto",
-    srcs = ["proxy.proto"],
-    visibility = ["//visibility:public"],
-)
-
-go_proto_library(
-    name = "proto_go_proto",
-    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
-    importpath = "code.hackerspace.pl/hscloud/go/svc/m6220-proxy",
-    proto = ":proto_proto",
-    visibility = ["//visibility:public"],
-)
 
 go_library(
     name = "go_default_library",
@@ -21,13 +6,12 @@
         "cli.go",
         "main.go",
     ],
-    embed = [":proto_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/go/svc/m6220-proxy",
     visibility = ["//visibility:private"],
     deps = [
         "//go/mirko:go_default_library",
-        "//go/proto/infra:go_default_library",
         "//go/svc/m6220-proxy/proto:go_default_library",
+        "//proto/infra:go_default_library",
         "@com_github_golang_glog//:go_default_library",
         "@com_github_ziutek_telnet//:go_default_library",
         "@org_golang_google_grpc//codes:go_default_library",
diff --git a/go/svc/m6220-proxy/main.go b/go/svc/m6220-proxy/main.go
index 54ce428..a2ca4db 100644
--- a/go/svc/m6220-proxy/main.go
+++ b/go/svc/m6220-proxy/main.go
@@ -14,8 +14,8 @@
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
 
-	ipb "code.hackerspace.pl/hscloud/go/proto/infra"
 	pb "code.hackerspace.pl/hscloud/go/svc/m6220-proxy/proto"
+	ipb "code.hackerspace.pl/hscloud/proto/infra"
 )
 
 var (
diff --git a/go/svc/m6220-proxy/proto/BUILD.bazel b/go/svc/m6220-proxy/proto/BUILD.bazel
index 5fb4fac..8cbed6b 100644
--- a/go/svc/m6220-proxy/proto/BUILD.bazel
+++ b/go/svc/m6220-proxy/proto/BUILD.bazel
@@ -1,8 +1,23 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library")
+load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
+
+proto_library(
+    name = "proto_proto",
+    srcs = ["proxy.proto"],
+    visibility = ["//visibility:public"],
+)
+
+go_proto_library(
+    name = "proto_go_proto",
+    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
+    importpath = "code.hackerspace.pl/hscloud/go/svc/m6220-proxy/proto",
+    proto = ":proto_proto",
+    visibility = ["//visibility:public"],
+)
 
 go_library(
     name = "go_default_library",
-    srcs = ["generate.go"],
+    embed = [":proto_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/go/svc/m6220-proxy/proto",
     visibility = ["//visibility:public"],
 )
diff --git a/go/svc/m6220-proxy/proto/generate.go b/go/svc/m6220-proxy/proto/generate.go
deleted file mode 100644
index fc6193d..0000000
--- a/go/svc/m6220-proxy/proto/generate.go
+++ /dev/null
@@ -1,3 +0,0 @@
-//go:generate protoc -I.. ../proxy.proto --go_out=plugins=grpc:.
-
-package proto
diff --git a/go/svc/m6220-proxy/proxy.proto b/go/svc/m6220-proxy/proto/proxy.proto
similarity index 78%
rename from go/svc/m6220-proxy/proxy.proto
rename to go/svc/m6220-proxy/proto/proxy.proto
index d35a2c3..bc840ad 100644
--- a/go/svc/m6220-proxy/proxy.proto
+++ b/go/svc/m6220-proxy/proto/proxy.proto
@@ -1,5 +1,6 @@
 syntax = "proto3";
 package proto;
+option go_package = "code.hackerspace.pl/hscloud/go/svc/m6220-proxy/proto";
 
 message RunCommandRequest {
     string command = 1;
diff --git a/go/svc/topo/BUILD.bazel b/go/svc/topo/BUILD.bazel
index 5e4abff..93c92a5 100644
--- a/go/svc/topo/BUILD.bazel
+++ b/go/svc/topo/BUILD.bazel
@@ -1,18 +1,4 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
-load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
-
-proto_library(
-    name = "proto_proto",
-    srcs = ["config.proto"],
-    visibility = ["//visibility:public"],
-)
-
-go_proto_library(
-    name = "proto_go_proto",
-    importpath = "code.hackerspace.pl/hscloud/go/svc/topo",
-    proto = ":proto_proto",
-    visibility = ["//visibility:public"],
-)
 
 go_library(
     name = "go_default_library",
@@ -20,19 +6,18 @@
         "main.go",
         "service.go",
     ],
-    embed = [":proto_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/go/svc/topo",
     visibility = ["//visibility:private"],
     deps = [
         "//go/mirko:go_default_library",
-        "//go/proto/infra:go_default_library",
         "//go/statusz:go_default_library",
+        "//go/svc/topo/assets:go_default_library",
         "//go/svc/topo/graph:go_default_library",
         "//go/svc/topo/proto:go_default_library",
         "//go/svc/topo/state:go_default_library",
+        "//proto/infra:go_default_library",
         "@com_github_digitalocean_go_netbox//netbox:go_default_library",
         "@com_github_digitalocean_go_netbox//netbox/client:go_default_library",
-        "@com_github_gobuffalo_packr//:go_default_library",
         "@com_github_golang_glog//:go_default_library",
         "@com_github_golang_protobuf//proto:go_default_library",
         "@ml_vbom_util//sortorder:go_default_library",
diff --git a/go/svc/topo/assets/BUILD b/go/svc/topo/assets/BUILD
new file mode 100644
index 0000000..f8d186b
--- /dev/null
+++ b/go/svc/topo/assets/BUILD
@@ -0,0 +1,17 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+load("@io_bazel_rules_go//extras:embed_data.bzl", "go_embed_data")
+
+go_embed_data(
+    name = "assets",
+    srcs = glob(["*.js"]),
+    package = "assets",
+    flatten = True,
+)
+
+# keep
+go_library(
+    name = "go_default_library",
+    srcs = [":assets"],
+    importpath = "code.hackerspace.pl/hscloud/go/svc/topo/assets",
+    visibility = ["//go/svc/topo:__pkg__"],
+)
diff --git a/go/svc/topo/main.go b/go/svc/topo/main.go
index 4affd57..4efe878 100644
--- a/go/svc/topo/main.go
+++ b/go/svc/topo/main.go
@@ -13,9 +13,8 @@
 	"github.com/golang/glog"
 	"github.com/golang/protobuf/proto"
 
-	pb "code.hackerspace.pl/hscloud/go/svc/topo/proto"
-
 	"code.hackerspace.pl/hscloud/go/svc/topo/graph"
+	pb "code.hackerspace.pl/hscloud/go/svc/topo/proto"
 	"code.hackerspace.pl/hscloud/go/svc/topo/state"
 )
 
diff --git a/go/svc/topo/proto/BUILD.bazel b/go/svc/topo/proto/BUILD.bazel
index 01007dd..b56fa57 100644
--- a/go/svc/topo/proto/BUILD.bazel
+++ b/go/svc/topo/proto/BUILD.bazel
@@ -1,8 +1,22 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library")
+load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
+
+proto_library(
+    name = "proto_proto",
+    srcs = ["topo.proto"],
+    visibility = ["//visibility:public"],
+)
+
+go_proto_library(
+    name = "proto_go_proto",
+    importpath = "code.hackerspace.pl/hscloud/go/svc/topo/proto",
+    proto = ":proto_proto",
+    visibility = ["//visibility:public"],
+)
 
 go_library(
     name = "go_default_library",
-    srcs = ["generate.go"],
+    embed = [":proto_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/go/svc/topo/proto",
     visibility = ["//visibility:public"],
 )
diff --git a/go/svc/topo/proto/generate.go b/go/svc/topo/proto/generate.go
deleted file mode 100644
index f760a61..0000000
--- a/go/svc/topo/proto/generate.go
+++ /dev/null
@@ -1,3 +0,0 @@
-//go:generate protoc -I.. ../config.proto --go_out=plugins=grpc:.
-
-package proto
diff --git a/go/svc/topo/config.proto b/go/svc/topo/proto/topo.proto
similarity index 87%
rename from go/svc/topo/config.proto
rename to go/svc/topo/proto/topo.proto
index 33aadbe..3f6e404 100644
--- a/go/svc/topo/config.proto
+++ b/go/svc/topo/proto/topo.proto
@@ -1,6 +1,7 @@
 syntax = "proto3";
 
-package proto;
+package topo;
+option go_package = "code.hackerspace.pl/hscloud/go/svc/topo/proto";
 
 message Config {
     repeated Switch switch = 1;
diff --git a/go/svc/topo/service.go b/go/svc/topo/service.go
index 571eb97..fbbee92 100644
--- a/go/svc/topo/service.go
+++ b/go/svc/topo/service.go
@@ -7,13 +7,15 @@
 	"sort"
 	"strings"
 
+	"vbom.ml/util/sortorder"
+
 	"code.hackerspace.pl/hscloud/go/mirko"
-	ipb "code.hackerspace.pl/hscloud/go/proto/infra"
 	"code.hackerspace.pl/hscloud/go/statusz"
+	ipb "code.hackerspace.pl/hscloud/proto/infra"
+
+	"code.hackerspace.pl/hscloud/go/svc/topo/assets"
 	"code.hackerspace.pl/hscloud/go/svc/topo/graph"
 	"code.hackerspace.pl/hscloud/go/svc/topo/state"
-	"github.com/gobuffalo/packr"
-	"vbom.ml/util/sortorder"
 )
 
 type Service struct {
@@ -103,8 +105,19 @@
 `
 
 func (s *Service) Setup(m *mirko.Mirko) {
-	assets := packr.NewBox("./assets")
-	m.HTTPMux().Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(assets)))
+	m.HTTPMux().Handle("/assets/", http.StripPrefix("/assets/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		data, ok := assets.Data[r.RequestURI]
+		if !ok {
+			http.NotFound(w, r)
+			return
+		}
+
+		if strings.HasSuffix(r.RequestURI, ".js") {
+			w.Header().Set("Content-Type", "text/javascript")
+		}
+
+		w.Write(data)
+	})))
 	m.HTTPMux().HandleFunc("/debug/graphviz", s.httpHandleGraphviz)
 	statusz.AddStatusPart("Switch Ports", switchportsFragment, s.statusHandleSwitchports)
 	statusz.AddStatusPart("Topology", topologyFragment, func(ctx context.Context) interface{} {
diff --git a/go/svc/topo/state/BUILD.bazel b/go/svc/topo/state/BUILD.bazel
index 81985d2..680e087 100644
--- a/go/svc/topo/state/BUILD.bazel
+++ b/go/svc/topo/state/BUILD.bazel
@@ -7,8 +7,8 @@
     visibility = ["//visibility:public"],
     deps = [
         "//go/pki:go_default_library",
-        "//go/proto/infra:go_default_library",
         "//go/svc/topo/proto:go_default_library",
+        "//proto/infra:go_default_library",
         "@org_golang_google_grpc//:go_default_library",
     ],
 )
diff --git a/go/svc/topo/state/state.go b/go/svc/topo/state/state.go
index 232f9b0..08403e7 100644
--- a/go/svc/topo/state/state.go
+++ b/go/svc/topo/state/state.go
@@ -7,10 +7,10 @@
 
 	"google.golang.org/grpc"
 
-	ipb "code.hackerspace.pl/hscloud/go/proto/infra"
-	pb "code.hackerspace.pl/hscloud/go/svc/topo/proto"
-
 	"code.hackerspace.pl/hscloud/go/pki"
+	ipb "code.hackerspace.pl/hscloud/proto/infra"
+
+	pb "code.hackerspace.pl/hscloud/go/svc/topo/proto"
 )
 
 type SwitchportState struct {