Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c1f06604e3 | |||
| 9091cc7682 | |||
| 74ce7bc58a | |||
| 8b2d10209e | |||
| 770100b688 | |||
| 29630c55a9 | |||
| 3c2ec896f8 | |||
| 7828726ba4 |
11
WORKSPACE
11
WORKSPACE
@@ -30,14 +30,3 @@ go_rules_dependencies()
|
|||||||
go_register_toolchains(version = "1.20.4")
|
go_register_toolchains(version = "1.20.4")
|
||||||
gazelle_dependencies()
|
gazelle_dependencies()
|
||||||
|
|
||||||
### Packaging rules
|
|
||||||
http_archive(
|
|
||||||
name = "rules_pkg",
|
|
||||||
urls = [
|
|
||||||
"https://mirror.bazel.build/github.com/bazelbuild/rules_pkg/releases/download/0.9.1/rules_pkg-0.9.1.tar.gz",
|
|
||||||
"https://github.com/bazelbuild/rules_pkg/releases/download/0.9.1/rules_pkg-0.9.1.tar.gz",
|
|
||||||
],
|
|
||||||
sha256 = "8f9ee2dc10c1ae514ee599a8b42ed99fa262b757058f65ad3c384289ff70c4b8",
|
|
||||||
)
|
|
||||||
load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies")
|
|
||||||
rules_pkg_dependencies()
|
|
||||||
|
|||||||
@@ -45,13 +45,6 @@ func sha512Slicer(bs []byte) []byte {
|
|||||||
return sum[:]
|
return sum[:]
|
||||||
}
|
}
|
||||||
|
|
||||||
var sliceFunctions = map[string]func([]byte) []byte{
|
|
||||||
"sha224": sha224Slicer,
|
|
||||||
"sha256": sha256Slicer,
|
|
||||||
"sha384": sha384Slicer,
|
|
||||||
"sha512": sha512Slicer,
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hash represents a generic hash function that may or may not be secure. It
|
// Hash represents a generic hash function that may or may not be secure. It
|
||||||
// satisfies the hash.Hash interface.
|
// satisfies the hash.Hash interface.
|
||||||
type Hash struct {
|
type Hash struct {
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ func NoError(err error, s ...string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if nil != err {
|
if nil != err {
|
||||||
die(err.Error())
|
die(err.Error(), s...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,5 +170,5 @@ func ErrorEqT(t *testing.T, expected, actual error) {
|
|||||||
should = fmt.Sprintf("have '%s'", actual)
|
should = fmt.Sprintf("have '%s'", actual)
|
||||||
}
|
}
|
||||||
|
|
||||||
die(fmt.Sprintf("assert.Error2: expected '%s', but %s", expected, should))
|
t.Fatalf("assert.Error2: expected '%s', but %s", expected, should)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/cloudflare/cfssl/helpers"
|
|
||||||
"git.wntrmute.dev/kyle/goutils/die"
|
"git.wntrmute.dev/kyle/goutils/die"
|
||||||
"git.wntrmute.dev/kyle/goutils/lib"
|
"git.wntrmute.dev/kyle/goutils/lib"
|
||||||
|
"github.com/cloudflare/cfssl/helpers"
|
||||||
)
|
)
|
||||||
|
|
||||||
var warnOnly bool
|
var warnOnly bool
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/cloudflare/cfssl/helpers"
|
|
||||||
"github.com/cloudflare/cfssl/revoke"
|
|
||||||
"git.wntrmute.dev/kyle/goutils/die"
|
"git.wntrmute.dev/kyle/goutils/die"
|
||||||
"git.wntrmute.dev/kyle/goutils/lib"
|
"git.wntrmute.dev/kyle/goutils/lib"
|
||||||
|
"github.com/cloudflare/cfssl/helpers"
|
||||||
|
"github.com/cloudflare/cfssl/revoke"
|
||||||
)
|
)
|
||||||
|
|
||||||
func printRevocation(cert *x509.Certificate) {
|
func printRevocation(cert *x509.Certificate) {
|
||||||
|
|||||||
@@ -5,7 +5,10 @@ go_library(
|
|||||||
srcs = ["main.go"],
|
srcs = ["main.go"],
|
||||||
importpath = "git.wntrmute.dev/kyle/goutils/cmd/cruntar",
|
importpath = "git.wntrmute.dev/kyle/goutils/cmd/cruntar",
|
||||||
visibility = ["//visibility:private"],
|
visibility = ["//visibility:private"],
|
||||||
deps = ["//die"],
|
deps = [
|
||||||
|
"//die",
|
||||||
|
"//fileutil",
|
||||||
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
go_binary(
|
go_binary(
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"git.wntrmute.dev/kyle/goutils/die"
|
"git.wntrmute.dev/kyle/goutils/die"
|
||||||
|
"git.wntrmute.dev/kyle/goutils/fileutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -56,7 +57,7 @@ func processFile(tfr *tar.Reader, hdr *tar.Header, top string) error {
|
|||||||
}
|
}
|
||||||
filePath := filepath.Clean(filepath.Join(top, hdr.Name))
|
filePath := filepath.Clean(filepath.Join(top, hdr.Name))
|
||||||
switch hdr.Typeflag {
|
switch hdr.Typeflag {
|
||||||
case tar.TypeReg, tar.TypeRegA:
|
case tar.TypeReg:
|
||||||
file, err := os.Create(filePath)
|
file, err := os.Create(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -92,6 +93,17 @@ func processFile(tfr *tar.Reader, hdr *tar.Header, top string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case tar.TypeSymlink:
|
case tar.TypeSymlink:
|
||||||
|
if !fileutil.ValidateSymlink(hdr.Linkname, top) {
|
||||||
|
return fmt.Errorf("symlink %s is outside the top-level %s",
|
||||||
|
hdr.Linkname, top)
|
||||||
|
}
|
||||||
|
path := linkTarget(hdr.Linkname, top)
|
||||||
|
if ok, err := filepath.Match(top+"/*", filepath.Clean(path)); !ok {
|
||||||
|
return fmt.Errorf("symlink %s isn't in %s", hdr.Linkname, top)
|
||||||
|
} else if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
err := os.Symlink(linkTarget(hdr.Linkname, top), filePath)
|
err := os.Symlink(linkTarget(hdr.Linkname, top), filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ go_library(
|
|||||||
importpath = "git.wntrmute.dev/kyle/goutils/cmd/showimp",
|
importpath = "git.wntrmute.dev/kyle/goutils/cmd/showimp",
|
||||||
visibility = ["//visibility:private"],
|
visibility = ["//visibility:private"],
|
||||||
deps = [
|
deps = [
|
||||||
|
"//dbg",
|
||||||
"//die",
|
"//die",
|
||||||
"//logging",
|
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -12,36 +12,23 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"git.wntrmute.dev/kyle/goutils/dbg"
|
||||||
"git.wntrmute.dev/kyle/goutils/die"
|
"git.wntrmute.dev/kyle/goutils/die"
|
||||||
"git.wntrmute.dev/kyle/goutils/logging"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
gopath string
|
gopath string
|
||||||
project string
|
project string
|
||||||
debug bool
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
stdLibRegexp = regexp.MustCompile(`^\w+(/\w+)*$`)
|
debug = dbg.New()
|
||||||
sourceRegexp = regexp.MustCompile(`^[^.].*\.go$`)
|
|
||||||
log = logging.NewConsole()
|
|
||||||
imports = map[string]bool{}
|
|
||||||
fset = &token.FileSet{}
|
fset = &token.FileSet{}
|
||||||
|
imports = map[string]bool{}
|
||||||
|
sourceRegexp = regexp.MustCompile(`^[^.].*\.go$`)
|
||||||
|
stdLibRegexp = regexp.MustCompile(`^\w+(/\w+)*$`)
|
||||||
)
|
)
|
||||||
|
|
||||||
func debugf(format string, args ...interface{}) {
|
|
||||||
if debug {
|
|
||||||
fmt.Printf(format, args...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func debugln(args ...interface{}) {
|
|
||||||
if debug {
|
|
||||||
fmt.Println(args...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
gopath = os.Getenv("GOPATH")
|
gopath = os.Getenv("GOPATH")
|
||||||
if gopath == "" {
|
if gopath == "" {
|
||||||
@@ -75,7 +62,7 @@ func walkFile(path string, info os.FileInfo, err error) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
debugln(path)
|
debug.Println(path)
|
||||||
|
|
||||||
f, err := parser.ParseFile(fset, path, nil, parser.ImportsOnly)
|
f, err := parser.ParseFile(fset, path, nil, parser.ImportsOnly)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -85,16 +72,16 @@ func walkFile(path string, info os.FileInfo, err error) error {
|
|||||||
for _, importSpec := range f.Imports {
|
for _, importSpec := range f.Imports {
|
||||||
importPath := strings.Trim(importSpec.Path.Value, `"`)
|
importPath := strings.Trim(importSpec.Path.Value, `"`)
|
||||||
if stdLibRegexp.MatchString(importPath) {
|
if stdLibRegexp.MatchString(importPath) {
|
||||||
debugln("standard lib:", importPath)
|
debug.Println("standard lib:", importPath)
|
||||||
continue
|
continue
|
||||||
} else if strings.HasPrefix(importPath, project) {
|
} else if strings.HasPrefix(importPath, project) {
|
||||||
debugln("internal import:", importPath)
|
debug.Println("internal import:", importPath)
|
||||||
continue
|
continue
|
||||||
} else if strings.HasPrefix(importPath, "golang.org/") {
|
} else if strings.HasPrefix(importPath, "golang.org/") {
|
||||||
debugln("extended lib:", importPath)
|
debug.Println("extended lib:", importPath)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
debugln("import:", importPath)
|
debug.Println("import:", importPath)
|
||||||
imports[importPath] = true
|
imports[importPath] = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,7 +95,7 @@ func main() {
|
|||||||
var noVendor bool
|
var noVendor bool
|
||||||
flag.StringVar(&ignoreLine, "i", "", "comma-separated list of directories to ignore")
|
flag.StringVar(&ignoreLine, "i", "", "comma-separated list of directories to ignore")
|
||||||
flag.BoolVar(&noVendor, "nv", false, "ignore the vendor directory")
|
flag.BoolVar(&noVendor, "nv", false, "ignore the vendor directory")
|
||||||
flag.BoolVar(&debug, "v", false, "log debugging information")
|
flag.BoolVar(&debug.Enabled, "v", false, "log debugging information")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
if noVendor {
|
if noVendor {
|
||||||
|
|||||||
@@ -55,21 +55,21 @@ func To(w io.WriteCloser) *DebugPrinter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Print calls fmt.Print if Enabled is true.
|
// Print calls fmt.Print if Enabled is true.
|
||||||
func (dbg DebugPrinter) Print(v ...interface{}) {
|
func (dbg *DebugPrinter) Print(v ...interface{}) {
|
||||||
if dbg.Enabled {
|
if dbg.Enabled {
|
||||||
fmt.Fprint(dbg.out, v...)
|
fmt.Fprint(dbg.out, v...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Println calls fmt.Println if Enabled is true.
|
// Println calls fmt.Println if Enabled is true.
|
||||||
func (dbg DebugPrinter) Println(v ...interface{}) {
|
func (dbg *DebugPrinter) Println(v ...interface{}) {
|
||||||
if dbg.Enabled {
|
if dbg.Enabled {
|
||||||
fmt.Fprintln(dbg.out, v...)
|
fmt.Fprintln(dbg.out, v...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Printf calls fmt.Printf if Enabled is true.
|
// Printf calls fmt.Printf if Enabled is true.
|
||||||
func (dbg DebugPrinter) Printf(format string, v ...interface{}) {
|
func (dbg *DebugPrinter) Printf(format string, v ...interface{}) {
|
||||||
if dbg.Enabled {
|
if dbg.Enabled {
|
||||||
fmt.Fprintf(dbg.out, format, v...)
|
fmt.Fprintf(dbg.out, format, v...)
|
||||||
}
|
}
|
||||||
|
|||||||
4
deps.bzl
4
deps.bzl
@@ -329,8 +329,8 @@ def go_dependencies():
|
|||||||
go_repository(
|
go_repository(
|
||||||
name = "org_golang_x_sys",
|
name = "org_golang_x_sys",
|
||||||
importpath = "golang.org/x/sys",
|
importpath = "golang.org/x/sys",
|
||||||
sum = "h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=",
|
sum = "h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=",
|
||||||
version = "v0.0.0-20210615035016-665e8c7367d1",
|
version = "v0.0.0-20220412211240-33da011f77ad",
|
||||||
)
|
)
|
||||||
go_repository(
|
go_repository(
|
||||||
name = "org_golang_x_term",
|
name = "org_golang_x_term",
|
||||||
|
|||||||
@@ -2,8 +2,53 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
|||||||
|
|
||||||
go_library(
|
go_library(
|
||||||
name = "fileutil",
|
name = "fileutil",
|
||||||
srcs = ["fileutil.go"],
|
srcs = [
|
||||||
|
"fileutil.go",
|
||||||
|
"fileutil_windows.go",
|
||||||
|
"symlinks.go",
|
||||||
|
],
|
||||||
importpath = "git.wntrmute.dev/kyle/goutils/fileutil",
|
importpath = "git.wntrmute.dev/kyle/goutils/fileutil",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = ["@org_golang_x_sys//unix"],
|
deps = select({
|
||||||
|
"@io_bazel_rules_go//go/platform:aix": [
|
||||||
|
"@org_golang_x_sys//unix",
|
||||||
|
],
|
||||||
|
"@io_bazel_rules_go//go/platform:android": [
|
||||||
|
"@org_golang_x_sys//unix",
|
||||||
|
],
|
||||||
|
"@io_bazel_rules_go//go/platform:darwin": [
|
||||||
|
"@org_golang_x_sys//unix",
|
||||||
|
],
|
||||||
|
"@io_bazel_rules_go//go/platform:dragonfly": [
|
||||||
|
"@org_golang_x_sys//unix",
|
||||||
|
],
|
||||||
|
"@io_bazel_rules_go//go/platform:freebsd": [
|
||||||
|
"@org_golang_x_sys//unix",
|
||||||
|
],
|
||||||
|
"@io_bazel_rules_go//go/platform:illumos": [
|
||||||
|
"@org_golang_x_sys//unix",
|
||||||
|
],
|
||||||
|
"@io_bazel_rules_go//go/platform:ios": [
|
||||||
|
"@org_golang_x_sys//unix",
|
||||||
|
],
|
||||||
|
"@io_bazel_rules_go//go/platform:js": [
|
||||||
|
"@org_golang_x_sys//unix",
|
||||||
|
],
|
||||||
|
"@io_bazel_rules_go//go/platform:linux": [
|
||||||
|
"@org_golang_x_sys//unix",
|
||||||
|
],
|
||||||
|
"@io_bazel_rules_go//go/platform:netbsd": [
|
||||||
|
"@org_golang_x_sys//unix",
|
||||||
|
],
|
||||||
|
"@io_bazel_rules_go//go/platform:openbsd": [
|
||||||
|
"@org_golang_x_sys//unix",
|
||||||
|
],
|
||||||
|
"@io_bazel_rules_go//go/platform:plan9": [
|
||||||
|
"@org_golang_x_sys//unix",
|
||||||
|
],
|
||||||
|
"@io_bazel_rules_go//go/platform:solaris": [
|
||||||
|
"@org_golang_x_sys//unix",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
}),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
//go:build !windows
|
||||||
|
// +build !windows
|
||||||
|
|
||||||
// Package fileutil contains common file functions.
|
// Package fileutil contains common file functions.
|
||||||
package fileutil
|
package fileutil
|
||||||
|
|
||||||
|
|||||||
49
fileutil/fileutil_windows.go
Normal file
49
fileutil/fileutil_windows.go
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
|
// Package fileutil contains common file functions.
|
||||||
|
package fileutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FileDoesExist returns true if the file exists.
|
||||||
|
func FileDoesExist(path string) bool {
|
||||||
|
_, err := os.Stat(path)
|
||||||
|
return !os.IsNotExist(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DirectoryDoesExist returns true if the file exists.
|
||||||
|
func DirectoryDoesExist(path string) bool {
|
||||||
|
fi, err := os.Stat(path)
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return fi.Mode().IsDir()
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
// AccessExists checks whether the file exists. This is invalid outside of
|
||||||
|
// Unix systems.
|
||||||
|
AccessExists = 0
|
||||||
|
|
||||||
|
// AccessRead checks whether the user has read permissions on
|
||||||
|
// the file. This is invalid outside of Unix systems.
|
||||||
|
AccessRead = 0
|
||||||
|
|
||||||
|
// AccessWrite checks whether the user has write permissions
|
||||||
|
// on the file. This is invalid outside of Unix systems.
|
||||||
|
AccessWrite = 0
|
||||||
|
|
||||||
|
// AccessExec checks whether the user has executable
|
||||||
|
// permissions on the file. This is invalid outside of Unix systems.
|
||||||
|
AccessExec = 0
|
||||||
|
)
|
||||||
|
|
||||||
|
// Access is a Unix-only call, and has no meaning on Windows.
|
||||||
|
func Access(path string, mode int) error {
|
||||||
|
return errors.New("fileutil: Access is meaningless on Windows")
|
||||||
|
}
|
||||||
16
fileutil/symlinks.go
Normal file
16
fileutil/symlinks.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package fileutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ValidateSymlink checks to make sure a symlink exists in some top-level
|
||||||
|
// directory.
|
||||||
|
func ValidateSymlink(symlink, topLevel string) bool {
|
||||||
|
target, err := filepath.EvalSymlinks(symlink)
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return strings.HasPrefix(target, topLevel)
|
||||||
|
}
|
||||||
10
go.mod
10
go.mod
@@ -10,14 +10,8 @@ require (
|
|||||||
github.com/pkg/sftp v1.12.0
|
github.com/pkg/sftp v1.12.0
|
||||||
github.com/stretchr/testify v1.6.1
|
github.com/stretchr/testify v1.6.1
|
||||||
golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b
|
golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1
|
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad
|
||||||
gopkg.in/yaml.v2 v2.4.0
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require github.com/davecgh/go-spew v1.1.1
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
|
||||||
github.com/google/certificate-transparency-go v1.0.21 // indirect
|
|
||||||
github.com/kr/fs v0.1.0 // indirect
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect
|
|
||||||
)
|
|
||||||
|
|||||||
8
go.sum
8
go.sum
@@ -81,16 +81,22 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
|
|||||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
|
||||||
|
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ func Duration(d time.Duration) string {
|
|||||||
if d >= yearDuration {
|
if d >= yearDuration {
|
||||||
years := d / yearDuration
|
years := d / yearDuration
|
||||||
s += fmt.Sprintf("%dy", years)
|
s += fmt.Sprintf("%dy", years)
|
||||||
d -= (years * yearDuration)
|
d -= years * yearDuration
|
||||||
}
|
}
|
||||||
|
|
||||||
if d >= dayDuration {
|
if d >= dayDuration {
|
||||||
@@ -103,7 +103,7 @@ func Duration(d time.Duration) string {
|
|||||||
|
|
||||||
d %= 1 * time.Second
|
d %= 1 * time.Second
|
||||||
hours := d / time.Hour
|
hours := d / time.Hour
|
||||||
d -= (hours * time.Hour)
|
d -= hours * time.Hour
|
||||||
s += fmt.Sprintf("%dh%s", hours, d)
|
s += fmt.Sprintf("%dh%s", hours, d)
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,21 +8,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Logger provides a standardised logging interface.
|
// Logger provides a standardised logging interface.
|
||||||
type Logger interface {
|
//
|
||||||
// SetLevel sets the minimum log level.
|
|
||||||
SetLevel(Level)
|
|
||||||
|
|
||||||
// Good returns true if the Logger is healthy.
|
|
||||||
Good() bool
|
|
||||||
|
|
||||||
// Status returns an error corresponding to the logger's state;
|
|
||||||
// if it's healthy (e.g. Good() returns true), Error will
|
|
||||||
// return nil.
|
|
||||||
Status() error
|
|
||||||
|
|
||||||
// Close gives the Logger the opportunity to perform any cleanup.
|
|
||||||
Close() error
|
|
||||||
|
|
||||||
// Log messages consist of four components:
|
// Log messages consist of four components:
|
||||||
//
|
//
|
||||||
// 1. The **level** attaches a notion of priority to the log message.
|
// 1. The **level** attaches a notion of priority to the log message.
|
||||||
@@ -83,6 +69,21 @@ type Logger interface {
|
|||||||
// + ``$2`` contains the level
|
// + ``$2`` contains the level
|
||||||
// + ``$3`` contains the actor
|
// + ``$3`` contains the actor
|
||||||
// + ``$4`` contains the event
|
// + ``$4`` contains the event
|
||||||
|
type Logger interface {
|
||||||
|
// SetLevel sets the minimum log level.
|
||||||
|
SetLevel(Level)
|
||||||
|
|
||||||
|
// Good returns true if the Logger is healthy.
|
||||||
|
Good() bool
|
||||||
|
|
||||||
|
// Status returns an error corresponding to the logger's state;
|
||||||
|
// if it's healthy (e.g. Good() returns true), Error will
|
||||||
|
// return nil.
|
||||||
|
Status() error
|
||||||
|
|
||||||
|
// Close gives the Logger the opportunity to perform any cleanup.
|
||||||
|
Close() error
|
||||||
|
|
||||||
Debug(actor, event string, attrs map[string]string)
|
Debug(actor, event string, attrs map[string]string)
|
||||||
Info(actor, event string, attrs map[string]string)
|
Info(actor, event string, attrs map[string]string)
|
||||||
Warn(actor, event string, attrs map[string]string)
|
Warn(actor, event string, attrs map[string]string)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// seekbuf implements a read-seekable buffer.
|
// Package seekbuf implements a read-seekable buffer.
|
||||||
package seekbuf
|
package seekbuf
|
||||||
|
|
||||||
import "io"
|
import "io"
|
||||||
|
|||||||
@@ -1,17 +1,12 @@
|
|||||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||||
|
|
||||||
go_library(
|
|
||||||
name = "log",
|
|
||||||
srcs = ["logger.go"],
|
|
||||||
importpath = "git.wntrmute.dev/kyle/kdhcp/log",
|
|
||||||
visibility = ["//visibility:public"],
|
|
||||||
deps = ["@com_github_hashicorp_go_syslog//:go-syslog"],
|
|
||||||
)
|
|
||||||
|
|
||||||
go_library(
|
go_library(
|
||||||
name = "syslog",
|
name = "syslog",
|
||||||
srcs = ["logger.go"],
|
srcs = ["logger.go"],
|
||||||
importpath = "git.wntrmute.dev/kyle/goutils/syslog",
|
importpath = "git.wntrmute.dev/kyle/goutils/syslog",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = ["@com_github_hashicorp_go_syslog//:go-syslog"],
|
deps = [
|
||||||
|
"@com_github_davecgh_go_spew//spew",
|
||||||
|
"@com_github_hashicorp_go_syslog//:go-syslog",
|
||||||
|
],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// syslog is a syslog-type facility for logging.
|
// Package syslog is a syslog-type facility for logging.
|
||||||
package syslog
|
package syslog
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/davecgh/go-spew/spew"
|
||||||
gsyslog "github.com/hashicorp/go-syslog"
|
gsyslog "github.com/hashicorp/go-syslog"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -52,6 +53,12 @@ func (log *logger) println(p gsyslog.Priority, args ...interface{}) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (log *logger) spew(args ...interface{}) {
|
||||||
|
if log.p == gsyslog.LOG_DEBUG {
|
||||||
|
spew.Dump(args...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (log *logger) adjustPriority(level string) error {
|
func (log *logger) adjustPriority(level string) error {
|
||||||
priority, ok := priorities[level]
|
priority, ok := priorities[level]
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -100,12 +107,12 @@ type Options struct {
|
|||||||
// DefaultOptions returns a sane set of defaults for syslog, using the program
|
// DefaultOptions returns a sane set of defaults for syslog, using the program
|
||||||
// name as the tag name. withSyslog controls whether logs should be sent to
|
// name as the tag name. withSyslog controls whether logs should be sent to
|
||||||
// syslog, too.
|
// syslog, too.
|
||||||
func DefaultOptions(tag string, withSyslog bool) {
|
func DefaultOptions(tag string, withSyslog bool) *Options {
|
||||||
if tag == "" {
|
if tag == "" {
|
||||||
tag = os.Args[0]
|
tag = os.Args[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DefaultOptions{
|
return &Options{
|
||||||
Level: "WARNING",
|
Level: "WARNING",
|
||||||
Tag: tag,
|
Tag: tag,
|
||||||
Facility: "daemon",
|
Facility: "daemon",
|
||||||
@@ -113,15 +120,15 @@ func DefaultOptions(tag string, withSyslog bool) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultDefaultOptions returns a sane set of debug defaults for syslog,
|
// DefaultDebugOptions returns a sane set of debug defaults for syslog,
|
||||||
// using the program name as the tag name. withSyslog controls whether logs
|
// using the program name as the tag name. withSyslog controls whether logs
|
||||||
// should be sent to syslog, too.
|
// should be sent to syslog, too.
|
||||||
func DefaultDebugOptions(tag string, withSyslog bool) {
|
func DefaultDebugOptions(tag string, withSyslog bool) *Options {
|
||||||
if tag == "" {
|
if tag == "" {
|
||||||
tag = os.Args[0]
|
tag = os.Args[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DefaultOptions{
|
return &Options{
|
||||||
Level: "DEBUG",
|
Level: "DEBUG",
|
||||||
Facility: "daemon",
|
Facility: "daemon",
|
||||||
WriteSyslog: withSyslog,
|
WriteSyslog: withSyslog,
|
||||||
@@ -131,7 +138,7 @@ func DefaultDebugOptions(tag string, withSyslog bool) {
|
|||||||
func Setup(opts *Options) error {
|
func Setup(opts *Options) error {
|
||||||
priority, ok := priorities[opts.Level]
|
priority, ok := priorities[opts.Level]
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("log: unknown priority %s", level)
|
return fmt.Errorf("log: unknown priority %s", opts.Level)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.p = priority
|
log.p = priority
|
||||||
@@ -252,6 +259,11 @@ func Fatalf(format string, args ...interface{}) {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Spew will pretty print the args if the logger is set to DEBUG priority.
|
||||||
|
func Spew(args ...interface{}) {
|
||||||
|
log.spew(args...)
|
||||||
|
}
|
||||||
|
|
||||||
func ChangePriority(level string) error {
|
func ChangePriority(level string) error {
|
||||||
return log.adjustPriority(level)
|
return log.adjustPriority(level)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user