mirror of
https://github.com/buger/goreplay.git
synced 2024-04-21 12:32:02 +00:00
Issues is that Go built-in net.Interfaces function in newer Windows versions return wrong interface names, which libpcap can't consume. Now we use pcap.FindDevices instead of net.Interfaces. See this Article for deep understanding of the issue https://haydz.github.io/2020/07/06/Go-Windows-NIC.html Additionally, found a bug causing big memory allocations, for large requests, when we perform check if messages finished or not. Because of this bug chunked body encoding check was not working properly. Was not caught in tests, because test was working on packet array level, and this issue happens when dealing with TCP message object. Additionally, added a small fix for windows Makefile task, it now generates proper file name.
161 lines
5.2 KiB
Makefile
161 lines
5.2 KiB
Makefile
SOURCE = $(shell ls -1 *.go | grep -v _test.go)
|
|
SOURCE_PATH = /go/src/github.com/buger/goreplay/
|
|
PORT = 8000
|
|
FADDR = :8000
|
|
CONTAINER=gor
|
|
PREFIX=
|
|
RUN = docker run -v `pwd`:$(SOURCE_PATH) -e AWS_ACCESS_KEY_ID=$(AWS_ACCESS_KEY_ID) -e AWS_SECRET_ACCESS_KEY=$(AWS_SECRET_ACCESS_KEY) -p 0.0.0.0:$(PORT):$(PORT) -t -i $(CONTAINER)
|
|
BENCHMARK = BenchmarkRAWInput
|
|
TEST = TestRawListenerBench
|
|
BIN_NAME = gor
|
|
VERSION = DEV-$(shell date +%s)
|
|
LDFLAGS = -ldflags "-X main.VERSION=$(VERSION)$(PREFIX) -extldflags \"-static\" -X main.DEMO=$(DEMO)"
|
|
MAC_LDFLAGS = -ldflags "-X main.VERSION=$(VERSION)$(PREFIX) -X main.DEMO=$(DEMO)"
|
|
FADDR = ":8000"
|
|
|
|
FPMCOMMON= \
|
|
--name goreplay \
|
|
--description "GoReplay is an open-source network monitoring tool which can record your live traffic, and use it for shadowing, load testing, monitoring and detailed analysis." \
|
|
-v $(VERSION) \
|
|
--vendor "Leonid Bugaev" \
|
|
-m "<support@goreplay.org>" \
|
|
--url "https://goreplay.org" \
|
|
-s dir \
|
|
-C /tmp/gor-build \
|
|
|
|
release: release-x64 release-mac release-windows
|
|
|
|
release-bin:
|
|
docker run -v `pwd`:$(SOURCE_PATH) -t --env GOOS=linux --env GOARCH=amd64 -i $(CONTAINER) go build -o $(BIN_NAME) -tags netgo $(LDFLAGS)
|
|
|
|
release-bin-mac:
|
|
GOOS=darwin go build -o $(BIN_NAME) $(MAC_LDFLAGS)
|
|
|
|
release-x64:
|
|
docker run -v `pwd`:$(SOURCE_PATH) -t --env GOOS=linux --env GOARCH=amd64 -i $(CONTAINER) go build -o $(BIN_NAME) -tags netgo $(LDFLAGS)
|
|
tar -czf gor_$(VERSION)$(PREFIX)_x64.tar.gz $(BIN_NAME)
|
|
mkdir -p /tmp/gor-build
|
|
mv ./$(BIN_NAME) /tmp/gor-build/$(BIN_NAME)
|
|
cd /tmp/gor-build
|
|
rm -f goreplay_$(VERSION)_amd64.deb
|
|
rm -f goreplay-$(VERSION)-1.x86_64.rpm
|
|
fpm $(FPMCOMMON) -a amd64 -t deb ./=/usr/local/bin
|
|
fpm $(FPMCOMMON) -a amd64 -t rpm ./=/usr/local/bin
|
|
rm -rf /tmp/gor-build
|
|
|
|
release-x86:
|
|
docker run -v `pwd`:$(SOURCE_PATH) -t --env GOOS=linux --env GOARCH=386 -i $(CONTAINER) go build -o $(BIN_NAME) -tags netgo $(LDFLAGS)
|
|
tar -czf gor_$(VERSION)$(PREFIX)_x86.tar.gz $(BIN_NAME)
|
|
rm $(BIN_NAME)
|
|
|
|
release-mac:
|
|
go build -o $(BIN_NAME) $(MAC_LDFLAGS)
|
|
tar -czf gor_$(VERSION)$(PREFIX)_mac.tar.gz $(BIN_NAME)
|
|
mkdir -p /tmp/gor-build
|
|
mv ./$(BIN_NAME) /tmp/gor-build/$(BIN_NAME)
|
|
cd /tmp/gor-build
|
|
rm -f goreplay-$(VERSION).pkg
|
|
fpm $(FPMCOMMON) -a amd64 -t osxpkg ./=/usr/local/bin
|
|
rm -rf /tmp/gor-build
|
|
|
|
release-windows:
|
|
docker run -it --rm \
|
|
-v `pwd`:/go/src/github.com/buger/goreplay \
|
|
-w /go/src/github.com/buger/goreplay \
|
|
-e CGO_ENABLED=1 \
|
|
docker.elastic.co/beats-dev/golang-crossbuild:1.16.4-main \
|
|
--build-cmd "make VERSION=$(VERSION) build" \
|
|
-p "windows/amd64"
|
|
mv ./gor ./gor.exe
|
|
zip gor-$(VERSION)$(PREFIX)_windows.zip ./gor.exe
|
|
rm -rf ./gor.exe
|
|
|
|
build:
|
|
go build -o $(BIN_NAME) $(LDFLAGS)
|
|
|
|
install:
|
|
go install $(MAC_LDFLAGS)
|
|
|
|
build-env:
|
|
docker build -t $(CONTAINER) -f Dockerfile.dev .
|
|
|
|
profile:
|
|
go build && ./$(BIN_NAME) --output-http="http://localhost:9000" --input-dummy 0 --input-raw :9000 --input-http :9000 --memprofile=./mem.out --cpuprofile=./cpu.out --stats --output-http-stats --output-http-timeout 100ms
|
|
|
|
lint:
|
|
$(RUN) golint $(PKG)
|
|
|
|
race:
|
|
$(RUN) go test ./... $(ARGS) -v -race -timeout 15s
|
|
|
|
test:
|
|
$(RUN) go test ./. -timeout 120s $(LDFLAGS) $(ARGS) -v
|
|
|
|
test_all:
|
|
$(RUN) go test ./... -timeout 120s $(LDFLAGS) $(ARGS) -v
|
|
|
|
testone:
|
|
$(RUN) go test ./. -timeout 60s $(LDFLAGS) -run $(TEST) $(ARGS) -v
|
|
|
|
cover:
|
|
$(RUN) go test $(ARGS) -race -v -timeout 15s -coverprofile=coverage.out
|
|
go tool cover -html=coverage.out
|
|
|
|
fmt:
|
|
$(RUN) gofmt -w -s ./..
|
|
|
|
vet:
|
|
$(RUN) go vet
|
|
|
|
bench:
|
|
$(RUN) go test $(LDFLAGS) -v -run NOT_EXISTING -bench $(BENCHMARK) -benchtime 5s
|
|
|
|
profile_test:
|
|
$(RUN) go test $(LDFLAGS) -run $(TEST) ./capture/. $(ARGS) -memprofile mem.mprof -cpuprofile cpu.out
|
|
$(RUN) go test $(LDFLAGS) -run $(TEST) ./capture/. $(ARGS) -c
|
|
|
|
# Used mainly for debugging, because docker container do not have access to parent machine ports
|
|
run:
|
|
$(RUN) go run $(LDFLAGS) $(SOURCE) --input-dummy=0 --output-http="http://localhost:9000" --input-raw-track-response --input-raw 127.0.0.1:9000 --verbose 0 --middleware "./examples/middleware/echo.sh" --output-file requests.gor
|
|
|
|
run-2:
|
|
$(RUN) go run $(LDFLAGS) $(SOURCE) --input-raw :8000 --input-raw-bpf-filter "dst port 8000" --output-stdout --output-http "http://localhost:8000" --input-dummy=0
|
|
|
|
run-3:
|
|
sudo -E go run $(SOURCE) --input-tcp :27001 --output-stdout
|
|
|
|
run-arg:
|
|
sudo -E go run $(SOURCE) $(ARGS)
|
|
|
|
file-server:
|
|
go run $(SOURCE) file-server $(FADDR)
|
|
|
|
readpcap:
|
|
go run $(SOURCE) --input-raw $(FILE) --input-raw-track-response --input-raw-engine pcap_file --output-stdout
|
|
|
|
record:
|
|
$(RUN) go run $(SOURCE) --input-dummy=0 --output-file=requests.gor --verbose --debug
|
|
|
|
replay:
|
|
$(RUN) go run $(SOURCE) --input-file=requests.bin --output-tcp=:9000 --verbose -h
|
|
|
|
bash:
|
|
$(RUN) /bin/bash
|
|
|
|
|
|
FPMCOMMON= \
|
|
--name gor \
|
|
--description "GoReplay is an open-source network monitoring tool which can record your live traffic, and use it for shadowing, load testing, monitoring and detailed analysis." \
|
|
-v $(VERSION) \
|
|
--vendor "Leonid Bugaev" \
|
|
-m "<support@goreplay.org>" \
|
|
--url "https://goreplay.org" \
|
|
-s dir \
|
|
-C /tmp/gor-build \
|
|
|
|
build_packages:
|
|
mkdir -p /tmp/gor-build
|
|
go build -i -o /tmp/gor-build/$(BIN_NAME)
|
|
fpm $(FPMCOMMON) -a amd64 -t deb ./=/usr/local/bin
|
|
fpm $(FPMCOMMON) -a amd64 -t rpm ./=/usr/local/bin
|