mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-08-31 22:34:02 +03:00
Switch to golangci-lint
This commit is contained in:
@@ -0,0 +1,12 @@
|
|||||||
|
[run]
|
||||||
|
concurrency = 4
|
||||||
|
deadline = "2m"
|
||||||
|
tests = true
|
||||||
|
skip-dirs = ["vendor"]
|
||||||
|
skip-files = ["version.go"]
|
||||||
|
|
||||||
|
[output]
|
||||||
|
format = "colored-line-number"
|
||||||
|
|
||||||
|
[linters]
|
||||||
|
enable-all = true
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"aggregate": true,
|
|
||||||
"vendor": true
|
|
||||||
}
|
|
||||||
@@ -10,6 +10,8 @@ go:
|
|||||||
- master
|
- master
|
||||||
|
|
||||||
script:
|
script:
|
||||||
|
- make prepare
|
||||||
|
- make all
|
||||||
- make lint
|
- make lint
|
||||||
- make test
|
- make test
|
||||||
|
|
||||||
|
|||||||
Generated
+44
-4
@@ -3,74 +3,97 @@
|
|||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
|
digest = "1:45a787c1adea69a03a5384865b307c7a72bb28bd5844bd57679d889a726a588b"
|
||||||
name = "github.com/alecthomas/template"
|
name = "github.com/alecthomas/template"
|
||||||
packages = [
|
packages = [
|
||||||
".",
|
".",
|
||||||
"parse"
|
"parse",
|
||||||
]
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "a0175ee3bccc567396460bf5acd36800cb10c49c"
|
revision = "a0175ee3bccc567396460bf5acd36800cb10c49c"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
|
digest = "1:c198fdc381e898e8fb62b8eb62758195091c313ad18e52a3067366e1dda2fb3c"
|
||||||
name = "github.com/alecthomas/units"
|
name = "github.com/alecthomas/units"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "2efee857e7cfd4f3d0138cc3cbb1b4966962b93a"
|
revision = "2efee857e7cfd4f3d0138cc3cbb1b4966962b93a"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
|
digest = "1:a8d622a8049a4aa420e1c509873bb85d4c45c5107f420d922f919bfcb8d08694"
|
||||||
name = "github.com/beevik/ntp"
|
name = "github.com/beevik/ntp"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "62c80a04de2086884d8296004b6d74ee1846c582"
|
revision = "62c80a04de2086884d8296004b6d74ee1846c582"
|
||||||
version = "v0.2.0"
|
version = "v0.2.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
|
digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39"
|
||||||
name = "github.com/davecgh/go-spew"
|
name = "github.com/davecgh/go-spew"
|
||||||
packages = ["spew"]
|
packages = ["spew"]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "346938d642f2ec3594ed81d874461961cd0faa76"
|
revision = "346938d642f2ec3594ed81d874461961cd0faa76"
|
||||||
version = "v1.1.0"
|
version = "v1.1.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
|
digest = "1:6f9339c912bbdda81302633ad7e99a28dfa5a639c864061f1929510a9a64aa74"
|
||||||
name = "github.com/dustin/go-humanize"
|
name = "github.com/dustin/go-humanize"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "9f541cc9db5d55bce703bd99987c9d5cb8eea45e"
|
revision = "9f541cc9db5d55bce703bd99987c9d5cb8eea45e"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
|
digest = "1:70107cf7ee5eb9e3c3dabe65bcb220bff22ee42e32d9b7fca988e16b8727cacc"
|
||||||
name = "github.com/juju/errors"
|
name = "github.com/juju/errors"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "c7d06af17c68cd34c835053720b21f6549d9b0ee"
|
revision = "c7d06af17c68cd34c835053720b21f6549d9b0ee"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
|
digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe"
|
||||||
name = "github.com/pmezard/go-difflib"
|
name = "github.com/pmezard/go-difflib"
|
||||||
packages = ["difflib"]
|
packages = ["difflib"]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "792786c7400a136282c1664665ae0a8db921c6c2"
|
revision = "792786c7400a136282c1664665ae0a8db921c6c2"
|
||||||
version = "v1.0.0"
|
version = "v1.0.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
|
digest = "1:274f67cb6fed9588ea2521ecdac05a6d62a8c51c074c1fccc6a49a40ba80e925"
|
||||||
name = "github.com/satori/go.uuid"
|
name = "github.com/satori/go.uuid"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "f58768cc1a7a7e77a3bd49e98cdd21419399b6a3"
|
revision = "f58768cc1a7a7e77a3bd49e98cdd21419399b6a3"
|
||||||
version = "v1.2.0"
|
version = "v1.2.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
|
digest = "1:18752d0b95816a1b777505a97f71c7467a8445b8ffb55631a7bf779f6ba4fa83"
|
||||||
name = "github.com/stretchr/testify"
|
name = "github.com/stretchr/testify"
|
||||||
packages = ["assert"]
|
packages = ["assert"]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686"
|
revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686"
|
||||||
version = "v1.2.2"
|
version = "v1.2.2"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
|
digest = "1:3c1a69cdae3501bf75e76d0d86dc6f2b0a7421bc205c0cb7b96b19eed464a34d"
|
||||||
name = "go.uber.org/atomic"
|
name = "go.uber.org/atomic"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "1ea20fb1cbb1cc08cbd0d913a96dead89aa18289"
|
revision = "1ea20fb1cbb1cc08cbd0d913a96dead89aa18289"
|
||||||
version = "v1.3.2"
|
version = "v1.3.2"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
|
digest = "1:60bf2a5e347af463c42ed31a493d817f8a72f102543060ed992754e689805d1a"
|
||||||
name = "go.uber.org/multierr"
|
name = "go.uber.org/multierr"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a"
|
revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a"
|
||||||
version = "v1.1.0"
|
version = "v1.1.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
|
digest = "1:e6d865f90ef1178c14bdb49ea9f244bfcb28c06ea9773dc077492032632de0b8"
|
||||||
name = "go.uber.org/zap"
|
name = "go.uber.org/zap"
|
||||||
packages = [
|
packages = [
|
||||||
".",
|
".",
|
||||||
@@ -78,37 +101,54 @@
|
|||||||
"internal/bufferpool",
|
"internal/bufferpool",
|
||||||
"internal/color",
|
"internal/color",
|
||||||
"internal/exit",
|
"internal/exit",
|
||||||
"zapcore"
|
"zapcore",
|
||||||
]
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "eeedf312bc6c57391d84767a4cd413f02a917974"
|
revision = "eeedf312bc6c57391d84767a4cd413f02a917974"
|
||||||
version = "v1.8.0"
|
version = "v1.8.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
|
digest = "1:656046288ed20c53157025a0915f176cad9340ac515501c427806a6f76023d75"
|
||||||
name = "golang.org/x/net"
|
name = "golang.org/x/net"
|
||||||
packages = [
|
packages = [
|
||||||
"bpf",
|
"bpf",
|
||||||
"internal/iana",
|
"internal/iana",
|
||||||
"internal/socket",
|
"internal/socket",
|
||||||
"ipv4"
|
"ipv4",
|
||||||
]
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "d0887baf81f4598189d4e12a37c6da86f0bba4d0"
|
revision = "d0887baf81f4598189d4e12a37c6da86f0bba4d0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
|
digest = "1:c06d9e11d955af78ac3bbb26bd02e01d2f61f689e1a3bce2ef6fb683ef8a7f2d"
|
||||||
name = "gopkg.in/alecthomas/kingpin.v2"
|
name = "gopkg.in/alecthomas/kingpin.v2"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "947dcec5ba9c011838740e680966fd7087a71d0d"
|
revision = "947dcec5ba9c011838740e680966fd7087a71d0d"
|
||||||
version = "v2.2.6"
|
version = "v2.2.6"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
|
digest = "1:38b469493eb173db9c03321d64adcad4c7991ea0a19b5edc5bdc094f0e8c7384"
|
||||||
name = "gopkg.in/alexcesaro/statsd.v2"
|
name = "gopkg.in/alexcesaro/statsd.v2"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
revision = "7fea3f0d2fab1ad973e641e51dba45443a311a90"
|
revision = "7fea3f0d2fab1ad973e641e51dba45443a311a90"
|
||||||
version = "v2.0.0"
|
version = "v2.0.0"
|
||||||
|
|
||||||
[solve-meta]
|
[solve-meta]
|
||||||
analyzer-name = "dep"
|
analyzer-name = "dep"
|
||||||
analyzer-version = 1
|
analyzer-version = 1
|
||||||
inputs-digest = "7fad0f62feb7737b064d85cc4333a1a3e9298faec2afd864b4404f515fc7f17c"
|
input-imports = [
|
||||||
|
"github.com/beevik/ntp",
|
||||||
|
"github.com/dustin/go-humanize",
|
||||||
|
"github.com/juju/errors",
|
||||||
|
"github.com/satori/go.uuid",
|
||||||
|
"github.com/stretchr/testify/assert",
|
||||||
|
"go.uber.org/zap",
|
||||||
|
"go.uber.org/zap/zapcore",
|
||||||
|
"gopkg.in/alecthomas/kingpin.v2",
|
||||||
|
"gopkg.in/alexcesaro/statsd.v2",
|
||||||
|
]
|
||||||
solver-name = "gps-cdcl"
|
solver-name = "gps-cdcl"
|
||||||
solver-version = 1
|
solver-version = 1
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
|
ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
|
||||||
IMAGE_NAME := mtg
|
IMAGE_NAME := mtg
|
||||||
APP_NAME := $(IMAGE_NAME)
|
APP_NAME := $(IMAGE_NAME)
|
||||||
GOMETALINTER := gometalinter
|
|
||||||
|
|
||||||
VENDOR_FILES := $(shell find "$(ROOT_DIR)/vendor" 2>/dev/null || echo -n "vendor")
|
VENDOR_FILES := $(shell find "$(ROOT_DIR)/vendor" 2>/dev/null || echo -n "vendor")
|
||||||
CC_BINARIES := $(shell bash -c "echo -n $(APP_NAME)-{linux,freebsd,openbsd}-{386,amd64} $(APP_NAME)-linux-{arm,arm64}")
|
CC_BINARIES := $(shell bash -c "echo -n $(APP_NAME)-{linux,freebsd,openbsd}-{386,amd64} $(APP_NAME)-linux-{arm,arm64}")
|
||||||
APP_DEPS := version.go $(VENDOR_FILES)
|
APP_DEPS := version.go $(VENDOR_FILES)
|
||||||
|
|
||||||
|
GOLANGCI_LINT_VERSION := v1.9.1
|
||||||
|
|
||||||
COMMON_BUILD_FLAGS := -ldflags="-s -w"
|
COMMON_BUILD_FLAGS := -ldflags="-s -w"
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
@@ -31,7 +32,7 @@ ccbuilds:
|
|||||||
version.go:
|
version.go:
|
||||||
@go generate main.go
|
@go generate main.go
|
||||||
|
|
||||||
vendor: Gopkg.lock Gopkg.toml install-cli
|
vendor: Gopkg.lock Gopkg.toml install-dep
|
||||||
@dep ensure
|
@dep ensure
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
@@ -50,12 +51,12 @@ crosscompile-dir:
|
|||||||
@rm -rf "$(CC_DIR)" && mkdir -p "$(CC_DIR)"
|
@rm -rf "$(CC_DIR)" && mkdir -p "$(CC_DIR)"
|
||||||
|
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test: vendor install-cli version.go
|
test: vendor version.go
|
||||||
@go test -v ./...
|
@go test -v ./...
|
||||||
|
|
||||||
.PHONY: lint
|
.PHONY: lint
|
||||||
lint: vendor install-cli version.go
|
lint: version.go
|
||||||
@$(GOMETALINTER) --deadline=2m ./...
|
@golangci-lint run
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
@@ -67,14 +68,14 @@ clean:
|
|||||||
docker:
|
docker:
|
||||||
@docker build --pull -t "$(IMAGE_NAME)" "$(ROOT_DIR)"
|
@docker build --pull -t "$(IMAGE_NAME)" "$(ROOT_DIR)"
|
||||||
|
|
||||||
.PHONY: install-cli
|
.PHONY: prepare
|
||||||
install-cli: install-dep install-lint
|
prepare: install-dep install-lint
|
||||||
|
|
||||||
.PHONY: install-dep
|
.PHONY: install-dep
|
||||||
install-dep:
|
install-dep:
|
||||||
@go get github.com/golang/dep/cmd/dep
|
@go get -u github.com/golang/dep/cmd/dep
|
||||||
|
|
||||||
.PHONY: install-lint
|
.PHONY: install-lint
|
||||||
install-lint:
|
install-lint:
|
||||||
@go get github.com/alecthomas/gometalinter && \
|
@curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh \
|
||||||
$(GOMETALINTER) --install >/dev/null
|
| bash -s -- -b $(GOPATH)/bin $(GOLANGCI_LINT_VERSION)
|
||||||
|
|||||||
@@ -25,74 +25,90 @@ import (
|
|||||||
var (
|
var (
|
||||||
app = kingpin.New("mtg", "Simple MTPROTO proxy.")
|
app = kingpin.New("mtg", "Simple MTPROTO proxy.")
|
||||||
|
|
||||||
debug = app.Flag("debug", "Run in debug mode.").
|
debug = app.Flag("debug",
|
||||||
|
"Run in debug mode.").
|
||||||
Short('d').
|
Short('d').
|
||||||
Envar("MTG_DEBUG").
|
Envar("MTG_DEBUG").
|
||||||
Bool()
|
Bool()
|
||||||
verbose = app.Flag("verbose", "Run in verbose mode.").
|
verbose = app.Flag("verbose",
|
||||||
|
"Run in verbose mode.").
|
||||||
Short('v').
|
Short('v').
|
||||||
Envar("MTG_VERBOSE").
|
Envar("MTG_VERBOSE").
|
||||||
Bool()
|
Bool()
|
||||||
|
|
||||||
bindIP = app.Flag("bind-ip", "Which IP to bind to.").
|
bindIP = app.Flag("bind-ip",
|
||||||
|
"Which IP to bind to.").
|
||||||
Short('b').
|
Short('b').
|
||||||
Envar("MTG_IP").
|
Envar("MTG_IP").
|
||||||
Default("127.0.0.1").
|
Default("127.0.0.1").
|
||||||
IP()
|
IP()
|
||||||
bindPort = app.Flag("bind-port", "Which port to bind to.").
|
bindPort = app.Flag("bind-port",
|
||||||
Short('p').
|
"Which port to bind to.").
|
||||||
Envar("MTG_PORT").
|
Short('p').
|
||||||
Default("3128").
|
Envar("MTG_PORT").
|
||||||
Uint16()
|
Default("3128").
|
||||||
|
Uint16()
|
||||||
|
|
||||||
publicIPv4 = app.Flag("public-ipv4", "Which IPv4 address is public.").
|
publicIPv4 = app.Flag("public-ipv4",
|
||||||
Short('4').
|
"Which IPv4 address is public.").
|
||||||
Envar("MTG_IPV4").
|
Short('4').
|
||||||
IP()
|
Envar("MTG_IPV4").
|
||||||
publicIPv4Port = app.Flag("public-ipv4-port", "Which IPv4 port is public. Default is 'bind-port' value.").
|
IP()
|
||||||
Envar("MTG_IPV4_PORT").
|
publicIPv4Port = app.Flag("public-ipv4-port",
|
||||||
Uint16()
|
"Which IPv4 port is public. Default is 'bind-port' value.").
|
||||||
|
Envar("MTG_IPV4_PORT").
|
||||||
|
Uint16()
|
||||||
|
|
||||||
publicIPv6 = app.Flag("public-ipv6", "Which IPv6 address is public.").
|
publicIPv6 = app.Flag("public-ipv6",
|
||||||
Short('6').
|
"Which IPv6 address is public.").
|
||||||
Envar("MTG_IPV6").
|
Short('6').
|
||||||
IP()
|
Envar("MTG_IPV6").
|
||||||
publicIPv6Port = app.Flag("public-ipv6-port", "Which IPv6 port is public. Default is 'bind-port' value.").
|
IP()
|
||||||
Envar("MTG_IPV6_PORT").
|
publicIPv6Port = app.Flag("public-ipv6-port",
|
||||||
Uint16()
|
"Which IPv6 port is public. Default is 'bind-port' value.").
|
||||||
|
Envar("MTG_IPV6_PORT").
|
||||||
|
Uint16()
|
||||||
|
|
||||||
statsIP = app.Flag("stats-ip", "Which IP bind stats server to.").
|
statsIP = app.Flag("stats-ip",
|
||||||
|
"Which IP bind stats server to.").
|
||||||
Short('t').
|
Short('t').
|
||||||
Envar("MTG_STATS_IP").
|
Envar("MTG_STATS_IP").
|
||||||
Default("127.0.0.1").
|
Default("127.0.0.1").
|
||||||
IP()
|
IP()
|
||||||
statsPort = app.Flag("stats-port", "Which port bind stats to.").
|
statsPort = app.Flag("stats-port",
|
||||||
Short('q').
|
"Which port bind stats to.").
|
||||||
Envar("MTG_STATS_PORT").
|
Short('q').
|
||||||
Default("3129").
|
Envar("MTG_STATS_PORT").
|
||||||
Uint16()
|
Default("3129").
|
||||||
|
Uint16()
|
||||||
|
|
||||||
statsdIP = app.Flag("statsd-ip", "Which IP should we use for working with statsd.").
|
statsdIP = app.Flag("statsd-ip",
|
||||||
Envar("MTG_STATSD_IP").
|
"Which IP should we use for working with statsd.").
|
||||||
String()
|
Envar("MTG_STATSD_IP").
|
||||||
statsdPort = app.Flag("statsd-port", "Which port should we use for working with statsd.").
|
String()
|
||||||
Envar("MTG_STATSD_PORT").
|
statsdPort = app.Flag("statsd-port",
|
||||||
Default("8125").
|
"Which port should we use for working with statsd.").
|
||||||
Uint16()
|
Envar("MTG_STATSD_PORT").
|
||||||
statsdNetwork = app.Flag("statsd-network", "Which network is used to work with statsd. Only 'tcp' and 'udp' are supported.").
|
Default("8125").
|
||||||
Envar("MTG_STATSD_NETWORK").
|
Uint16()
|
||||||
Default("udp").
|
statsdNetwork = app.Flag("statsd-network",
|
||||||
String()
|
"Which network is used to work with statsd. Only 'tcp' and 'udp' are supported.").
|
||||||
statsdPrefix = app.Flag("statsd-prefix", "Which bucket prefix should we use for sending stats to statsd.").
|
Envar("MTG_STATSD_NETWORK").
|
||||||
Envar("MTG_STATSD_PREFIX").
|
Default("udp").
|
||||||
Default("mtg").
|
String()
|
||||||
String()
|
statsdPrefix = app.Flag("statsd-prefix",
|
||||||
statsdTagsFormat = app.Flag("statsd-tags-format", "Which tag format should we use to send stats metrics. Valid options are 'datadog' and 'influxdb'.").
|
"Which bucket prefix should we use for sending stats to statsd.").
|
||||||
Envar("MTG_STATSD_TAGS_FORMAT").
|
Envar("MTG_STATSD_PREFIX").
|
||||||
String()
|
Default("mtg").
|
||||||
statsdTags = app.Flag("statsd-tags", "Tags to use for working with statsd (specified as 'key=value').").
|
String()
|
||||||
Envar("MTG_STATSD_TAGS").
|
statsdTagsFormat = app.Flag("statsd-tags-format",
|
||||||
StringMap()
|
"Which tag format should we use to send stats metrics. Valid options are 'datadog' and 'influxdb'.").
|
||||||
|
Envar("MTG_STATSD_TAGS_FORMAT").
|
||||||
|
String()
|
||||||
|
statsdTags = app.Flag("statsd-tags",
|
||||||
|
"Tags to use for working with statsd (specified as 'key=value').").
|
||||||
|
Envar("MTG_STATSD_TAGS").
|
||||||
|
StringMap()
|
||||||
|
|
||||||
secret = app.Arg("secret", "Secret of this proxy.").Required().String()
|
secret = app.Arg("secret", "Secret of this proxy.").Required().String()
|
||||||
adtag = app.Arg("adtag", "ADTag of the proxy.").String()
|
adtag = app.Arg("adtag", "ADTag of the proxy.").String()
|
||||||
@@ -150,7 +166,8 @@ func main() {
|
|||||||
zap.S().Warnw("Could not fetch time data from NTP")
|
zap.S().Warnw("Could not fetch time data from NTP")
|
||||||
} else {
|
} else {
|
||||||
if diff >= time.Second {
|
if diff >= time.Second {
|
||||||
usage(fmt.Sprintf("You choose to use middle proxy but your clock drift (%s) is bigger than 1 second. Please, sync your time", diff))
|
usage(fmt.Sprintf("You choose to use middle proxy but your clock drift (%s) "+
|
||||||
|
"is bigger than 1 second. Please, sync your time", diff))
|
||||||
}
|
}
|
||||||
go ntp.AutoUpdate()
|
go ntp.AutoUpdate()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,13 +9,13 @@ type proxyRequestFlags uint32
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
proxyRequestFlagsHasAdTag proxyRequestFlags = 0x8
|
proxyRequestFlagsHasAdTag proxyRequestFlags = 0x8
|
||||||
proxyRequestFlagsEncrypted = 0x2
|
proxyRequestFlagsEncrypted proxyRequestFlags = 0x2
|
||||||
proxyRequestFlagsMagic = 0x1000
|
proxyRequestFlagsMagic proxyRequestFlags = 0x1000
|
||||||
proxyRequestFlagsExtMode2 = 0x20000
|
proxyRequestFlagsExtMode2 proxyRequestFlags = 0x20000
|
||||||
proxyRequestFlagsIntermediate = 0x20000000
|
proxyRequestFlagsIntermediate proxyRequestFlags = 0x20000000
|
||||||
proxyRequestFlagsAbdridged = 0x40000000
|
proxyRequestFlagsAbdridged proxyRequestFlags = 0x40000000
|
||||||
proxyRequestFlagsQuickAck = 0x80000000
|
proxyRequestFlagsQuickAck proxyRequestFlags = 0x80000000
|
||||||
proxyRequestFlagsPad = 0x8000000
|
proxyRequestFlagsPad proxyRequestFlags = 0x8000000
|
||||||
)
|
)
|
||||||
|
|
||||||
var proxyRequestFlagsEncryptedPrefix [8]byte
|
var proxyRequestFlagsEncryptedPrefix [8]byte
|
||||||
|
|||||||
@@ -64,7 +64,8 @@ func (r *ProxyRequest) MakeHeader(message []byte) (*bytes.Buffer, fmt.Stringer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewProxyRequest build new ProxyRequest data structure.
|
// NewProxyRequest build new ProxyRequest data structure.
|
||||||
func NewProxyRequest(clientAddr, ownAddr *net.TCPAddr, opts *mtproto.ConnectionOpts, adTag []byte) (*ProxyRequest, error) {
|
func NewProxyRequest(clientAddr, ownAddr *net.TCPAddr,
|
||||||
|
opts *mtproto.ConnectionOpts, adTag []byte) (*ProxyRequest, error) {
|
||||||
flags := proxyRequestFlagsHasAdTag | proxyRequestFlagsMagic | proxyRequestFlagsExtMode2
|
flags := proxyRequestFlagsHasAdTag | proxyRequestFlagsMagic | proxyRequestFlagsExtMode2
|
||||||
|
|
||||||
switch opts.ConnectionType {
|
switch opts.ConnectionType {
|
||||||
|
|||||||
@@ -47,8 +47,8 @@ func TestObfs2Full(t *testing.T) {
|
|||||||
|
|
||||||
clientFrame := generateFrame(mtproto.ConnectionTypeIntermediate)
|
clientFrame := generateFrame(mtproto.ConnectionTypeIntermediate)
|
||||||
clientHasher := sha256.New()
|
clientHasher := sha256.New()
|
||||||
clientHasher.Write(clientFrame.Key())
|
clientHasher.Write(clientFrame.Key()) // nolint: errcheck
|
||||||
clientHasher.Write(secret)
|
clientHasher.Write(secret) // nolint: errcheck
|
||||||
clientKey := clientHasher.Sum(nil)
|
clientKey := clientHasher.Sum(nil)
|
||||||
|
|
||||||
encryptor := makeStreamCipher(clientKey, clientFrame.IV())
|
encryptor := makeStreamCipher(clientKey, clientFrame.IV())
|
||||||
@@ -58,8 +58,8 @@ func TestObfs2Full(t *testing.T) {
|
|||||||
|
|
||||||
invertedClientFrame := clientFrame.Invert()
|
invertedClientFrame := clientFrame.Invert()
|
||||||
clientHasher = sha256.New()
|
clientHasher = sha256.New()
|
||||||
clientHasher.Write(invertedClientFrame.Key())
|
clientHasher.Write(invertedClientFrame.Key()) // nolint: errcheck
|
||||||
clientHasher.Write(secret)
|
clientHasher.Write(secret) // nolint: errcheck
|
||||||
invertedClientKey := clientHasher.Sum(nil)
|
invertedClientKey := clientHasher.Sum(nil)
|
||||||
clientDecryptor := makeStreamCipher(invertedClientKey, invertedClientFrame.IV())
|
clientDecryptor := makeStreamCipher(invertedClientKey, invertedClientFrame.IV())
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -106,7 +106,8 @@ func (p *Proxy) getTelegramConn(opts *mtproto.ConnectionOpts, connID string) (wr
|
|||||||
return packetConn, nil
|
return packetConn, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Proxy) middlePipe(src wrappers.PacketReadCloser, dst io.WriteCloser, wait *sync.WaitGroup, hacks *mtproto.Hacks) {
|
func (p *Proxy) middlePipe(src wrappers.PacketReadCloser, dst io.WriteCloser,
|
||||||
|
wait *sync.WaitGroup, hacks *mtproto.Hacks) {
|
||||||
defer func() {
|
defer func() {
|
||||||
src.Close() // nolint: errcheck
|
src.Close() // nolint: errcheck
|
||||||
dst.Close() // nolint: errcheck
|
dst.Close() // nolint: errcheck
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@ import (
|
|||||||
|
|
||||||
var instance *stats
|
var instance *stats
|
||||||
|
|
||||||
// Start starts new statisitcs server.
|
// Start starts new statistics server.
|
||||||
func Start(conf *config.Config) error {
|
func Start(conf *config.Config) error {
|
||||||
log := zap.S().Named("stats")
|
log := zap.S().Named("stats")
|
||||||
|
|
||||||
|
|||||||
+21
-18
@@ -13,18 +13,18 @@ import (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
directV4Addresses = map[int16][]string{
|
directV4Addresses = map[int16][]string{
|
||||||
0: []string{"149.154.175.50:443"},
|
0: {"149.154.175.50:443"},
|
||||||
1: []string{"149.154.167.51:443"},
|
1: {"149.154.167.51:443"},
|
||||||
2: []string{"149.154.175.100:443"},
|
2: {"149.154.175.100:443"},
|
||||||
3: []string{"149.154.167.91:443"},
|
3: {"149.154.167.91:443"},
|
||||||
4: []string{"149.154.171.5:443"},
|
4: {"149.154.171.5:443"},
|
||||||
}
|
}
|
||||||
directV6Addresses = map[int16][]string{
|
directV6Addresses = map[int16][]string{
|
||||||
0: []string{"[2001:b28:f23d:f001::a]:443"},
|
0: {"[2001:b28:f23d:f001::a]:443"},
|
||||||
1: []string{"[2001:67c:04e8:f002::a]:443"},
|
1: {"[2001:67c:04e8:f002::a]:443"},
|
||||||
2: []string{"[2001:b28:f23d:f003::a]:443"},
|
2: {"[2001:b28:f23d:f003::a]:443"},
|
||||||
3: []string{"[2001:67c:04e8:f004::a]:443"},
|
3: {"[2001:67c:04e8:f004::a]:443"},
|
||||||
4: []string{"[2001:b28:f23f:f005::a]:443"},
|
4: {"[2001:b28:f23f:f005::a]:443"},
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -43,7 +43,8 @@ func (t *directTelegram) Dial(connID string, connOpts *mtproto.ConnectionOpts) (
|
|||||||
return t.baseTelegram.dial(dc-1, connID, connOpts.ConnectionProto)
|
return t.baseTelegram.dial(dc-1, connID, connOpts.ConnectionProto)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *directTelegram) Init(connOpts *mtproto.ConnectionOpts, conn wrappers.StreamReadWriteCloser) (wrappers.Wrap, error) {
|
func (t *directTelegram) Init(connOpts *mtproto.ConnectionOpts,
|
||||||
|
conn wrappers.StreamReadWriteCloser) (wrappers.Wrap, error) {
|
||||||
obfs2, frame := obfuscated2.MakeTelegramObfuscated2Frame(connOpts)
|
obfs2, frame := obfuscated2.MakeTelegramObfuscated2Frame(connOpts)
|
||||||
|
|
||||||
if _, err := conn.Write(frame); err != nil {
|
if _, err := conn.Write(frame); err != nil {
|
||||||
@@ -56,12 +57,14 @@ func (t *directTelegram) Init(connOpts *mtproto.ConnectionOpts, conn wrappers.St
|
|||||||
// NewDirectTelegram returns Telegram instance which connects directly
|
// NewDirectTelegram returns Telegram instance which connects directly
|
||||||
// to Telegram bypassing middleproxies.
|
// to Telegram bypassing middleproxies.
|
||||||
func NewDirectTelegram(conf *config.Config) Telegram {
|
func NewDirectTelegram(conf *config.Config) Telegram {
|
||||||
return &directTelegram{baseTelegram{
|
return &directTelegram{
|
||||||
dialer: tgDialer{
|
baseTelegram: baseTelegram{
|
||||||
Dialer: net.Dialer{Timeout: telegramDialTimeout},
|
dialer: tgDialer{
|
||||||
conf: conf,
|
Dialer: net.Dialer{Timeout: telegramDialTimeout},
|
||||||
|
conf: conf,
|
||||||
|
},
|
||||||
|
v4Addresses: directV4Addresses,
|
||||||
|
v6Addresses: directV6Addresses,
|
||||||
},
|
},
|
||||||
v4Addresses: directV4Addresses,
|
}
|
||||||
v6Addresses: directV6Addresses,
|
|
||||||
}}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-3
@@ -20,7 +20,8 @@ type middleTelegram struct {
|
|||||||
conf *config.Config
|
conf *config.Config
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *middleTelegram) Init(connOpts *mtproto.ConnectionOpts, conn wrappers.StreamReadWriteCloser) (wrappers.Wrap, error) {
|
func (t *middleTelegram) Init(connOpts *mtproto.ConnectionOpts,
|
||||||
|
conn wrappers.StreamReadWriteCloser) (wrappers.Wrap, error) {
|
||||||
rpcNonceConn := wrappers.NewMTProtoFrame(conn, rpc.SeqNoNonce)
|
rpcNonceConn := wrappers.NewMTProtoFrame(conn, rpc.SeqNoNonce)
|
||||||
|
|
||||||
rpcNonceReq, err := t.sendRPCNonceRequest(rpcNonceConn)
|
rpcNonceReq, err := t.sendRPCNonceRequest(rpcNonceConn)
|
||||||
@@ -65,7 +66,8 @@ func (t *middleTelegram) sendRPCNonceRequest(conn io.Writer) (*rpc.NonceRequest,
|
|||||||
return rpcNonceReq, nil
|
return rpcNonceReq, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *middleTelegram) receiveRPCNonceResponse(conn wrappers.PacketReader, req *rpc.NonceRequest) (*rpc.NonceResponse, error) {
|
func (t *middleTelegram) receiveRPCNonceResponse(conn wrappers.PacketReader,
|
||||||
|
req *rpc.NonceRequest) (*rpc.NonceResponse, error) {
|
||||||
packet, err := conn.Read()
|
packet, err := conn.Read()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Annotate(err, "Cannot read RPC nonce response")
|
return nil, errors.Annotate(err, "Cannot read RPC nonce response")
|
||||||
@@ -91,7 +93,8 @@ func (t *middleTelegram) sendRPCHandshakeRequest(conn io.Writer) (*rpc.Handshake
|
|||||||
return req, nil
|
return req, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *middleTelegram) receiveRPCHandshakeResponse(conn wrappers.PacketReader, req *rpc.HandshakeRequest) (*rpc.HandshakeResponse, error) {
|
func (t *middleTelegram) receiveRPCHandshakeResponse(conn wrappers.PacketReader,
|
||||||
|
req *rpc.HandshakeRequest) (*rpc.HandshakeResponse, error) {
|
||||||
packet, err := conn.Read()
|
packet, err := conn.Read()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Annotate(err, "Cannot read RPC handshake response")
|
return nil, errors.Annotate(err, "Cannot read RPC handshake response")
|
||||||
|
|||||||
@@ -38,7 +38,8 @@ type middleTelegramCaller struct {
|
|||||||
httpClient *http.Client
|
httpClient *http.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *middleTelegramCaller) Dial(connID string, connOpts *mtproto.ConnectionOpts) (wrappers.StreamReadWriteCloser, error) {
|
func (t *middleTelegramCaller) Dial(connID string,
|
||||||
|
connOpts *mtproto.ConnectionOpts) (wrappers.StreamReadWriteCloser, error) {
|
||||||
dc := connOpts.DC
|
dc := connOpts.DC
|
||||||
if dc == 0 {
|
if dc == 0 {
|
||||||
dc = 1
|
dc = 1
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ type baseTelegram struct {
|
|||||||
v6Addresses map[int16][]string
|
v6Addresses map[int16][]string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *baseTelegram) dial(dcIdx int16, connID string, proto mtproto.ConnectionProtocol) (wrappers.StreamReadWriteCloser, error) {
|
func (b *baseTelegram) dial(dcIdx int16, connID string,
|
||||||
|
proto mtproto.ConnectionProtocol) (wrappers.StreamReadWriteCloser, error) {
|
||||||
addrs := make([]string, 2)
|
addrs := make([]string, 2)
|
||||||
|
|
||||||
if proto&mtproto.ConnectionProtocolIPv6 != 0 {
|
if proto&mtproto.ConnectionProtocolIPv6 != 0 {
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/9seconds/mtg/stats"
|
"github.com/9seconds/mtg/stats"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ConnPurpose is intented to be identifier of connection purpose. We
|
// ConnPurpose is intended to be identifier of connection purpose. We
|
||||||
// sometimes want to treat client/telegram connection differently (for
|
// sometimes want to treat client/telegram connection differently (for
|
||||||
// logging for example).
|
// logging for example).
|
||||||
type ConnPurpose uint8
|
type ConnPurpose uint8
|
||||||
|
|||||||
@@ -24,7 +24,8 @@ var emptyIP = [4]byte{0x00, 0x00, 0x00, 0x00}
|
|||||||
|
|
||||||
// NewMiddleProxyCipher creates new block cipher to proxy<->telegram
|
// NewMiddleProxyCipher creates new block cipher to proxy<->telegram
|
||||||
// connection.
|
// connection.
|
||||||
func NewMiddleProxyCipher(conn StreamReadWriteCloser, req *rpc.NonceRequest, resp *rpc.NonceResponse, secret []byte) StreamReadWriteCloser {
|
func NewMiddleProxyCipher(conn StreamReadWriteCloser,
|
||||||
|
req *rpc.NonceRequest, resp *rpc.NonceResponse, secret []byte) StreamReadWriteCloser {
|
||||||
localAddr := conn.LocalAddr()
|
localAddr := conn.LocalAddr()
|
||||||
remoteAddr := conn.RemoteAddr()
|
remoteAddr := conn.RemoteAddr()
|
||||||
|
|
||||||
@@ -37,7 +38,8 @@ func NewMiddleProxyCipher(conn StreamReadWriteCloser, req *rpc.NonceRequest, res
|
|||||||
return NewBlockCipher(conn, enc, dec)
|
return NewBlockCipher(conn, enc, dec)
|
||||||
}
|
}
|
||||||
|
|
||||||
func deriveKeys(purpose cipherPurpose, req *rpc.NonceRequest, resp *rpc.NonceResponse, client *net.TCPAddr, remote *net.TCPAddr, secret []byte) ([]byte, []byte) {
|
func deriveKeys(purpose cipherPurpose, req *rpc.NonceRequest, resp *rpc.NonceResponse,
|
||||||
|
client, remote *net.TCPAddr, secret []byte) ([]byte, []byte) {
|
||||||
message := bytes.Buffer{}
|
message := bytes.Buffer{}
|
||||||
message.Write(resp.Nonce[:])
|
message.Write(resp.Nonce[:])
|
||||||
message.Write(req.Nonce[:])
|
message.Write(req.Nonce[:])
|
||||||
|
|||||||
@@ -61,7 +61,8 @@ func (m *MTProtoFrame) Read() ([]byte, error) { // nolint: gocyclo
|
|||||||
"messageLength", messageLength,
|
"messageLength", messageLength,
|
||||||
"sequence_number", m.readSeqNo,
|
"sequence_number", m.readSeqNo,
|
||||||
)
|
)
|
||||||
if messageLength%4 != 0 || messageLength < mtprotoFrameMinMessageLength || messageLength > mtprotoFrameMaxMessageLength {
|
if messageLength%4 != 0 || messageLength < mtprotoFrameMinMessageLength ||
|
||||||
|
messageLength > mtprotoFrameMaxMessageLength {
|
||||||
return nil, errors.Errorf("Incorrect frame message length %d", messageLength)
|
return nil, errors.Errorf("Incorrect frame message length %d", messageLength)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ func (m *MTProtoProxy) Read() ([]byte, error) {
|
|||||||
case bytes.Equal(tag, rpc.TagSimpleAck):
|
case bytes.Equal(tag, rpc.TagSimpleAck):
|
||||||
return m.readSimpleAck(packet)
|
return m.readSimpleAck(packet)
|
||||||
case bytes.Equal(tag, rpc.TagCloseExt):
|
case bytes.Equal(tag, rpc.TagCloseExt):
|
||||||
return m.readCloseExt(packet)
|
return m.readCloseExt()
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, errors.Errorf("Unknown RPC answer %v", tag)
|
return nil, errors.Errorf("Unknown RPC answer %v", tag)
|
||||||
@@ -91,7 +91,7 @@ func (m *MTProtoProxy) readSimpleAck(data []byte) ([]byte, error) {
|
|||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MTProtoProxy) readCloseExt(data []byte) ([]byte, error) {
|
func (m *MTProtoProxy) readCloseExt() ([]byte, error) {
|
||||||
m.logger.Debugw("Read RPC_CLOSE_EXT", "counter", m.readCounter)
|
m.logger.Debugw("Read RPC_CLOSE_EXT", "counter", m.readCounter)
|
||||||
|
|
||||||
return nil, errors.New("Connection has been closed remotely by RPC call")
|
return nil, errors.New("Connection has been closed remotely by RPC call")
|
||||||
@@ -150,7 +150,8 @@ func (m *MTProtoProxy) Close() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewMTProtoProxy creates new RPC wrapper.
|
// NewMTProtoProxy creates new RPC wrapper.
|
||||||
func NewMTProtoProxy(conn PacketReadWriteCloser, connOpts *mtproto.ConnectionOpts, adTag []byte) (PacketReadWriteCloser, error) {
|
func NewMTProtoProxy(conn PacketReadWriteCloser, connOpts *mtproto.ConnectionOpts,
|
||||||
|
adTag []byte) (PacketReadWriteCloser, error) {
|
||||||
req, err := rpc.NewProxyRequest(connOpts.ClientAddr, conn.LocalAddr(), connOpts, adTag)
|
req, err := rpc.NewProxyRequest(connOpts.ClientAddr, conn.LocalAddr(), connOpts, adTag)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Annotate(err, "Cannot create new RPC proxy request")
|
return nil, errors.Annotate(err, "Cannot create new RPC proxy request")
|
||||||
|
|||||||
Reference in New Issue
Block a user