Initial Commit
This commit is contained in:
commit
85e2a8587b
15
.editorconfig
Normal file
15
.editorconfig
Normal file
@ -0,0 +1,15 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = false
|
||||
|
||||
[Makefile]
|
||||
indent_style = tab
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
getidev
|
29
.golangci.yml
Normal file
29
.golangci.yml
Normal file
@ -0,0 +1,29 @@
|
||||
run:
|
||||
skip-dirs:
|
||||
- it
|
||||
timeout: 10m
|
||||
tests: true
|
||||
|
||||
linters:
|
||||
disable-all: true
|
||||
enable:
|
||||
# Default
|
||||
- deadcode
|
||||
- errcheck
|
||||
- gosimple
|
||||
- govet
|
||||
- ineffassign
|
||||
- staticcheck
|
||||
- structcheck
|
||||
- typecheck
|
||||
- unused
|
||||
- varcheck
|
||||
|
||||
# Additionally linters
|
||||
- bodyclose
|
||||
- misspell
|
||||
- nilerr
|
||||
- rowserrcheck
|
||||
- sqlclosecheck
|
||||
- unparam
|
||||
- whitespace
|
32
Dockerfile
Normal file
32
Dockerfile
Normal file
@ -0,0 +1,32 @@
|
||||
ARG BASE_IMAGE
|
||||
ARG BUILD_IMAGE
|
||||
|
||||
# BUILD
|
||||
# =====================================================================
|
||||
FROM ${BUILD_IMAGE} AS build
|
||||
|
||||
ARG GONOPROXY
|
||||
ARG GONOSUMDB
|
||||
ARG GOPRIVATE
|
||||
ARG GOPROXY
|
||||
ARG GOSUMDB
|
||||
ARG VERSION
|
||||
|
||||
COPY ./ /workspace
|
||||
|
||||
RUN cd /workspace && \
|
||||
GONOPROXY=${GONOPROXY} \
|
||||
GONOSUMDB=${GONOSUMDB} \
|
||||
GOPRIVATE=${GOPRIVATE} \
|
||||
GOPROXY=${GOPROXY} \
|
||||
GOSUMDB=${GOSUMDB} \
|
||||
VERSION=${VERSION} \
|
||||
make all
|
||||
|
||||
# TARGET
|
||||
# =====================================================================
|
||||
FROM ${BASE_IMAGE}
|
||||
|
||||
COPY --from=build /workspace/getidev /usr/bin/getidev
|
||||
|
||||
ENTRYPOINT [ "/usr/bin/getidev" ]
|
13
LICENSE
Normal file
13
LICENSE
Normal file
@ -0,0 +1,13 @@
|
||||
Copyright 2019 Markus Pesch
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
126
Makefile
Normal file
126
Makefile
Normal file
@ -0,0 +1,126 @@
|
||||
# VERSION
|
||||
VERSION?=$(shell git describe --abbrev=0)+hash.$(shell git rev-parse --short HEAD)
|
||||
|
||||
# CONTAINER_RUNTIME
|
||||
CONTAINER_RUNTIME?=$(shell which docker)
|
||||
|
||||
# BUILD_IMAGE
|
||||
BUILD_IMAGE_REGISTRY_HOST?=docker.io
|
||||
BUILD_IMAGE_NAMESPACE=library
|
||||
BUILD_IMAGE_REPOSITORY=golang
|
||||
BUILD_IMAGE_VERSION?=1.16
|
||||
BUILD_IMAGE_FULLY_QUALIFIED:=${BUILD_IMAGE_REGISTRY_HOST}/${BUILD_IMAGE_NAMESPACE}/${BUILD_IMAGE_REPOSITORY}:${BUILD_IMAGE_VERSION}
|
||||
|
||||
# BASE_IMAGE
|
||||
BASE_IMAGE_REGISTRY_HOST?=docker.io
|
||||
BASE_IMAGE_NAMESPACE=library
|
||||
BASE_IMAGE_REPOSITORY=busybox
|
||||
BASE_IMAGE_VERSION?=latest
|
||||
BASE_IMAGE_FULLY_QUALIFIED=${BASE_IMAGE_REGISTRY_HOST}/${BASE_IMAGE_NAMESPACE}/${BASE_IMAGE_REPOSITORY}:${BASE_IMAGE_VERSION}
|
||||
|
||||
# CONTAINER_IMAGE
|
||||
CONTAINER_IMAGE_REGISTRY_HOST?=docker.io
|
||||
CONTAINER_IMAGE_NAMESPACE=volkerraschek
|
||||
CONTAINER_IMAGE_REPOSITORY=getidev
|
||||
CONTAINER_IMAGE_VERSION?=latest
|
||||
CONTAINER_IMAGE_FULLY_QUALIFIED=${CONTAINER_IMAGE_REGISTRY_HOST}/${CONTAINER_IMAGE_NAMESPACE}/${CONTAINER_IMAGE_REPOSITORY}:${CONTAINER_IMAGE_VERSION}
|
||||
CONTAINER_IMAGE_UNQUALIFIED=${CONTAINER_IMAGE_NAMESPACE}/${CONTAINER_IMAGE_REPOSITORY}:${CONTAINER_IMAGE_VERSION}
|
||||
|
||||
# EXECUTABLES
|
||||
# ==============================================================================
|
||||
EXECUTABLE_TARGETS=getidev
|
||||
|
||||
PHONY=all
|
||||
all: clean ${EXECUTABLE_TARGETS}
|
||||
|
||||
getidev:
|
||||
GOPRIVATE=$(shell go env GOPRIVATE) \
|
||||
GOPROXY=$(shell go env GOPROXY) \
|
||||
GONOPROXY=$(shell go env GONOPROXY) \
|
||||
GONOSUMDB=$(shell go env GONOSUMDB) \
|
||||
GOSUMDB=$(shell go env GOSUMDB) \
|
||||
go build -tags netgo -ldflags "-X main.version=${VERSION}" -o ${@} main.go
|
||||
|
||||
# CLEAN
|
||||
# ==============================================================================
|
||||
PHONY+=clean
|
||||
clean:
|
||||
rm --force --recursive $(shell pwd)/getidev*
|
||||
|
||||
# GOLANGCI-LINT
|
||||
# ==============================================================================
|
||||
PHONY+=golangci-lint
|
||||
golangci-lint:
|
||||
golangci-lint run --concurrency=$(shell nproc)
|
||||
|
||||
# GOSEC
|
||||
# ==============================================================================
|
||||
PHONY+=gosec
|
||||
gosec:
|
||||
gosec $(shell pwd)/...
|
||||
|
||||
# CONTAINER-IMAGE
|
||||
# ==============================================================================
|
||||
PHONY+=container-image/build
|
||||
container-image/build:
|
||||
${CONTAINER_RUNTIME} build \
|
||||
--build-arg BASE_IMAGE=${BASE_IMAGE_FULLY_QUALIFIED} \
|
||||
--build-arg BUILD_IMAGE=${BUILD_IMAGE_FULLY_QUALIFIED} \
|
||||
--build-arg GOPRIVATE=$(shell go env GOPRIVATE) \
|
||||
--build-arg GOPROXY=$(shell go env GOPROXY) \
|
||||
--build-arg GONOPROXY=$(shell go env GONOPROXY) \
|
||||
--build-arg GONOSUMDB=$(shell go env GONOSUMDB) \
|
||||
--build-arg GOSUMDB=$(shell go env GOSUMDB) \
|
||||
--build-arg VERSION=${VERSION} \
|
||||
--file ./Dockerfile \
|
||||
--no-cache \
|
||||
--tag ${CONTAINER_IMAGE_UNQUALIFIED} \
|
||||
--tag ${CONTAINER_IMAGE_FULLY_QUALIFIED} \
|
||||
.
|
||||
|
||||
PHONY+=container-image/push
|
||||
container-image/push: container-image/build
|
||||
${CONTAINER_RUNTIME} push ${CONTAINER_IMAGE_FULLY_QUALIFIED}
|
||||
|
||||
# CONTAINER STEPS - EXECUTABLE
|
||||
# ==============================================================================
|
||||
PHONY+=container-run/all
|
||||
container-run/all:
|
||||
$(MAKE) container-run COMMAND=${@:container-run/%=%}
|
||||
|
||||
PHONY+=${EXECUTABLE_TARGETS:%=container-run/%}
|
||||
${EXECUTABLE_TARGETS:%=container-run/%}:
|
||||
$(MAKE) container-run COMMAND=${@:container-run/%=%}
|
||||
|
||||
# CONTAINER STEPS - CLEAN
|
||||
# ==============================================================================
|
||||
PHONY+=container-run/clean
|
||||
container-run/clean:
|
||||
$(MAKE) container-run COMMAND=${@:container-run/%=%}
|
||||
|
||||
# GENERAL CONTAINER COMMAND
|
||||
# ==============================================================================
|
||||
PHONY+=container-run
|
||||
container-run:
|
||||
${CONTAINER_RUNTIME} run \
|
||||
--env CONTAINER_IMAGE_VERSION=${CONTAINER_IMAGE_VERSION} \
|
||||
--env GONOPROXY=$(shell go env GONOPROXY) \
|
||||
--env GONOSUMDB=$(shell go env GONOSUMDB) \
|
||||
--env GOPRIVATE=$(shell go env GOPRIVATE) \
|
||||
--env GOPROXY=$(shell go env GOPROXY) \
|
||||
--env GOSUMDB=$(shell go env GOSUMDB) \
|
||||
--env VERSION=${VERSION} \
|
||||
--net=host \
|
||||
--rm \
|
||||
--volume /tmp:/tmp \
|
||||
--volume ${HOME}/go:/root/go \
|
||||
--volume $(shell pwd):/workspace \
|
||||
--workdir /workspace \
|
||||
${BUILD_IMAGE_FULLY_QUALIFIED} \
|
||||
make ${COMMAND}
|
||||
|
||||
# PHONY
|
||||
# ==============================================================================
|
||||
# Declare the contents of the PHONY variable as phony. We keep that information
|
||||
# in a variable so we can use it in if_changed.
|
||||
.PHONY: ${PHONY}
|
8
README.md
Normal file
8
README.md
Normal file
@ -0,0 +1,8 @@
|
||||
# getidev
|
||||
|
||||
`getidev` is a small programme to determine the network interface for an IP
|
||||
address.
|
||||
|
||||
`getidev` serves as an alternative to `ip route get <ip> | awk ...` because `ip
|
||||
route get` can return different output depending on the environment and
|
||||
therefore the construct is unsafe.
|
44
main.go
Normal file
44
main.go
Normal file
@ -0,0 +1,44 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var version string
|
||||
|
||||
func main() {
|
||||
ips := os.Args[1:]
|
||||
switch {
|
||||
case len(ips) == 0:
|
||||
log.Fatal("Expect at least one argument")
|
||||
case len(ips) >= 2:
|
||||
log.Fatal("Expect only one argument")
|
||||
}
|
||||
|
||||
ip := strings.Split(ips[0], "/")[0]
|
||||
|
||||
interfaces, err := net.Interfaces()
|
||||
if err != nil {
|
||||
log.Fatal(err.Error())
|
||||
}
|
||||
|
||||
for _, iface := range interfaces {
|
||||
addrs, err := iface.Addrs()
|
||||
if err != nil {
|
||||
log.Fatal(err.Error())
|
||||
}
|
||||
|
||||
for _, addr := range addrs {
|
||||
if strings.Split(addr.String(), "/")[0] == ip {
|
||||
fmt.Fprintln(os.Stdout, iface.Name)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
os.Exit(1)
|
||||
}
|
Loading…
Reference in New Issue
Block a user