diff --git a/README.md b/README.md index 473e84f..44b5ad7 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,13 @@ shadowsocks manyuser branch =========== +Which people need this branch +------------------ +1.share shadowsocks server + +2.create multi server by shadowsocks + +3.manage server (transfer / account) + Install ------- install MySQL 5.x.x @@ -8,7 +16,7 @@ install MySQL 5.x.x create a database named `shadowsocks` -import `shadowsocks.sql` +import `shadowsocks.sql` into `shadowsocks` edit Config.py Example: @@ -33,13 +41,18 @@ Example: db start server at port [%s] pass [%s] -User table colum +Database user table column ------------------ `passwd` server pass + `port` server port + `t` last keepalive time + `u` upload transfer + `d` download transer + `transfer_enable` if u + d > transfer_enable this server will be stop (db_transfer.py del_server_out_of_bound_safe) Manage socket @@ -49,9 +62,18 @@ Manage server work in UDP at `MANAGE_BIND_IP` `MANAGE_PORT` use `MANAGE_PASS:port:passwd:0` to del a server at port `port` use `MANAGE_PASS:port:passwd:1` to run a server at port `port` password is `passwd` -eg: - udpCliSock.sendto('MANAGE_PASS:65535:123456:1', (MANAGE_BIND_IP, MANAGE_PORT)) +Python Eg: + + udpsock.sendto('MANAGE_PASS:65535:123456:1', (MANAGE_BIND_IP, MANAGE_PORT)) + +PHP Eg: + + $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); + $msg = 'MANAGE_PASS:65535:123456:1'; + $len = strlen($msg); + socket_sendto($sock, $msg, $len, 0, MANAGE_BIND_IP, MANAGE_PORT); + socket_close($sock); shadowsocks =========== diff --git a/shadowsocks/server_pool.py b/shadowsocks/server_pool.py index 61f5ca0..beb1c0f 100644 --- a/shadowsocks/server_pool.py +++ b/shadowsocks/server_pool.py @@ -33,7 +33,8 @@ import thread import threading import sys import asyncmgr - +import Config +from socket import * class ServerPool(object): @@ -44,12 +45,12 @@ class ServerPool(object): self.config = utils.get_config(False) utils.print_shadowsocks() self.dns_resolver = asyncdns.DNSResolver() - + self.mgr = asyncmgr.ServerMgr() self.tcp_servers_pool = {} #self.udp_servers_pool = {} self.loop = eventloop.EventLoop() - thread.start_new_thread(ServerPool.run_server, (self.loop, self.dns_resolver)) + thread.start_new_thread(ServerPool._loop, (self.loop, self.dns_resolver, self.mgr)) @staticmethod def get_instance(): @@ -58,9 +59,8 @@ class ServerPool(object): return ServerPool.instance @staticmethod - def run_server(loop, dns_resolver): + def _loop(loop, dns_resolver, mgr): try: - mgr = asyncmgr.ServerMgr() mgr.add_to_loop(loop) dns_resolver.add_to_loop(loop) loop.run() @@ -103,6 +103,24 @@ class ServerPool(object): ret = e return ret + def del_server(self, port): + port = int(port) + ret = True + if port not in self.tcp_servers_pool: + logging.info("stopped server at %s:%d already stop" % (self.config['server'], int(port))) + return True + logging.info("stopping server at %s:%d" % (self.config['server'], int(port))) + try: + udpsock = socket(AF_INET, SOCK_DGRAM) + udpsock.sendto('%s:%s:0:0' % (Config.MANAGE_PASS, port), (Config.MANAGE_BIND_IP, Config.MANAGE_PORT)) + udpsock.close() + except Exception, e: + import traceback + traceback.print_exc() + ret = e + logging.warn(e) + return ret + def cb_del_server(self, port): port = int(port) ret = True diff --git a/shadowsocks/tcprelay.py b/shadowsocks/tcprelay.py index b2bc44d..bb9872a 100644 --- a/shadowsocks/tcprelay.py +++ b/shadowsocks/tcprelay.py @@ -356,6 +356,7 @@ class TCPRelayHandler(object): if not data: self.destroy() return + self._server.server_transfer_ul += len(data) if not is_local: data = self._encryptor.decrypt(data) if not data: @@ -388,6 +389,7 @@ class TCPRelayHandler(object): if not data: self.destroy() return + self._server.server_transfer_dl += len(data) if self._is_local: data = self._encryptor.decrypt(data) else: @@ -495,6 +497,8 @@ class TCPRelay(object): self._eventloop = None self._fd_to_handlers = {} self._last_time = time.time() + self.server_transfer_ul = 0L + self.server_transfer_dl = 0L self._timeout = config['timeout'] self._timeouts = [] # a list for all the handlers