merge mdss

This commit is contained in:
mengskysama 2014-09-14 18:26:10 +08:00
parent 270f655300
commit 7f8621f153
3 changed files with 53 additions and 9 deletions

View file

@ -1,5 +1,13 @@
shadowsocks manyuser branch 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
------- -------
install MySQL 5.x.x install MySQL 5.x.x
@ -8,7 +16,7 @@ install MySQL 5.x.x
create a database named `shadowsocks` create a database named `shadowsocks`
import `shadowsocks.sql` import `shadowsocks.sql` into `shadowsocks`
edit Config.py edit Config.py
Example: Example:
@ -33,13 +41,18 @@ Example:
db start server at port [%s] pass [%s] db start server at port [%s] pass [%s]
User table colum Database user table column
------------------ ------------------
`passwd` server pass `passwd` server pass
`port` server port `port` server port
`t` last keepalive time `t` last keepalive time
`u` upload transfer `u` upload transfer
`d` download transer `d` download transer
`transfer_enable` if u + d > transfer_enable this server will be stop (db_transfer.py del_server_out_of_bound_safe) `transfer_enable` if u + d > transfer_enable this server will be stop (db_transfer.py del_server_out_of_bound_safe)
Manage socket 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:0` to del a server at port `port`
use `MANAGE_PASS:port:passwd:1` to run a server at port `port` password is `passwd` 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 shadowsocks
=========== ===========

View file

@ -33,7 +33,8 @@ import thread
import threading import threading
import sys import sys
import asyncmgr import asyncmgr
import Config
from socket import *
class ServerPool(object): class ServerPool(object):
@ -44,12 +45,12 @@ class ServerPool(object):
self.config = utils.get_config(False) self.config = utils.get_config(False)
utils.print_shadowsocks() utils.print_shadowsocks()
self.dns_resolver = asyncdns.DNSResolver() self.dns_resolver = asyncdns.DNSResolver()
self.mgr = asyncmgr.ServerMgr()
self.tcp_servers_pool = {} self.tcp_servers_pool = {}
#self.udp_servers_pool = {} #self.udp_servers_pool = {}
self.loop = eventloop.EventLoop() 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 @staticmethod
def get_instance(): def get_instance():
@ -58,9 +59,8 @@ class ServerPool(object):
return ServerPool.instance return ServerPool.instance
@staticmethod @staticmethod
def run_server(loop, dns_resolver): def _loop(loop, dns_resolver, mgr):
try: try:
mgr = asyncmgr.ServerMgr()
mgr.add_to_loop(loop) mgr.add_to_loop(loop)
dns_resolver.add_to_loop(loop) dns_resolver.add_to_loop(loop)
loop.run() loop.run()
@ -103,6 +103,24 @@ class ServerPool(object):
ret = e ret = e
return ret 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): def cb_del_server(self, port):
port = int(port) port = int(port)
ret = True ret = True

View file

@ -356,6 +356,7 @@ class TCPRelayHandler(object):
if not data: if not data:
self.destroy() self.destroy()
return return
self._server.server_transfer_ul += len(data)
if not is_local: if not is_local:
data = self._encryptor.decrypt(data) data = self._encryptor.decrypt(data)
if not data: if not data:
@ -388,6 +389,7 @@ class TCPRelayHandler(object):
if not data: if not data:
self.destroy() self.destroy()
return return
self._server.server_transfer_dl += len(data)
if self._is_local: if self._is_local:
data = self._encryptor.decrypt(data) data = self._encryptor.decrypt(data)
else: else:
@ -495,6 +497,8 @@ class TCPRelay(object):
self._eventloop = None self._eventloop = None
self._fd_to_handlers = {} self._fd_to_handlers = {}
self._last_time = time.time() self._last_time = time.time()
self.server_transfer_ul = 0L
self.server_transfer_dl = 0L
self._timeout = config['timeout'] self._timeout = config['timeout']
self._timeouts = [] # a list for all the handlers self._timeouts = [] # a list for all the handlers