diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..225195d --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,19 @@ +version: 2 +jobs: + build: + docker: + - image: quay.io/cybozu/golang:1.11-bionic + working_directory: /work + steps: + - checkout + - run: test -z "$(gofmt -s -l . | grep -v '^vendor' | tee /dev/stderr)" + - run: golint -set_exit_status . + - run: go build ./... + - run: go test -race -v ./... + - run: go vet ./... + +workflows: + version: 2 + main: + jobs: + - build diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 99f7a34..0000000 --- a/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -sudo: false -language: go -go: - - stable - - master - -before_install: - - go get github.com/golang/lint/golint - -script: - - go install ./... - - go test -v ./... - - go vet -x ./... - - $HOME/gopath/bin/golint -set_exit_status -min_confidence 0.81 ./... diff --git a/cmd/transocks/main.go b/cmd/transocks/main.go index 2b0cbc8..ad39070 100644 --- a/cmd/transocks/main.go +++ b/cmd/transocks/main.go @@ -7,15 +7,15 @@ import ( "net/url" "github.com/BurntSushi/toml" - "github.com/cybozu-go/cmd" "github.com/cybozu-go/log" "github.com/cybozu-go/transocks" + "github.com/cybozu-go/well" ) type tomlConfig struct { - Listen string `toml:"listen"` - ProxyURL string `toml:"proxy_url"` - Log cmd.LogConfig `toml:"log"` + Listen string `toml:"listen"` + ProxyURL string `toml:"proxy_url"` + Log well.LogConfig `toml:"log"` } const ( @@ -65,8 +65,8 @@ func serve(lns []net.Listener, c *transocks.Config) { for _, ln := range lns { s.Serve(ln) } - err = cmd.Wait() - if err != nil && !cmd.IsSignaled(err) { + err = well.Wait() + if err != nil && !well.IsSignaled(err) { log.ErrorExit(err) } } @@ -79,7 +79,7 @@ func main() { log.ErrorExit(err) } - g := &cmd.Graceful{ + g := &well.Graceful{ Listen: func() ([]net.Listener, error) { return transocks.Listeners(c) }, @@ -89,8 +89,8 @@ func main() { } g.Run() - err = cmd.Wait() - if err != nil && !cmd.IsSignaled(err) { + err = well.Wait() + if err != nil && !well.IsSignaled(err) { log.ErrorExit(err) } } diff --git a/config.go b/config.go index 8ac1415..62e8aea 100644 --- a/config.go +++ b/config.go @@ -7,8 +7,8 @@ import ( "net/url" "time" - "github.com/cybozu-go/cmd" "github.com/cybozu-go/log" + "github.com/cybozu-go/well" ) const ( @@ -58,9 +58,9 @@ type Config struct { // If nil, the default logger is used. Logger *log.Logger - // Env can be used to specify a cmd.Environment on which the server runs. + // Env can be used to specify a well.Environment on which the server runs. // If nil, the server will run on the global environment. - Env *cmd.Environment + Env *well.Environment } // NewConfig creates and initializes a new Config. diff --git a/defs_linux.go b/defs_linux.go new file mode 100644 index 0000000..ffde475 --- /dev/null +++ b/defs_linux.go @@ -0,0 +1,12 @@ +// Code generated by hand. DO NOT EDIT. +// +build linux + +package transocks + +const ( + // SO_ORIGINAL_DST is a Linux getsockopt optname. + SO_ORIGINAL_DST = 80 + + // IP6T_SO_ORIGINAL_DST a Linux getsockopt optname. + IP6T_SO_ORIGINAL_DST = 80 +) diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..0554be2 --- /dev/null +++ b/go.mod @@ -0,0 +1,9 @@ +module github.com/cybozu-go/transocks + +require ( + github.com/BurntSushi/toml v0.3.1 + github.com/cybozu-go/log v1.5.0 + github.com/cybozu-go/netutil v1.2.0 + github.com/cybozu-go/well v1.8.1 + golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..b35dfc8 --- /dev/null +++ b/go.sum @@ -0,0 +1,47 @@ +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/cybozu-go/log v1.5.0 h1:cjLr+pNga4NL5sj5vnnG00xKmKXSWx0grQQ4LnV1Ris= +github.com/cybozu-go/log v1.5.0/go.mod h1:zpfovuCgUx+a/ErvQrThoT+/z1RVQoLDOf95wkBeRiw= +github.com/cybozu-go/netutil v1.2.0 h1:UBO0+hB43zd5mIXRfD195eBMHvgWlHP2mYuQ2F5Yxtg= +github.com/cybozu-go/netutil v1.2.0/go.mod h1:Wx92iF1dPrtuSzLUMEidtrKTFiDWpLcsYvbQ1lHSmxY= +github.com/cybozu-go/well v1.8.1 h1:YlEPreiDBI+KxE5rcAkkaB5j/Iyow6nIVmUpq3u5DYQ= +github.com/cybozu-go/well v1.8.1/go.mod h1:9PK1AltjltFwZBtTWVXnCJ0fIeZMxGovYfLmCcZxQog= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mitchellh/mapstructure v1.0.0 h1:vVpGvMXJPqSDh2VYHF7gsfQj8Ncx+Xw5Y1KHeTRY+7I= +github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.2.0 h1:HHl1DSRbEQN2i8tJmtS6ViPyHx35+p51amrdsiTCrkg= +github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.2.1 h1:bIcUwXqLseLF3BDAZduuNfekWG87ibtFxi59Bq+oI9M= +github.com/spf13/viper v1.2.1/go.mod h1:P4AexN0a+C9tGAnUFNwDMYYZv3pjFuvmeiMyKRaNVlI= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3 h1:czFLhve3vsQetD6JOJ8NZZvGQIXlnN3/yXxbT6/awxI= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992 h1:BH3eQWeGbwRU2+wxxuuPOdFBmaiBH81O8BugSjHeTFg= +golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/original_dst_linux.go b/original_dst_linux.go index 473dea4..cc9bbfb 100644 --- a/original_dst_linux.go +++ b/original_dst_linux.go @@ -9,14 +9,6 @@ import ( "unsafe" ) -const ( - // SO_ORIGINAL_DST is a Linux getsockopt optname. - SO_ORIGINAL_DST = 80 - - // IP6T_SO_ORIGINAL_DST a Linux getsockopt optname. - IP6T_SO_ORIGINAL_DST = 80 -) - func getsockopt(s int, level int, optname int, optval unsafe.Pointer, optlen *uint32) (err error) { _, _, e := syscall.Syscall6( syscall.SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(optname), diff --git a/server.go b/server.go index ae7e1b4..35e534e 100644 --- a/server.go +++ b/server.go @@ -7,9 +7,9 @@ import ( "sync" "time" - "github.com/cybozu-go/cmd" "github.com/cybozu-go/log" "github.com/cybozu-go/netutil" + "github.com/cybozu-go/well" "golang.org/x/net/proxy" ) @@ -29,7 +29,7 @@ func Listeners(c *Config) ([]net.Listener, error) { // Server provides transparent proxy server functions. type Server struct { - cmd.Server + well.Server mode Mode logger *log.Logger dialer proxy.Dialer @@ -60,7 +60,7 @@ func NewServer(c *Config) (*Server, error) { } s := &Server{ - Server: cmd.Server{ + Server: well.Server{ ShutdownTimeout: c.ShutdownTimeout, Env: c.Env, }, @@ -86,7 +86,7 @@ func (s *Server) handleConnection(ctx context.Context, conn net.Conn) { return } - fields := cmd.FieldsFromContext(ctx) + fields := well.FieldsFromContext(ctx) fields[log.FnType] = "access" fields["client_addr"] = conn.RemoteAddr().String() @@ -117,7 +117,7 @@ func (s *Server) handleConnection(ctx context.Context, conn net.Conn) { // do proxy st := time.Now() - env := cmd.NewEnvironment(ctx) + env := well.NewEnvironment(ctx) env.Go(func(ctx context.Context) error { buf := s.pool.Get().([]byte) _, err := io.CopyBuffer(destConn, tc, buf) @@ -141,7 +141,7 @@ func (s *Server) handleConnection(ctx context.Context, conn net.Conn) { env.Stop() err = env.Wait() - fields = cmd.FieldsFromContext(ctx) + fields = well.FieldsFromContext(ctx) fields["elapsed"] = time.Since(st).Seconds() if err != nil { fields[log.FnError] = err.Error()