diff --git a/alpine/base/alpine-build-go/Dockerfile b/alpine/base/alpine-build-go/Dockerfile index 18f035dc9..3c67bdf18 100644 --- a/alpine/base/alpine-build-go/Dockerfile +++ b/alpine/base/alpine-build-go/Dockerfile @@ -1,2 +1,8 @@ FROM golang:1.7-alpine RUN apk update && apk add --no-cache build-base git + +# Get linting tools +RUN go get -u github.com/golang/lint/golint + +# Get the linting script and place in PATH +COPY lint.sh /usr/bin/lint.sh \ No newline at end of file diff --git a/alpine/base/alpine-build-go/Makefile b/alpine/base/alpine-build-go/Makefile index 20903cfe0..045f18eee 100644 --- a/alpine/base/alpine-build-go/Makefile +++ b/alpine/base/alpine-build-go/Makefile @@ -7,8 +7,8 @@ default: push hash: DOCKER_CONTENT_TRUST=1 docker pull $(BASE) - tar cf - Dockerfile | docker build --no-cache -t $(IMAGE):build - - docker run --rm $(IMAGE):build sh -c 'cat /usr/local/go/bin/go /lib/apk/db/installed | sha1sum' | sed 's/ .*//' > hash + tar cf - Dockerfile lint.sh | docker build --no-cache -t $(IMAGE):build - + docker run --rm $(IMAGE):build sh -c 'cat /usr/local/go/bin/go /lib/apk/db/installed /usr/bin/lint.sh /go/bin/golint | sha1sum' | sed 's/ .*//' > hash push: hash docker pull mobylinux/$(IMAGE):$(shell cat hash) || \ diff --git a/alpine/base/alpine-build-go/lint.sh b/alpine/base/alpine-build-go/lint.sh new file mode 100755 index 000000000..669a41496 --- /dev/null +++ b/alpine/base/alpine-build-go/lint.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +set -e + +cd $1 + +>&2 echo "gofmt..." +test -z $(gofmt -s -l .| grep -v .pb. | grep -v */vendor/ | tee /dev/stderr) + +>&2 echo "govet..." +test -z $(go tool vet -printf=false . 2>&1 | grep -v */vendor/ | tee /dev/stderr) + +>&2 echo "golint..." +test -z $(find . -type f -name "*.go" -not -path "*/vendor/*" -not -name "*.pb.*" -exec golint {} \; | tee /dev/stderr) + +>&2 echo "Successful lint check!" \ No newline at end of file diff --git a/alpine/containers/binfmt/Dockerfile b/alpine/containers/binfmt/Dockerfile index 6772862c7..bafb03400 100644 --- a/alpine/containers/binfmt/Dockerfile +++ b/alpine/containers/binfmt/Dockerfile @@ -1,5 +1,5 @@ -# Tag: 1ae7bf8ec49a6537a93fba0c90720c65fa1c6ece -FROM mobylinux/alpine-build-go@sha256:5e9aed92363c25349c2845b9be4a5285e0f56376b8b3ce92c7361bb59e6eeb2d +# Tag: d3f266a146a79f35d3bebf252cce62eee25fcfa9 +FROM mobylinux/alpine-build-go@sha256:1eca9f912cfa4f59ad817acad76744516b999395c080bc01a50b3a2b3a9a3f5c COPY *.go /go/src/binfmt/ diff --git a/alpine/packages/diagnostics/Dockerfile b/alpine/packages/diagnostics/Dockerfile index 78df3e1db..6bef27ffd 100644 --- a/alpine/packages/diagnostics/Dockerfile +++ b/alpine/packages/diagnostics/Dockerfile @@ -1,10 +1,12 @@ -# Tag: 1ae7bf8ec49a6537a93fba0c90720c65fa1c6ece -FROM mobylinux/alpine-build-go@sha256:5e9aed92363c25349c2845b9be4a5285e0f56376b8b3ce92c7361bb59e6eeb2d +# Tag: d3f266a146a79f35d3bebf252cce62eee25fcfa9 +FROM mobylinux/alpine-build-go@sha256:1eca9f912cfa4f59ad817acad76744516b999395c080bc01a50b3a2b3a9a3f5c COPY ./ /go/src/diagnostics-server/ WORKDIR /go/src/diagnostics-server +RUN lint.sh . + RUN go install --ldflags '-extldflags "-fno-PIC"' CMD ["tar", "cf", "-", "-C", "/go/bin", "diagnostics-server"] diff --git a/alpine/packages/diagnostics/capture.go b/alpine/packages/diagnostics/capture.go index d8259df30..9e0cf668c 100644 --- a/alpine/packages/diagnostics/capture.go +++ b/alpine/packages/diagnostics/capture.go @@ -82,12 +82,15 @@ type Capturer interface { Capture(context.Context, *tar.Writer) } +// CommandCapturer describes commands with its arguments and timeout to +// capture diagnostic information from type CommandCapturer struct { command string args []string timeout time.Duration } +// Capture writes output from a CommandCapturer to a tar archive func (cc CommandCapturer) Capture(parentCtx context.Context, w *tar.Writer) { stdout := &bytes.Buffer{} stderr := &bytes.Buffer{} @@ -148,10 +151,14 @@ func runCmd(cmd *exec.Cmd, done chan<- struct{}) { done <- struct{}{} } +// DatabaseCapturer defines behavior for capturing diagnostic +// information from dumping a database type DatabaseCapturer struct { *CommandCapturer } +// NewDatabaseCapturer creates a new DatabaseCapturer that cats +// the database's contents to a CommandCapturer func NewDatabaseCapturer() DatabaseCapturer { return DatabaseCapturer{ &CommandCapturer{ @@ -161,6 +168,7 @@ func NewDatabaseCapturer() DatabaseCapturer { } } +// Capture writes output from a DatabaseCapturer to a tar archive func (dc DatabaseCapturer) Capture(parentCtx context.Context, w *tar.Writer) { // Dump the database dbBase := "/Database/branch/master/ro" diff --git a/alpine/packages/diagnostics/http.go b/alpine/packages/diagnostics/http.go index f3cdbc0e1..d86668654 100644 --- a/alpine/packages/diagnostics/http.go +++ b/alpine/packages/diagnostics/http.go @@ -36,6 +36,7 @@ func init() { // for cloud editions. type HTTPDiagnosticListener struct{} +// Listen starts the HTTPDiagnosticListener and sets up handlers for its endpoints func (h HTTPDiagnosticListener) Listen() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if _, err := os.Stat(dockerSock); os.IsNotExist(err) { @@ -140,10 +141,8 @@ func (h HTTPDiagnosticListener) Listen() { } log.Println(string(body)) return - } else { - log.Println("No error sending S3 request") } - + log.Println("No error sending S3 request") log.Println("Diagnostics request finished") }() }) diff --git a/alpine/packages/diagnostics/hvsock.go b/alpine/packages/diagnostics/hvsock.go index e9fb9bbc5..2122fda16 100644 --- a/alpine/packages/diagnostics/hvsock.go +++ b/alpine/packages/diagnostics/hvsock.go @@ -7,8 +7,10 @@ import ( "github.com/rneugeba/virtsock/go/hvsock" ) +// HVSockDiagnosticListener is a diagnostic server using HVSock (Windows) type HVSockDiagnosticListener struct{} +// Listen sets up the diagnostic server to listen on an HVSock func (l HVSockDiagnosticListener) Listen() { svcid, _ := hvsock.GuidFromString("445BA2CB-E69B-4912-8B42-D7F494D007EA") hvsock, err := hvsock.Listen(hvsock.HypervAddr{VmId: hvsock.GUID_WILDCARD, ServiceId: svcid}) diff --git a/alpine/packages/diagnostics/main.go b/alpine/packages/diagnostics/main.go index df7e365d7..b184266de 100644 --- a/alpine/packages/diagnostics/main.go +++ b/alpine/packages/diagnostics/main.go @@ -16,6 +16,7 @@ func init() { log.SetFlags(0) } +// DiagnosticListener listens for starting diagnostics capture requests type DiagnosticListener interface { // Listen(), a blocking method intended to be invoked in its own // goroutine, will listen for a diagnostic information request and diff --git a/alpine/packages/diagnostics/rawtcp.go b/alpine/packages/diagnostics/rawtcp.go index bda11200b..26d09cfc4 100644 --- a/alpine/packages/diagnostics/rawtcp.go +++ b/alpine/packages/diagnostics/rawtcp.go @@ -5,8 +5,10 @@ import ( "net" ) +// RawTCPDiagnosticListener is a diagnostic server listening on a TCP port type RawTCPDiagnosticListener struct{} +// Listen for RawTCPDiagnosticListener listens on port 62374 func (l RawTCPDiagnosticListener) Listen() { ip, err := net.Listen("tcp", ":62374") if err != nil { diff --git a/alpine/packages/diagnostics/vsock.go b/alpine/packages/diagnostics/vsock.go index a80308c42..c2969c44d 100644 --- a/alpine/packages/diagnostics/vsock.go +++ b/alpine/packages/diagnostics/vsock.go @@ -7,8 +7,10 @@ import ( "github.com/rneugeba/virtsock/go/vsock" ) +// VSockDiagnosticListener is a diagnostic server listening on VSock type VSockDiagnosticListener struct{} +// Listen for VSockDiagnosticListener listens on a VSock's port 62374 func (l VSockDiagnosticListener) Listen() { vsock, err := vsock.Listen(uint(62374)) if err != nil { diff --git a/alpine/packages/proxy/Dockerfile b/alpine/packages/proxy/Dockerfile index cd3c1fe16..886bc644c 100644 --- a/alpine/packages/proxy/Dockerfile +++ b/alpine/packages/proxy/Dockerfile @@ -1,10 +1,12 @@ -# Tag: 1ae7bf8ec49a6537a93fba0c90720c65fa1c6ece -FROM mobylinux/alpine-build-go@sha256:5e9aed92363c25349c2845b9be4a5285e0f56376b8b3ce92c7361bb59e6eeb2d +# Tag: d3f266a146a79f35d3bebf252cce62eee25fcfa9 +FROM mobylinux/alpine-build-go@sha256:1eca9f912cfa4f59ad817acad76744516b999395c080bc01a50b3a2b3a9a3f5c COPY ./ /go/src/proxy/ WORKDIR /go/src/proxy +RUN lint.sh . + RUN go install --ldflags '-extldflags "-fno-PIC"' CMD ["tar", "cf", "-", "-C", "/go/bin", "proxy"] diff --git a/alpine/packages/proxy/libproxy/proxy.go b/alpine/packages/proxy/libproxy/proxy.go index 9cfb00b25..f9ad5fa03 100644 --- a/alpine/packages/proxy/libproxy/proxy.go +++ b/alpine/packages/proxy/libproxy/proxy.go @@ -1,11 +1,12 @@ -// Package proxy provides a network Proxy interface and implementations for TCP +// Package libproxy provides a network Proxy interface and implementations for TCP // and UDP. package libproxy import ( "fmt" - "github.com/rneugeba/virtsock/go/vsock" "net" + + "github.com/rneugeba/virtsock/go/vsock" ) // Proxy defines the behavior of a proxy. It forwards traffic back and forth diff --git a/alpine/packages/proxy/libproxy/tcp_proxy.go b/alpine/packages/proxy/libproxy/tcp_proxy.go index ed177df92..04e0fa731 100644 --- a/alpine/packages/proxy/libproxy/tcp_proxy.go +++ b/alpine/packages/proxy/libproxy/tcp_proxy.go @@ -6,6 +6,7 @@ import ( "net" ) +// Conn defines a network connection type Conn interface { io.Reader io.Writer @@ -33,6 +34,7 @@ func NewTCPProxy(listener net.Listener, backendAddr *net.TCPAddr) (*TCPProxy, er }, nil } +// HandleTCPConnection forwards the TCP traffic to a specified backend address func HandleTCPConnection(client Conn, backendAddr *net.TCPAddr, quit chan bool) { backend, err := net.DialTCP("tcp", nil, backendAddr) if err != nil { diff --git a/alpine/packages/proxy/libproxy/udp_encapsulation.go b/alpine/packages/proxy/libproxy/udp_encapsulation.go index 244f73169..a34d090ab 100644 --- a/alpine/packages/proxy/libproxy/udp_encapsulation.go +++ b/alpine/packages/proxy/libproxy/udp_encapsulation.go @@ -9,12 +9,14 @@ import ( "sync" ) -type udpListener interface { +// UDPListener defines a listener interface to read, write and close a UDP connection +type UDPListener interface { ReadFromUDP(b []byte) (int, *net.UDPAddr, error) WriteToUDP(b []byte, addr *net.UDPAddr) (int, error) Close() error } +// udpEncapsulator encapsulates a UDP connection and listener type udpEncapsulator struct { conn *net.Conn listener net.Listener @@ -38,6 +40,8 @@ func (u *udpEncapsulator) getConn() (net.Conn, error) { return conn, nil } +// ReadFromUDP reads the bytestream from a udpEncapsulator, returning the +// number of bytes read and the unpacked UDPAddr struct func (u *udpEncapsulator) ReadFromUDP(b []byte) (int, *net.UDPAddr, error) { conn, err := u.getConn() if err != nil { @@ -54,6 +58,8 @@ func (u *udpEncapsulator) ReadFromUDP(b []byte) (int, *net.UDPAddr, error) { return length, &udpAddr, nil } +// WriteToUDP writes a bytestream to a specified UDPAddr, returning the number +// of bytes successfully written func (u *udpEncapsulator) WriteToUDP(b []byte, addr *net.UDPAddr) (int, error) { conn, err := u.getConn() if err != nil { @@ -65,6 +71,7 @@ func (u *udpEncapsulator) WriteToUDP(b []byte, addr *net.UDPAddr) (int, error) { return len(b), datagram.Marshal(conn) } +// Close closes the connection in the udpEncapsulator func (u *udpEncapsulator) Close() error { if u.conn != nil { conn := *u.conn @@ -74,7 +81,8 @@ func (u *udpEncapsulator) Close() error { return nil } -func NewUDPConn(conn net.Conn) udpListener { +// NewUDPConn initializes a new UDP connection +func NewUDPConn(conn net.Conn) UDPListener { var m sync.Mutex var r sync.Mutex var w sync.Mutex @@ -87,7 +95,8 @@ func NewUDPConn(conn net.Conn) udpListener { } } -func NewUDPListener(listener net.Listener) udpListener { +// NewUDPListener initializes a new UDP listener +func NewUDPListener(listener net.Listener) UDPListener { var m sync.Mutex var r sync.Mutex var w sync.Mutex @@ -107,6 +116,7 @@ type udpDatagram struct { Zone string } +// Marshal marshals data from the udpDatagram to the provided connection func (u *udpDatagram) Marshal(conn net.Conn) error { // marshal the variable length header to a temporary buffer var header bytes.Buffer @@ -154,6 +164,7 @@ func (u *udpDatagram) Marshal(conn net.Conn) error { return nil } +// Unmarshal unmarshals data from the connection to the udpDatagram func (u *udpDatagram) Unmarshal(conn net.Conn) (int, error) { var length uint16 // frame length diff --git a/alpine/packages/proxy/libproxy/udp_proxy.go b/alpine/packages/proxy/libproxy/udp_proxy.go index ed3ccba1f..29b722c92 100644 --- a/alpine/packages/proxy/libproxy/udp_proxy.go +++ b/alpine/packages/proxy/libproxy/udp_proxy.go @@ -46,7 +46,7 @@ type connTrackMap map[connTrackKey]*net.UDPConn // interface to handle UDP traffic forwarding between the frontend and backend // addresses. type UDPProxy struct { - listener udpListener + listener UDPListener frontendAddr net.Addr backendAddr *net.UDPAddr connTrackTable connTrackMap @@ -54,7 +54,7 @@ type UDPProxy struct { } // NewUDPProxy creates a new UDPProxy. -func NewUDPProxy(frontendAddr net.Addr, listener udpListener, backendAddr *net.UDPAddr) (*UDPProxy, error) { +func NewUDPProxy(frontendAddr net.Addr, listener UDPListener, backendAddr *net.UDPAddr) (*UDPProxy, error) { return &UDPProxy{ listener: listener, diff --git a/alpine/packages/proxy/many.go b/alpine/packages/proxy/many.go index 30ff0ff4c..1b769277f 100644 --- a/alpine/packages/proxy/many.go +++ b/alpine/packages/proxy/many.go @@ -3,18 +3,19 @@ package main import ( "encoding/binary" "flag" - "github.com/rneugeba/virtsock/go/hvsock" - "github.com/rneugeba/virtsock/go/vsock" "log" "net" "proxy/libproxy" + + "github.com/rneugeba/virtsock/go/hvsock" + "github.com/rneugeba/virtsock/go/vsock" ) // Listen on virtio-vsock and AF_HYPERV for multiplexed connections func manyPorts() { var ( vsockPort = flag.Int("vsockPort", 62373, "virtio-vsock port") - hvGuid = flag.String("hvGuid", "0B95756A-9985-48AD-9470-78E060895BE7", "Hyper-V service GUID") + hvGUID = flag.String("hvGuid", "0B95756A-9985-48AD-9470-78E060895BE7", "Hyper-V service GUID") ) flag.Parse() @@ -26,10 +27,10 @@ func manyPorts() { } else { listeners = append(listeners, vsock) } - svcid, _ := hvsock.GuidFromString(*hvGuid) + svcid, _ := hvsock.GuidFromString(*hvGUID) hvsock, err := hvsock.Listen(hvsock.HypervAddr{VmId: hvsock.GUID_WILDCARD, ServiceId: svcid}) if err != nil { - log.Printf("Failed to bind hvsock guid: %s: %#v", *hvGuid, err) + log.Printf("Failed to bind hvsock guid: %s: %#v", *hvGUID, err) } else { listeners = append(listeners, hvsock) } @@ -83,7 +84,9 @@ func manyPorts() { } const ( + // TCP protocol const TCP = 1 + // UDP protocol const UDP = 2 ) diff --git a/alpine/packages/vsudd/Dockerfile b/alpine/packages/vsudd/Dockerfile index 4503d7793..8f82edc8d 100644 --- a/alpine/packages/vsudd/Dockerfile +++ b/alpine/packages/vsudd/Dockerfile @@ -1,10 +1,12 @@ -# Tag: 1ae7bf8ec49a6537a93fba0c90720c65fa1c6ece -FROM mobylinux/alpine-build-go@sha256:5e9aed92363c25349c2845b9be4a5285e0f56376b8b3ce92c7361bb59e6eeb2d +# Tag: d3f266a146a79f35d3bebf252cce62eee25fcfa9 +FROM mobylinux/alpine-build-go@sha256:1eca9f912cfa4f59ad817acad76744516b999395c080bc01a50b3a2b3a9a3f5c COPY ./ /go/src/vsudd/ WORKDIR /go/src/vsudd +RUN lint.sh . + RUN go install --ldflags '-extldflags "-fno-PIC"' CMD ["tar", "cf", "-", "-C", "/go/bin", "vsudd"] diff --git a/alpine/packages/vsudd/main.go b/alpine/packages/vsudd/main.go index 30b4d9fbf..d1461e94e 100644 --- a/alpine/packages/vsudd/main.go +++ b/alpine/packages/vsudd/main.go @@ -188,7 +188,7 @@ func handleOneIn(connid int, conn vConn, sock string) { var docker *net.UnixConn var err error - docker, err = net.DialUnix("unix", nil, &net.UnixAddr{sock, "unix"}) + docker, err = net.DialUnix("unix", nil, &net.UnixAddr{Name: sock, Net: "unix"}) if err != nil { // If the forwarding program has broken then close and continue diff --git a/alpine/packages/vsudd/vsyslog.go b/alpine/packages/vsudd/vsyslog.go index 55de24ad1..6bc738357 100644 --- a/alpine/packages/vsudd/vsyslog.go +++ b/alpine/packages/vsudd/vsyslog.go @@ -1,8 +1,8 @@ /* - * Functions in this file are used to forward syslog messages to the - * host and must be quite careful about their own logging. In general - * error messages should go via the console log.Logger defined in this - * file. +* Functions in this file are used to forward syslog messages to the +* host and must be quite careful about their own logging. In general +* error messages should go via the console log.Logger defined in this +* file. */ package main @@ -158,7 +158,7 @@ func handleSyslogForward(cfg string) { /* Try and carry on... */ } - l, err := net.ListenUnixgram("unixgram", &net.UnixAddr{usock, "unixgram"}) + l, err := net.ListenUnixgram("unixgram", &net.UnixAddr{Name: usock, Net: "unixgram"}) if err != nil { console.Fatalf("Failed to listen to unixgram:%s: %s", usock, err) } diff --git a/alpine/test/Dockerfile b/alpine/test/Dockerfile index 55adbf556..be99809b3 100644 --- a/alpine/test/Dockerfile +++ b/alpine/test/Dockerfile @@ -1,6 +1,6 @@ # Will do a Go build in future -# Tag: 1ae7bf8ec49a6537a93fba0c90720c65fa1c6ece -FROM mobylinux/alpine-build-go@sha256:5e9aed92363c25349c2845b9be4a5285e0f56376b8b3ce92c7361bb59e6eeb2d +# Tag: d3f266a146a79f35d3bebf252cce62eee25fcfa9 +FROM mobylinux/alpine-build-go@sha256:1eca9f912cfa4f59ad817acad76744516b999395c080bc01a50b3a2b3a9a3f5c COPY test.sh mksh /tmp/bin/ COPY ca-certificates.crt /tmp/etc/ssl/certs/ca-certificates.crt