From f3fc03392a17fdac3d1027236eea79985f7f951d Mon Sep 17 00:00:00 2001 From: Kyle Isom Date: Sat, 22 Apr 2023 01:25:13 -0700 Subject: [PATCH] Initial import. --- BUILD.bazel | 4 +++ WORKSPACE.bazel | 36 +++++++++++++++++++++++++++ cmd/kdhcpd/main.go | 19 ++++++++++++++ gazelle.sh | 14 +++++++++++ go.mod | 3 +++ server/server.go | 62 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 138 insertions(+) create mode 100644 BUILD.bazel create mode 100644 WORKSPACE.bazel create mode 100644 cmd/kdhcpd/main.go create mode 100644 gazelle.sh create mode 100644 go.mod create mode 100644 server/server.go diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 0000000..b369316 --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1,4 @@ +load("@bazel_gazelle//:def.bzl", "gazelle") + +# gazelle:prefix git.wntrmute.dev/kyle/bladerunner +gazelle(name = "gazelle") diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel new file mode 100644 index 0000000..fc54605 --- /dev/null +++ b/WORKSPACE.bazel @@ -0,0 +1,36 @@ +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "io_bazel_rules_go", + sha256 = "6b65cb7917b4d1709f9410ffe00ecf3e160edf674b78c54a894471320862184f", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.39.0/rules_go-v0.39.0.zip", + "https://github.com/bazelbuild/rules_go/releases/download/v0.39.0/rules_go-v0.39.0.zip", + ], +) + +http_archive( + name = "bazel_gazelle", + sha256 = "ecba0f04f96b4960a5b250c8e8eeec42281035970aa8852dda73098274d14a1d", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.29.0/bazel-gazelle-v0.29.0.tar.gz", + "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.29.0/bazel-gazelle-v0.29.0.tar.gz", + ], +) + +load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") +load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies") + +############################################################ +# Define your own dependencies here using go_repository. +# Else, dependencies declared by rules_go/gazelle will be used. +# The first declaration of an external repository "wins". +############################################################ + +load("//:deps.bzl", "go_dependencies") + +# gazelle:repository_macro deps.bzl%go_dependencies +go_dependencies() +go_rules_dependencies() +go_register_toolchains(version = "1.20.3") +gazelle_dependencies() diff --git a/cmd/kdhcpd/main.go b/cmd/kdhcpd/main.go new file mode 100644 index 0000000..35bd285 --- /dev/null +++ b/cmd/kdhcpd/main.go @@ -0,0 +1,19 @@ +package main + +import ( + "flag" + "log" + + "git.wntrmute.dev/kyle/kdhcp/server" +) + +func main() { + cfg := &server.Config{} + flag.StringVar(&cfg.Device, "i", "eth0", "network `interface` to listen on") + flag.Parse() + + _, err := server.NewServer(cfg) + if err != nil { + log.Fatal(err) + } +} diff --git a/gazelle.sh b/gazelle.sh new file mode 100644 index 0000000..1ee87ce --- /dev/null +++ b/gazelle.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +set -euxo pipefail + +BAZEL="bazel" +if [ -z "$(command -v ${BAZEL})" ] +then + BAZEL="bazelisk" +fi + +$BAZEL run //:gazelle +$BAZEL run //:gazelle -- update-repos -from_file=go.mod -to_macro=deps.bzl%go_dependencies +$BAZEL run //:gazelle + diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..65692ca --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.wntrmute.dev/kyle/kdhcp + +go 1.20 diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..2c7246a --- /dev/null +++ b/server/server.go @@ -0,0 +1,62 @@ +package server + +import ( + "errors" + "log" + "net" +) + +// github.com/insomniacslk/dhcp + +type Config struct { + Device string `yaml:"device"` +} + +type Server struct { + addrs []net.IP + l net.Listener +} + +func addrsForDevice(dev string) ([]net.IP, error) { + netInterface, err := net.InterfaceByName(dev) + if err != nil { + return nil, err + } + + var addrs []net.IP + devAddrs, err := netInterface.Addrs() + if err != nil { + return nil, err + } + + for _, addr := range devAddrs { + ip := net.ParseIP(addr.String()) + if ip == nil { + continue // address isn't an IP address + } + + // DHCP should only listen on private addresses. + if !ip.IsPrivate() { + continue + } + + // only support IPv4 for now + if len(ip) != 4 { + continue + } + + addrs = append(addrs, ip) + } + + return addrs, nil +} + +func NewServer(cfg *Config) (*Server, error) { + addrs, err := addrsForDevice(cfg.Device) + if err != nil { + return nil, err + } + + log.Println("server IP list: ", addrs) + return nil, errors.New("not implemented") +}