allow set speed limit in runtime

This commit is contained in:
破娃酱 2017-06-04 18:34:12 +08:00
parent f22ef99d85
commit 82f8fef28a
5 changed files with 40 additions and 17 deletions

View file

@ -123,7 +123,7 @@ class TransferBase(object):
continue continue
if allow: if allow:
allow_users[port] = passwd allow_users[port] = cfg
if 'protocol' in cfg and 'protocol_param' in cfg and common.to_str(cfg['protocol']) in obfs.mu_protocol(): if 'protocol' in cfg and 'protocol_param' in cfg and common.to_str(cfg['protocol']) in obfs.mu_protocol():
if '#' in common.to_str(cfg['protocol_param']): if '#' in common.to_str(cfg['protocol_param']):
mu_servers[port] = passwd mu_servers[port] = passwd

View file

@ -239,7 +239,7 @@ General options:
def main(): def main():
shortopts = 'adeclu:i:p:k:O:o:G:g:m:t:f:h' shortopts = 'adeclu:i:p:k:O:o:G:g:m:t:f:hs:S:'
longopts = ['help'] longopts = ['help']
action = None action = None
user = {} user = {}
@ -302,6 +302,10 @@ def main():
user['obfs_param'] = value user['obfs_param'] = value
elif key == '-G': elif key == '-G':
user['protocol_param'] = value user['protocol_param'] = value
elif key == '-s':
user['speed_limit_per_con'] = int(value)
elif key == '-S':
user['speed_limit_per_user'] = int(value)
elif key == '-m': elif key == '-m':
if value in fast_set_method: if value in fast_set_method:
user['method'] = fast_set_method[value] user['method'] = fast_set_method[value]

View file

@ -28,6 +28,7 @@ import time
from shadowsocks import shell, eventloop, tcprelay, udprelay, asyncdns, common from shadowsocks import shell, eventloop, tcprelay, udprelay, asyncdns, common
import threading import threading
import sys import sys
import traceback
from socket import * from socket import *
from configloader import load_config, get_config from configloader import load_config, get_config
@ -80,12 +81,10 @@ class ServerPool(object):
loop.run() loop.run()
except (KeyboardInterrupt, IOError, OSError) as e: except (KeyboardInterrupt, IOError, OSError) as e:
logging.error(e) logging.error(e)
import traceback
traceback.print_exc() traceback.print_exc()
os.exit(0) os.exit(0)
except Exception as e: except Exception as e:
logging.error(e) logging.error(e)
import traceback
traceback.print_exc() traceback.print_exc()
def server_is_run(self, port): def server_is_run(self, port):

View file

@ -273,6 +273,11 @@ class TCPRelayHandler(object):
def _update_user(self, user): def _update_user(self, user):
self._user = user self._user = user
self._user_id = struct.unpack('<I', user)[0] self._user_id = struct.unpack('<I', user)[0]
if self._user in self._server.server_users_cfg:
cfg = self._server.server_users_cfg[self._user]
speed = cfg.get('speed_limit_per_con', 0)
self.speed_tester_u.update_limit(speed)
self.speed_tester_d.update_limit(speed)
def _update_activity(self, data_len=0): def _update_activity(self, data_len=0):
# tell the TCP Relay we have activities recently # tell the TCP Relay we have activities recently
@ -1168,6 +1173,7 @@ class TCPRelay(object):
self.server_transfer_ul = 0 self.server_transfer_ul = 0
self.server_transfer_dl = 0 self.server_transfer_dl = 0
self.server_users = {} self.server_users = {}
self.server_users_cfg = {}
self.server_user_transfer_ul = {} self.server_user_transfer_ul = {}
self.server_user_transfer_dl = {} self.server_user_transfer_dl = {}
self.mu = False self.mu = False
@ -1258,9 +1264,9 @@ class TCPRelay(object):
self.del_user(uid) self.del_user(uid)
else: else:
passwd = items[1] passwd = items[1]
self.add_user(uid, passwd) self.add_user(uid, {'password':passwd})
def update_user(self, id, passwd): def _update_user(self, id, passwd):
uid = struct.pack('<I', id) uid = struct.pack('<I', id)
self.add_user(uid, passwd) self.add_user(uid, passwd)
@ -1273,12 +1279,25 @@ class TCPRelay(object):
uid = struct.pack('<I', id) uid = struct.pack('<I', id)
self.add_user(uid, users[id]) self.add_user(uid, users[id])
def add_user(self, user, passwd): # user: binstr[4], passwd: str def add_user(self, uid, cfg): # user: binstr[4], passwd: str
self.server_users[user] = common.to_bytes(passwd) passwd = cfg['password']
self.server_users[uid] = common.to_bytes(passwd)
self.server_users_cfg[uid] = cfg
speed = cfg.get("speed_limit_per_user", 0)
if uid in self._speed_tester_u:
self._speed_tester_u[uid].update_limit(speed)
else:
self._speed_tester_u[uid] = SpeedTester(speed)
if uid in self._speed_tester_d:
self._speed_tester_d[uid].update_limit(speed)
else:
self._speed_tester_d[uid] = SpeedTester(speed)
def del_user(self, user): def del_user(self, uid):
if user in self.server_users: if user in self.server_users:
del self.server_users[user] del self.server_users[uid]
if user in self.server_users_cfg:
del self.server_users_cfg[uid]
def add_transfer_u(self, user, transfer): def add_transfer_u(self, user, transfer):
if user is None: if user is None:

View file

@ -249,9 +249,9 @@ class UDPRelay(object):
self.del_user(uid) self.del_user(uid)
else: else:
passwd = items[1] passwd = items[1]
self.add_user(uid, passwd) self.add_user(uid, {'password':passwd})
def update_user(self, id, passwd): def _update_user(self, id, passwd):
uid = struct.pack('<I', id) uid = struct.pack('<I', id)
self.add_user(uid, passwd) self.add_user(uid, passwd)
@ -264,12 +264,13 @@ class UDPRelay(object):
uid = struct.pack('<I', id) uid = struct.pack('<I', id)
self.add_user(uid, users[id]) self.add_user(uid, users[id])
def add_user(self, user, passwd): # user: binstr[4], passwd: str def add_user(self, uid, cfg): # user: binstr[4], passwd: str
self.server_users[user] = common.to_bytes(passwd) passwd = cfg['password']
self.server_users[uid] = common.to_bytes(passwd)
def del_user(self, user): def del_user(self, uid):
if user in self.server_users: if uid in self.server_users:
del self.server_users[user] del self.server_users[uid]
def add_transfer_u(self, user, transfer): def add_transfer_u(self, user, transfer):
if user is None: if user is None: