From d87987d54ab5df4a861785eedbe994d716d27f46 Mon Sep 17 00:00:00 2001 From: Chen Yufei Date: Mon, 18 Feb 2013 14:06:34 +0800 Subject: [PATCH 01/10] Add script to build client. --- build.sh | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100755 build.sh diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..87763bb --- /dev/null +++ b/build.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +version=`grep 'const version = ' ./shadowsocks/util.go | sed -e 's/.*= //' | sed -e 's/"//g'` +echo "creating shadowsocks binary version $version" + +export CGO_ENABLED=0 + +cur=`pwd` +bindir=$cur/bin +mkdir -p $bindir + +build() { + local name + local GOOS + local GOARCH + + prog=shadowsocks-$4 + pushd cmd/$prog + name=$prog-$3-$version + echo "building $name" + GOOS=$1 GOARCH=$2 go build -a || exit 1 + if [[ $1 == "windows" ]]; then + zip $name.zip $prog.exe + rm -f $prog.exe + mv $name.zip $bindir + else + mv $prog $name + gzip -f $name + mv $name.gz $bindir + fi + popd +} + +build darwin amd64 mac64 local +build linux amd64 linux64 local +build linux 386 linux32 local +build windows amd64 win64 local +build windows 386 win32 local + +#build darwin amd64 mac64 server +#build linux amd64 linux64 server +#build linux 386 linux32 server +#build windows amd64 win64 server +#build windows 386 win32 server + From 029685b90496f63f6d306d9c6b470abc1868b9dc Mon Sep 17 00:00:00 2001 From: Chen Yufei Date: Thu, 28 Feb 2013 23:01:14 +0800 Subject: [PATCH 02/10] Simplify travis config. --- .travis.yml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3e01f13..5e9fefa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,9 @@ language: go install: - - mkdir -p $GOPATH/src/github.com/shadowsocks/shadowsocks-go/shadowsocks - - mv * $GOPATH/src/github.com/shadowsocks/shadowsocks-go - - pushd $GOPATH/src/github.com/shadowsocks/shadowsocks-go - - go install ./cmd/shadowsocks-local - - go install ./cmd/shadowsocks-server - - popd + - go get github.com/shadowsocks/shadowsocks-go/cmd/shadowsocks-server + - go get github.com/shadowsocks/shadowsocks-go/cmd/shadowsocks-local script: - - pushd $GOPATH/src/github.com/shadowsocks/shadowsocks-go - - PATH=$PATH:$GOPATH/bin/ bash -x ./testscript/test.sh + - pushd shadowsocks + - go test -v - popd - + - PATH=$PATH:$GOPATH/bin/ bash -x ./testscript/test.sh From eb6215506ccaaefb813812f424beb9ae9bdea347 Mon Sep 17 00:00:00 2001 From: Chen Yufei Date: Thu, 28 Feb 2013 23:14:53 +0800 Subject: [PATCH 03/10] Fix test. --- shadowsocks/encrypt.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/shadowsocks/encrypt.go b/shadowsocks/encrypt.go index ad3b0ce..960436d 100644 --- a/shadowsocks/encrypt.go +++ b/shadowsocks/encrypt.go @@ -8,6 +8,8 @@ import ( "errors" ) +var errEmptyKey = errors.New("empty key") + type Cipher interface { // Some ciphers maintains context (e.g. RC4), which means different // connections need to use their own ciphers. Copy() will create an copy @@ -27,6 +29,9 @@ type TableCipher struct { // Creates a new table based cipher. err is always nil. func NewTableCipher(key string) (c Cipher, err error) { + if key == "" { + return nil, errEmptyKey + } const tbl_size = 256 tbl := TableCipher{ make([]byte, tbl_size), @@ -83,6 +88,9 @@ type RC4Cipher struct { } func NewRC4Cipher(key string) (c Cipher, err error) { + if key == "" { + return nil, errEmptyKey + } h := md5.New() h.Write([]byte(key)) enc, err := rc4.NewCipher(h.Sum(nil)) From c34a6558830379323ca54fe1a700a61ffd7d36f7 Mon Sep 17 00:00:00 2001 From: Chen Yufei Date: Thu, 28 Feb 2013 23:18:22 +0800 Subject: [PATCH 04/10] Use leaky buffer to when piping data. --- shadowsocks/pipe.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/shadowsocks/pipe.go b/shadowsocks/pipe.go index f22f35f..f41ce8f 100644 --- a/shadowsocks/pipe.go +++ b/shadowsocks/pipe.go @@ -2,6 +2,7 @@ package shadowsocks import ( // "io" + "github.com/cyfdecyf/leakybuf" "net" "time" ) @@ -17,10 +18,16 @@ func SetReadTimeout(c net.Conn) { } } +const bufSize = 4096 +const nBuf = 2048 + +var pipeBuf = leakybuf.NewLeakyBuf(nBuf, bufSize) + // PipeThenClose copies data from src to dst, closes dst when done. func PipeThenClose(src, dst net.Conn, timeoutOpt int) { defer dst.Close() - buf := make([]byte, 4096) + buf := pipeBuf.Get() + defer pipeBuf.Put(buf) for { if timeoutOpt == SET_TIMEOUT { SetReadTimeout(src) From 8f94dcf194b89a547849a3a61d7e8055c1400d30 Mon Sep 17 00:00:00 2001 From: Chen Yufei Date: Thu, 28 Feb 2013 23:22:40 +0800 Subject: [PATCH 05/10] go get leakybuf in travis config. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 5e9fefa..a6b5e07 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: go install: + - go get github.com/cyfdecyf/leakybuf - go get github.com/shadowsocks/shadowsocks-go/cmd/shadowsocks-server - go get github.com/shadowsocks/shadowsocks-go/cmd/shadowsocks-local script: From 441beebb4e5a887d2dc0412f49df8637d5053709 Mon Sep 17 00:00:00 2001 From: Chen Yufei Date: Thu, 28 Feb 2013 23:32:34 +0800 Subject: [PATCH 06/10] Don't use atomic insn. to count concurrent client connections. --- cmd/shadowsocks-server/server.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cmd/shadowsocks-server/server.go b/cmd/shadowsocks-server/server.go index 7fe371d..0d56dc8 100644 --- a/cmd/shadowsocks-server/server.go +++ b/cmd/shadowsocks-server/server.go @@ -14,7 +14,6 @@ import ( "runtime" "strconv" "sync" - "sync/atomic" "syscall" ) @@ -83,13 +82,13 @@ func getRequest(conn *ss.Conn) (host string, extra []byte, err error) { const logCntDelta = 100 -var connCnt int32 -var nextLogConnCnt int32 = logCntDelta +var connCnt int +var nextLogConnCnt int = logCntDelta func handleConnection(conn *ss.Conn) { var host string - atomic.AddInt32(&connCnt, 1) + connCnt++ // this maybe not accurate, but should be enough if connCnt-nextLogConnCnt >= 0 { // XXX There's no xadd in the atomic package, so it's difficult to log // the message only once with low cost. Also note nextLogConnCnt maybe @@ -108,7 +107,7 @@ func handleConnection(conn *ss.Conn) { if debug { debug.Printf("closed pipe %s<->%s\n", conn.RemoteAddr(), host) } - atomic.AddInt32(&connCnt, -1) + connCnt-- if !closed { conn.Close() } From 569fee355c37edad8b5bdd21d5592ec0a8bf8bff Mon Sep 17 00:00:00 2001 From: Chen Yufei Date: Fri, 1 Mar 2013 09:32:52 +0800 Subject: [PATCH 07/10] Revert "Simplify travis config." --- .travis.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index a6b5e07..e312949 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,13 @@ language: go install: - go get github.com/cyfdecyf/leakybuf - - go get github.com/shadowsocks/shadowsocks-go/cmd/shadowsocks-server - - go get github.com/shadowsocks/shadowsocks-go/cmd/shadowsocks-local -script: - - pushd shadowsocks - - go test -v + - mkdir -p $GOPATH/src/github.com/shadowsocks/shadowsocks-go/shadowsocks + - mv * $GOPATH/src/github.com/shadowsocks/shadowsocks-go + - pushd $GOPATH/src/github.com/shadowsocks/shadowsocks-go + - go install ./cmd/shadowsocks-local + - go install ./cmd/shadowsocks-server - popd +script: + - pushd $GOPATH/src/github.com/shadowsocks/shadowsocks-go - PATH=$PATH:$GOPATH/bin/ bash -x ./testscript/test.sh + - popd From 1d34853e2eaf60d786da4766f59b79265d3f7f08 Mon Sep 17 00:00:00 2001 From: Chen Yufei Date: Mon, 4 Mar 2013 21:50:11 +0800 Subject: [PATCH 08/10] Move all scripts into script directory. --- .travis.yml | 2 +- build.sh => script/build.sh | 4 +++- createdeb.sh => script/createdeb.sh | 2 ++ {testscript => script}/curl.sh | 0 {testscript => script}/test.sh | 0 win32build.bat => script/win32build.bat | 0 6 files changed, 6 insertions(+), 2 deletions(-) rename build.sh => script/build.sh (94%) rename createdeb.sh => script/createdeb.sh (94%) rename {testscript => script}/curl.sh (100%) rename {testscript => script}/test.sh (100%) rename win32build.bat => script/win32build.bat (100%) diff --git a/.travis.yml b/.travis.yml index e312949..4fb4081 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,5 +9,5 @@ install: - popd script: - pushd $GOPATH/src/github.com/shadowsocks/shadowsocks-go - - PATH=$PATH:$GOPATH/bin/ bash -x ./testscript/test.sh + - PATH=$PATH:$GOPATH/bin/ bash -x ./script/test.sh - popd diff --git a/build.sh b/script/build.sh similarity index 94% rename from build.sh rename to script/build.sh index 87763bb..21ba747 100755 --- a/build.sh +++ b/script/build.sh @@ -1,5 +1,7 @@ #!/bin/bash +cd "$( dirname "${BASH_SOURCE[0]}" )/.." + version=`grep 'const version = ' ./shadowsocks/util.go | sed -e 's/.*= //' | sed -e 's/"//g'` echo "creating shadowsocks binary version $version" @@ -23,7 +25,7 @@ build() { zip $name.zip $prog.exe rm -f $prog.exe mv $name.zip $bindir - else + else mv $prog $name gzip -f $name mv $name.gz $bindir diff --git a/createdeb.sh b/script/createdeb.sh similarity index 94% rename from createdeb.sh rename to script/createdeb.sh index 8ccd88a..cec6225 100755 --- a/createdeb.sh +++ b/script/createdeb.sh @@ -1,5 +1,7 @@ #!/bin/bash +cd "$( dirname "${BASH_SOURCE[0]}" )/.." + if [[ $# != 1 ]]; then echo "$0 " exit 1 diff --git a/testscript/curl.sh b/script/curl.sh similarity index 100% rename from testscript/curl.sh rename to script/curl.sh diff --git a/testscript/test.sh b/script/test.sh similarity index 100% rename from testscript/test.sh rename to script/test.sh diff --git a/win32build.bat b/script/win32build.bat similarity index 100% rename from win32build.bat rename to script/win32build.bat From d0ac7536cde2f559f653fcdd419c888fe05f7cc2 Mon Sep 17 00:00:00 2001 From: Chen Yufei Date: Mon, 4 Mar 2013 22:04:13 +0800 Subject: [PATCH 09/10] Add shadowsocks-tray.exe (modified from goagent.exe) --- script/build.sh | 9 ++++++--- script/shadowsocks-tray.exe | Bin 0 -> 57344 bytes 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100755 script/shadowsocks-tray.exe diff --git a/script/build.sh b/script/build.sh index 21ba747..c616c6a 100755 --- a/script/build.sh +++ b/script/build.sh @@ -7,8 +7,8 @@ echo "creating shadowsocks binary version $version" export CGO_ENABLED=0 -cur=`pwd` -bindir=$cur/bin +ROOT=`pwd` +bindir=$ROOT/bin mkdir -p $bindir build() { @@ -22,9 +22,12 @@ build() { echo "building $name" GOOS=$1 GOARCH=$2 go build -a || exit 1 if [[ $1 == "windows" ]]; then - zip $name.zip $prog.exe + mv $prog.exe $ROOT/script/ + pushd $ROOT/script/ + zip $name.zip $prog.exe shadowsocks-tray.exe rm -f $prog.exe mv $name.zip $bindir + popd else mv $prog $name gzip -f $name diff --git a/script/shadowsocks-tray.exe b/script/shadowsocks-tray.exe new file mode 100755 index 0000000000000000000000000000000000000000..bcf285f90004a6eedd96c7e01f8c062b760408bd GIT binary patch literal 57344 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 F{ug5JPig=F literal 0 HcmV?d00001 From 979eefc575922e446fd7e131b19682a1bc0bc660 Mon Sep 17 00:00:00 2001 From: Chen Yufei Date: Mon, 4 Mar 2013 22:29:53 +0800 Subject: [PATCH 10/10] Bump version to 0.6.1 --- CHANGELOG | 5 +++++ README.md | 2 +- deb/DEBIAN/control | 2 +- script/createdeb.sh | 4 +++- shadowsocks/util.go | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 1084747..f87e98e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +0.6.1 (2013-03-04) + * Small performance improvement + * For windows: provide shadowsocks-tray.exe to hide shadowsocks-local.exe in + system tray. (Thanks to phuslu's taskbar.) + 0.6 (2013-01-23) * Generate ciphers on demand (encryption table cache is removed) diff --git a/README.md b/README.md index 7f3bdd0..8a88392 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # shadowsocks-go -Current version: 0.6 [![Build Status](https://travis-ci.org/shadowsocks/shadowsocks-go.png)](https://travis-ci.org/shadowsocks/shadowsocks-go) +Current version: 0.6.1 [![Build Status](https://travis-ci.org/shadowsocks/shadowsocks-go.png)](https://travis-ci.org/shadowsocks/shadowsocks-go) shadowsocks-go is a lightweight tunnel proxy which can help you get through firewalls. It is a port of [shadowsocks](https://github.com/clowwindy/shadowsocks). diff --git a/deb/DEBIAN/control b/deb/DEBIAN/control index b7617a4..ce9cae2 100644 --- a/deb/DEBIAN/control +++ b/deb/DEBIAN/control @@ -1,5 +1,5 @@ Package: shadowsocks-go -Version: 0.6-1 +Version: 0.6.1-1 Section: net Priority: optional Architecture: any diff --git a/script/createdeb.sh b/script/createdeb.sh index cec6225..9818389 100755 --- a/script/createdeb.sh +++ b/script/createdeb.sh @@ -1,6 +1,7 @@ #!/bin/bash cd "$( dirname "${BASH_SOURCE[0]}" )/.." +ver=$(awk '/\tconst version =/ { print $4 }' shadowsocks/util.go | sed -e 's/"//g') if [[ $# != 1 ]]; then echo "$0 " @@ -30,7 +31,7 @@ go build -a -v || exit 1 popd # create debian package -DEBDIR=shadowsocks-go_0.6-1-$arch +DEBDIR=shadowsocks-go_$ver-1-$arch rm -rf $DEBDIR cp -r deb $DEBDIR @@ -38,6 +39,7 @@ sed -i -e "s/^Architecture.*$/Architecture: $arch/" $DEBDIR/DEBIAN/control || ex mkdir -p $DEBDIR/usr/bin cp cmd/shadowsocks-server/shadowsocks-server $DEBDIR/usr/bin/shadowsocks +rm -f cmd/shadowsocks-server/shadowsocks-server fakeroot dpkg-deb --build $DEBDIR diff --git a/shadowsocks/util.go b/shadowsocks/util.go index 04c7f82..95ba7e1 100644 --- a/shadowsocks/util.go +++ b/shadowsocks/util.go @@ -7,7 +7,7 @@ import ( ) func PrintVersion() { - const version = "0.6" + const version = "0.6.1" fmt.Println("shadowsocks-go version", version) }