Browse Source

compatible python3

dev
BreakWa11 9 years ago
parent
commit
8031337d65
  1. 22
      configloader.py
  2. 32
      db_transfer.py
  3. 22
      importloader.py
  4. 6
      mujson_mgr.py
  5. 8
      server_pool.py
  6. 7
      shadowsocks/common.py
  7. 2
      shadowsocks/encrypt.py
  8. 20
      shadowsocks/obfsplugin/obfs_tls.py

22
configloader.py

@ -1,27 +1,15 @@
#!/usr/bin/python #!/usr/bin/python
# -*- coding: UTF-8 -*- # -*- coding: UTF-8 -*-
import importloader
config = None g_config = None
def load_config(): def load_config():
global config global g_config
try: g_config = importloader.loads(['userapiconfig', 'apiconfig'])
import userapiconfig
reload(userapiconfig)
config = userapiconfig
return
except:
pass
try:
import apiconfig
reload(apiconfig)
config = apiconfig
except:
pass
def get_config(): def get_config():
global config return g_config
return config
load_config() load_config()

32
db_transfer.py

@ -8,7 +8,9 @@ from server_pool import ServerPool
import traceback import traceback
from shadowsocks import common, shell from shadowsocks import common, shell
from configloader import load_config, get_config from configloader import load_config, get_config
import importloader
switchrule = None
db_instance = None db_instance = None
class DbTransfer(object): class DbTransfer(object):
@ -80,8 +82,7 @@ class DbTransfer(object):
import cymysql import cymysql
#数据库所有用户信息 #数据库所有用户信息
try: try:
import switchrule switchrule = importloader.load('switchrule')
reload(switchrule)
keys = switchrule.getKeys() keys = switchrule.getKeys()
except Exception as e: except Exception as e:
keys = ['port', 'u', 'd', 'transfer_enable', 'passwd', 'enable' ] keys = ['port', 'u', 'd', 'transfer_enable', 'passwd', 'enable' ]
@ -99,13 +100,19 @@ class DbTransfer(object):
conn.close() conn.close()
return rows return rows
def cmp(self, val1, val2):
if type(val1) is bytes:
val1 = common.to_str(val1)
if type(val2) is bytes:
val2 = common.to_str(val2)
return val1 == val2
def del_server_out_of_bound_safe(self, last_rows, rows): def del_server_out_of_bound_safe(self, last_rows, rows):
#停止超流量的服务 #停止超流量的服务
#启动没超流量的服务 #启动没超流量的服务
#需要动态载入switchrule,以便实时修改规则 #需要动态载入switchrule,以便实时修改规则
try: try:
import switchrule switchrule = importloader.load('switchrule')
reload(switchrule)
except Exception as e: except Exception as e:
logging.error('load switchrule.py fail') logging.error('load switchrule.py fail')
cur_servers = {} cur_servers = {}
@ -145,13 +152,13 @@ class DbTransfer(object):
if port in ServerPool.get_instance().tcp_servers_pool: if port in ServerPool.get_instance().tcp_servers_pool:
relay = ServerPool.get_instance().tcp_servers_pool[port] relay = ServerPool.get_instance().tcp_servers_pool[port]
for name in merge_config_keys: for name in merge_config_keys:
if name in cfg and cfg[name] != relay._config[name]: if name in cfg and not self.cmp(cfg[name], relay._config[name]):
cfgchange = True cfgchange = True
break; break;
if not cfgchange and port in ServerPool.get_instance().tcp_ipv6_servers_pool: if not cfgchange and port in ServerPool.get_instance().tcp_ipv6_servers_pool:
relay = ServerPool.get_instance().tcp_ipv6_servers_pool[port] relay = ServerPool.get_instance().tcp_ipv6_servers_pool[port]
for name in merge_config_keys: for name in merge_config_keys:
if name in cfg and cfg[name] != relay._config[name]: if name in cfg and not self.cmp(cfg[name], relay._config[name]):
cfgchange = True cfgchange = True
break; break;
#config changed #config changed
@ -182,10 +189,10 @@ class DbTransfer(object):
@staticmethod @staticmethod
def del_servers(): def del_servers():
for port in ServerPool.get_instance().tcp_servers_pool.keys(): for port in [v for v in ServerPool.get_instance().tcp_servers_pool.keys()]:
if ServerPool.get_instance().server_is_run(port) > 0: if ServerPool.get_instance().server_is_run(port) > 0:
ServerPool.get_instance().cb_del_server(port) ServerPool.get_instance().cb_del_server(port)
for port in ServerPool.get_instance().tcp_ipv6_servers_pool.keys(): for port in [v for v in ServerPool.get_instance().tcp_ipv6_servers_pool.keys()]:
if ServerPool.get_instance().server_is_run(port) > 0: if ServerPool.get_instance().server_is_run(port) > 0:
ServerPool.get_instance().cb_del_server(port) ServerPool.get_instance().cb_del_server(port)
@ -232,8 +239,8 @@ class MuJsonTransfer(DbTransfer):
rows = None rows = None
config_path = get_config().MUDB_FILE config_path = get_config().MUDB_FILE
with open(config_path, 'r+') as f: with open(config_path, 'rb+') as f:
rows = shell.parse_json_in_str(f.read().decode('utf8')) rows = json.loads(f.read().decode('utf8'))
for row in rows: for row in rows:
if "port" in row: if "port" in row:
port = row["port"] port = row["port"]
@ -247,11 +254,12 @@ class MuJsonTransfer(DbTransfer):
f.write(output) f.write(output)
def pull_db_all_user(self): def pull_db_all_user(self):
import json
rows = None rows = None
config_path = get_config().MUDB_FILE config_path = get_config().MUDB_FILE
with open(config_path, 'r+') as f: with open(config_path, 'rb+') as f:
rows = shell.parse_json_in_str(f.read().decode('utf8')) rows = json.loads(f.read().decode('utf8'))
for row in rows: for row in rows:
try: try:
if 'forbidden_ip' in row: if 'forbidden_ip' in row:

22
importloader.py

@ -0,0 +1,22 @@
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def load(name):
try:
obj = __import__(name)
return obj
except:
pass
try:
import importlib
obj = importlib.__import__(name)
return obj
except:
pass
def loads(namelist):
for name in namelist:
obj = load(name)
if obj is not None:
return obj

6
mujson_mgr.py

@ -6,17 +6,17 @@ from shadowsocks import common, shell
from configloader import load_config, get_config from configloader import load_config, get_config
import getopt import getopt
import sys import sys
import json
class MuJsonLoader(object): class MuJsonLoader(object):
def __init__(self): def __init__(self):
self.json = None self.json = None
def load(self, path): def load(self, path):
with open(path, 'r+') as f: with open(path, 'rb+') as f:
self.json = shell.parse_json_in_str(f.read().decode('utf8')) self.json = json.loads(f.read().decode('utf8'))
def save(self, path): def save(self, path):
import json
if self.json: if self.json:
output = json.dumps(self.json, sort_keys=True, indent=4, separators=(',', ': ')) output = json.dumps(self.json, sort_keys=True, indent=4, separators=(',', ': '))
with open(path, 'w') as f: with open(path, 'w') as f:

8
server_pool.py

@ -24,7 +24,7 @@
import os import os
import logging import logging
import time import time
from shadowsocks import shell, eventloop, tcprelay, udprelay, asyncdns from shadowsocks import shell, eventloop, tcprelay, udprelay, asyncdns, common
import threading import threading
import sys import sys
from socket import * from socket import *
@ -124,7 +124,7 @@ class ServerPool(object):
a_config['server_port'] = port a_config['server_port'] = port
a_config['max_connect'] = 128 a_config['max_connect'] = 128
try: try:
logging.info("starting server at [%s]:%d" % (a_config['server'], port)) logging.info("starting server at [%s]:%d" % (common.to_str(a_config['server']), port))
tcp_server = tcprelay.TCPRelay(a_config, self.dns_resolver, False, stat_counter=self.stat_counter) tcp_server = tcprelay.TCPRelay(a_config, self.dns_resolver, False, stat_counter=self.stat_counter)
tcp_server.add_to_loop(self.loop) tcp_server.add_to_loop(self.loop)
@ -134,14 +134,14 @@ class ServerPool(object):
udp_server.add_to_loop(self.loop) udp_server.add_to_loop(self.loop)
self.udp_ipv6_servers_pool.update({port: udp_server}) self.udp_ipv6_servers_pool.update({port: udp_server})
if a_config['server_ipv6'] == "::": if common.to_str(a_config['server_ipv6']) == "::":
ipv6_ok = True ipv6_ok = True
except Exception as e: except Exception as e:
logging.warn("IPV6 %s " % (e,)) logging.warn("IPV6 %s " % (e,))
if 'server' in self.config: if 'server' in self.config:
if port in self.tcp_servers_pool: if port in self.tcp_servers_pool:
logging.info("server already at %s:%d" % (self.config['server'], port)) logging.info("server already at %s:%d" % (common.to_str(self.config['server']), port))
return 'this port server is already running' return 'this port server is already running'
else: else:
a_config = self.config.copy() a_config = self.config.copy()

7
shadowsocks/common.py

@ -85,7 +85,7 @@ def inet_pton(family, addr):
if '.' in addr: # a v4 addr if '.' in addr: # a v4 addr
v4addr = addr[addr.rindex(':') + 1:] v4addr = addr[addr.rindex(':') + 1:]
v4addr = socket.inet_aton(v4addr) v4addr = socket.inet_aton(v4addr)
v4addr = map(lambda x: ('%02X' % ord(x)), v4addr) v4addr = ['%02X' % ord(x) for x in v4addr]
v4addr.insert(2, ':') v4addr.insert(2, ':')
newaddr = addr[:addr.rindex(':') + 1] + ''.join(v4addr) newaddr = addr[:addr.rindex(':') + 1] + ''.join(v4addr)
return inet_pton(family, newaddr) return inet_pton(family, newaddr)
@ -289,10 +289,9 @@ class IPNetwork(object):
class PortRange(object): class PortRange(object):
def __init__(self, range_str): def __init__(self, range_str):
self.range_str = range_str self.range_str = to_str(range_str)
self.range = set() self.range = set()
if type(range_str) == str: range_str = to_str(range_str).split(',')
range_str = range_str.split(',')
for item in range_str: for item in range_str:
try: try:
int_range = item.split('-') int_range = item.split('-')

2
shadowsocks/encrypt.py

@ -75,7 +75,7 @@ def EVP_BytesToKey(password, key_len, iv_len):
class Encryptor(object): class Encryptor(object):
def __init__(self, key, method): def __init__(self, key, method):
self.key = key self.key = key
self.method = method self.method = common.to_str(method)
self.iv = None self.iv = None
self.iv_sent = False self.iv_sent = False
self.cipher_iv = b'' self.cipher_iv = b''

20
shadowsocks/obfsplugin/obfs_tls.py

@ -169,8 +169,8 @@ class tls_auth(plain.plain):
data = b"\x16" + self.tls_version + struct.pack('>H', len(data)) + data data = b"\x16" + self.tls_version + struct.pack('>H', len(data)) + data
return data return data
if self.has_recv_header: if self.has_recv_header:
data = b"\x14" + self.tls_version + "\x00\x01\x01" #ChangeCipherSpec data = b"\x14" + self.tls_version + b"\x00\x01\x01" #ChangeCipherSpec
data += b"\x16" + self.tls_version + "\x00\x20" + os.urandom(22) #Finished data += b"\x16" + self.tls_version + b"\x00\x20" + os.urandom(22) #Finished
data += hmac.new(self.server_info.key + self.server_info.data.client_id, data, hashlib.sha1).digest()[:10] data += hmac.new(self.server_info.key + self.server_info.data.client_id, data, hashlib.sha1).digest()[:10]
ret = data + self.send_buffer ret = data + self.send_buffer
self.send_buffer = b'' self.send_buffer = b''
@ -196,8 +196,8 @@ class tls_auth(plain.plain):
data = self.tls_version + self.pack_auth_data(self.client_id) + b"\x20" + self.client_id + binascii.unhexlify(b"0016c02bc02fc00ac009c013c01400330039002f0035000a0100006fff01000100000a00080006001700180019000b0002010000230000337400000010002900270568322d31360568322d31350568322d313402683208737064792f332e3108687474702f312e31000500050100000000000d001600140401050106010201040305030603020304020202") data = self.tls_version + self.pack_auth_data(self.client_id) + b"\x20" + self.client_id + binascii.unhexlify(b"0016c02bc02fc00ac009c013c01400330039002f0035000a0100006fff01000100000a00080006001700180019000b0002010000230000337400000010002900270568322d31360568322d31350568322d313402683208737064792f332e3108687474702f312e31000500050100000000000d001600140401050106010201040305030603020304020202")
data = b"\x02\x00" + struct.pack('>H', len(data)) + data #server hello data = b"\x02\x00" + struct.pack('>H', len(data)) + data #server hello
data = b"\x16" + self.tls_version + struct.pack('>H', len(data)) + data data = b"\x16" + self.tls_version + struct.pack('>H', len(data)) + data
data += b"\x14" + self.tls_version + "\x00\x01\x01" #ChangeCipherSpec data += b"\x14" + self.tls_version + b"\x00\x01\x01" #ChangeCipherSpec
data += b"\x16" + self.tls_version + "\x00\x20" + os.urandom(22) #Finished data += b"\x16" + self.tls_version + b"\x00\x20" + os.urandom(22) #Finished
data += hmac.new(self.server_info.key + self.client_id, data, hashlib.sha1).digest()[:10] data += hmac.new(self.server_info.key + self.client_id, data, hashlib.sha1).digest()[:10]
return data return data
@ -326,8 +326,8 @@ class tls_ticket_auth(plain.plain):
data = b"\x16\x03\x01" + struct.pack('>H', len(data)) + data data = b"\x16\x03\x01" + struct.pack('>H', len(data)) + data
return data return data
elif self.handshake_status == 1 and len(buf) == 0: elif self.handshake_status == 1 and len(buf) == 0:
data = b"\x14" + self.tls_version + "\x00\x01\x01" #ChangeCipherSpec data = b"\x14" + self.tls_version + b"\x00\x01\x01" #ChangeCipherSpec
data += b"\x16" + self.tls_version + "\x00\x20" + os.urandom(22) #Finished data += b"\x16" + self.tls_version + b"\x00\x20" + os.urandom(22) #Finished
data += hmac.new(self.server_info.key + self.server_info.data.client_id, data, hashlib.sha1).digest()[:10] data += hmac.new(self.server_info.key + self.server_info.data.client_id, data, hashlib.sha1).digest()[:10]
ret = data + self.send_buffer ret = data + self.send_buffer
self.send_buffer = b'' self.send_buffer = b''
@ -376,8 +376,8 @@ class tls_ticket_auth(plain.plain):
data = self.tls_version + self.pack_auth_data(self.client_id) + b"\x20" + self.client_id + binascii.unhexlify(b"c02f000005ff01000100") data = self.tls_version + self.pack_auth_data(self.client_id) + b"\x20" + self.client_id + binascii.unhexlify(b"c02f000005ff01000100")
data = b"\x02\x00" + struct.pack('>H', len(data)) + data #server hello data = b"\x02\x00" + struct.pack('>H', len(data)) + data #server hello
data = b"\x16\x03\x03" + struct.pack('>H', len(data)) + data data = b"\x16\x03\x03" + struct.pack('>H', len(data)) + data
data += b"\x14" + self.tls_version + "\x00\x01\x01" #ChangeCipherSpec data += b"\x14" + self.tls_version + b"\x00\x01\x01" #ChangeCipherSpec
data += b"\x16" + self.tls_version + "\x00\x20" + os.urandom(22) #Finished data += b"\x16" + self.tls_version + b"\x00\x20" + os.urandom(22) #Finished
data += hmac.new(self.server_info.key + self.client_id, data, hashlib.sha1).digest()[:10] data += hmac.new(self.server_info.key + self.client_id, data, hashlib.sha1).digest()[:10]
return data return data
@ -410,10 +410,10 @@ class tls_ticket_auth(plain.plain):
verify_len = 43 - 10 verify_len = 43 - 10
if len(buf) < 43: if len(buf) < 43:
raise Exception('server_decode data error') raise Exception('server_decode data error')
if not match_begin(buf, b"\x14" + self.tls_version + "\x00\x01\x01"): #ChangeCipherSpec if not match_begin(buf, b"\x14" + self.tls_version + b"\x00\x01\x01"): #ChangeCipherSpec
raise Exception('server_decode data error') raise Exception('server_decode data error')
buf = buf[6:] buf = buf[6:]
if not match_begin(buf, b"\x16" + self.tls_version + "\x00\x20"): #Finished if not match_begin(buf, b"\x16" + self.tls_version + b"\x00\x20"): #Finished
raise Exception('server_decode data error') raise Exception('server_decode data error')
if hmac.new(self.server_info.key + self.client_id, verify[:verify_len], hashlib.sha1).digest()[:10] != verify[verify_len:verify_len+10]: if hmac.new(self.server_info.key + self.client_id, verify[:verify_len], hashlib.sha1).digest()[:10] != verify[verify_len:verify_len+10]:
raise Exception('server_decode data error') raise Exception('server_decode data error')

Loading…
Cancel
Save