Skip to content

Commit 8031337

Browse files
committed
compatible python3
1 parent 044e153 commit 8031337

8 files changed

+68
-51
lines changed

configloader.py

+5-17
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,15 @@
11
#!/usr/bin/python
22
# -*- coding: UTF-8 -*-
3+
import importloader
34

4-
config = None
5+
g_config = None
56

67
def load_config():
7-
global config
8-
try:
9-
import userapiconfig
10-
reload(userapiconfig)
11-
config = userapiconfig
12-
return
13-
except:
14-
pass
15-
try:
16-
import apiconfig
17-
reload(apiconfig)
18-
config = apiconfig
19-
except:
20-
pass
8+
global g_config
9+
g_config = importloader.loads(['userapiconfig', 'apiconfig'])
2110

2211
def get_config():
23-
global config
24-
return config
12+
return g_config
2513

2614
load_config()
2715

db_transfer.py

+20-12
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import traceback
99
from shadowsocks import common, shell
1010
from configloader import load_config, get_config
11+
import importloader
1112

13+
switchrule = None
1214
db_instance = None
1315

1416
class DbTransfer(object):
@@ -80,8 +82,7 @@ def pull_db_all_user(self):
8082
import cymysql
8183
#数据库所有用户信息
8284
try:
83-
import switchrule
84-
reload(switchrule)
85+
switchrule = importloader.load('switchrule')
8586
keys = switchrule.getKeys()
8687
except Exception as e:
8788
keys = ['port', 'u', 'd', 'transfer_enable', 'passwd', 'enable' ]
@@ -99,13 +100,19 @@ def pull_db_all_user(self):
99100
conn.close()
100101
return rows
101102

103+
def cmp(self, val1, val2):
104+
if type(val1) is bytes:
105+
val1 = common.to_str(val1)
106+
if type(val2) is bytes:
107+
val2 = common.to_str(val2)
108+
return val1 == val2
109+
102110
def del_server_out_of_bound_safe(self, last_rows, rows):
103111
#停止超流量的服务
104112
#启动没超流量的服务
105113
#需要动态载入switchrule,以便实时修改规则
106114
try:
107-
import switchrule
108-
reload(switchrule)
115+
switchrule = importloader.load('switchrule')
109116
except Exception as e:
110117
logging.error('load switchrule.py fail')
111118
cur_servers = {}
@@ -145,13 +152,13 @@ def del_server_out_of_bound_safe(self, last_rows, rows):
145152
if port in ServerPool.get_instance().tcp_servers_pool:
146153
relay = ServerPool.get_instance().tcp_servers_pool[port]
147154
for name in merge_config_keys:
148-
if name in cfg and cfg[name] != relay._config[name]:
155+
if name in cfg and not self.cmp(cfg[name], relay._config[name]):
149156
cfgchange = True
150157
break;
151158
if not cfgchange and port in ServerPool.get_instance().tcp_ipv6_servers_pool:
152159
relay = ServerPool.get_instance().tcp_ipv6_servers_pool[port]
153160
for name in merge_config_keys:
154-
if name in cfg and cfg[name] != relay._config[name]:
161+
if name in cfg and not self.cmp(cfg[name], relay._config[name]):
155162
cfgchange = True
156163
break;
157164
#config changed
@@ -182,10 +189,10 @@ def del_server_out_of_bound_safe(self, last_rows, rows):
182189

183190
@staticmethod
184191
def del_servers():
185-
for port in ServerPool.get_instance().tcp_servers_pool.keys():
192+
for port in [v for v in ServerPool.get_instance().tcp_servers_pool.keys()]:
186193
if ServerPool.get_instance().server_is_run(port) > 0:
187194
ServerPool.get_instance().cb_del_server(port)
188-
for port in ServerPool.get_instance().tcp_ipv6_servers_pool.keys():
195+
for port in [v for v in ServerPool.get_instance().tcp_ipv6_servers_pool.keys()]:
189196
if ServerPool.get_instance().server_is_run(port) > 0:
190197
ServerPool.get_instance().cb_del_server(port)
191198

@@ -232,8 +239,8 @@ def update_all_user(self, dt_transfer):
232239
rows = None
233240

234241
config_path = get_config().MUDB_FILE
235-
with open(config_path, 'r+') as f:
236-
rows = shell.parse_json_in_str(f.read().decode('utf8'))
242+
with open(config_path, 'rb+') as f:
243+
rows = json.loads(f.read().decode('utf8'))
237244
for row in rows:
238245
if "port" in row:
239246
port = row["port"]
@@ -247,11 +254,12 @@ def update_all_user(self, dt_transfer):
247254
f.write(output)
248255

249256
def pull_db_all_user(self):
257+
import json
250258
rows = None
251259

252260
config_path = get_config().MUDB_FILE
253-
with open(config_path, 'r+') as f:
254-
rows = shell.parse_json_in_str(f.read().decode('utf8'))
261+
with open(config_path, 'rb+') as f:
262+
rows = json.loads(f.read().decode('utf8'))
255263
for row in rows:
256264
try:
257265
if 'forbidden_ip' in row:

importloader.py

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/python
2+
# -*- coding: UTF-8 -*-
3+
4+
def load(name):
5+
try:
6+
obj = __import__(name)
7+
return obj
8+
except:
9+
pass
10+
11+
try:
12+
import importlib
13+
obj = importlib.__import__(name)
14+
return obj
15+
except:
16+
pass
17+
18+
def loads(namelist):
19+
for name in namelist:
20+
obj = load(name)
21+
if obj is not None:
22+
return obj

mujson_mgr.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@
66
from configloader import load_config, get_config
77
import getopt
88
import sys
9+
import json
910

1011
class MuJsonLoader(object):
1112
def __init__(self):
1213
self.json = None
1314

1415
def load(self, path):
15-
with open(path, 'r+') as f:
16-
self.json = shell.parse_json_in_str(f.read().decode('utf8'))
16+
with open(path, 'rb+') as f:
17+
self.json = json.loads(f.read().decode('utf8'))
1718

1819
def save(self, path):
19-
import json
2020
if self.json:
2121
output = json.dumps(self.json, sort_keys=True, indent=4, separators=(',', ': '))
2222
with open(path, 'w') as f:

server_pool.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import os
2525
import logging
2626
import time
27-
from shadowsocks import shell, eventloop, tcprelay, udprelay, asyncdns
27+
from shadowsocks import shell, eventloop, tcprelay, udprelay, asyncdns, common
2828
import threading
2929
import sys
3030
from socket import *
@@ -124,7 +124,7 @@ def new_server(self, port, user_config):
124124
a_config['server_port'] = port
125125
a_config['max_connect'] = 128
126126
try:
127-
logging.info("starting server at [%s]:%d" % (a_config['server'], port))
127+
logging.info("starting server at [%s]:%d" % (common.to_str(a_config['server']), port))
128128

129129
tcp_server = tcprelay.TCPRelay(a_config, self.dns_resolver, False, stat_counter=self.stat_counter)
130130
tcp_server.add_to_loop(self.loop)
@@ -134,14 +134,14 @@ def new_server(self, port, user_config):
134134
udp_server.add_to_loop(self.loop)
135135
self.udp_ipv6_servers_pool.update({port: udp_server})
136136

137-
if a_config['server_ipv6'] == "::":
137+
if common.to_str(a_config['server_ipv6']) == "::":
138138
ipv6_ok = True
139139
except Exception as e:
140140
logging.warn("IPV6 %s " % (e,))
141141

142142
if 'server' in self.config:
143143
if port in self.tcp_servers_pool:
144-
logging.info("server already at %s:%d" % (self.config['server'], port))
144+
logging.info("server already at %s:%d" % (common.to_str(self.config['server']), port))
145145
return 'this port server is already running'
146146
else:
147147
a_config = self.config.copy()

shadowsocks/common.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def inet_pton(family, addr):
8585
if '.' in addr: # a v4 addr
8686
v4addr = addr[addr.rindex(':') + 1:]
8787
v4addr = socket.inet_aton(v4addr)
88-
v4addr = map(lambda x: ('%02X' % ord(x)), v4addr)
88+
v4addr = ['%02X' % ord(x) for x in v4addr]
8989
v4addr.insert(2, ':')
9090
newaddr = addr[:addr.rindex(':') + 1] + ''.join(v4addr)
9191
return inet_pton(family, newaddr)
@@ -289,10 +289,9 @@ def __cmp__(self, other):
289289

290290
class PortRange(object):
291291
def __init__(self, range_str):
292-
self.range_str = range_str
292+
self.range_str = to_str(range_str)
293293
self.range = set()
294-
if type(range_str) == str:
295-
range_str = range_str.split(',')
294+
range_str = to_str(range_str).split(',')
296295
for item in range_str:
297296
try:
298297
int_range = item.split('-')

shadowsocks/encrypt.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def EVP_BytesToKey(password, key_len, iv_len):
7575
class Encryptor(object):
7676
def __init__(self, key, method):
7777
self.key = key
78-
self.method = method
78+
self.method = common.to_str(method)
7979
self.iv = None
8080
self.iv_sent = False
8181
self.cipher_iv = b''

shadowsocks/obfsplugin/obfs_tls.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,8 @@ def client_encode(self, buf):
169169
data = b"\x16" + self.tls_version + struct.pack('>H', len(data)) + data
170170
return data
171171
if self.has_recv_header:
172-
data = b"\x14" + self.tls_version + "\x00\x01\x01" #ChangeCipherSpec
173-
data += b"\x16" + self.tls_version + "\x00\x20" + os.urandom(22) #Finished
172+
data = b"\x14" + self.tls_version + b"\x00\x01\x01" #ChangeCipherSpec
173+
data += b"\x16" + self.tls_version + b"\x00\x20" + os.urandom(22) #Finished
174174
data += hmac.new(self.server_info.key + self.server_info.data.client_id, data, hashlib.sha1).digest()[:10]
175175
ret = data + self.send_buffer
176176
self.send_buffer = b''
@@ -196,8 +196,8 @@ def server_encode(self, buf):
196196
data = self.tls_version + self.pack_auth_data(self.client_id) + b"\x20" + self.client_id + binascii.unhexlify(b"0016c02bc02fc00ac009c013c01400330039002f0035000a0100006fff01000100000a00080006001700180019000b0002010000230000337400000010002900270568322d31360568322d31350568322d313402683208737064792f332e3108687474702f312e31000500050100000000000d001600140401050106010201040305030603020304020202")
197197
data = b"\x02\x00" + struct.pack('>H', len(data)) + data #server hello
198198
data = b"\x16" + self.tls_version + struct.pack('>H', len(data)) + data
199-
data += b"\x14" + self.tls_version + "\x00\x01\x01" #ChangeCipherSpec
200-
data += b"\x16" + self.tls_version + "\x00\x20" + os.urandom(22) #Finished
199+
data += b"\x14" + self.tls_version + b"\x00\x01\x01" #ChangeCipherSpec
200+
data += b"\x16" + self.tls_version + b"\x00\x20" + os.urandom(22) #Finished
201201
data += hmac.new(self.server_info.key + self.client_id, data, hashlib.sha1).digest()[:10]
202202
return data
203203

@@ -326,8 +326,8 @@ def client_encode(self, buf):
326326
data = b"\x16\x03\x01" + struct.pack('>H', len(data)) + data
327327
return data
328328
elif self.handshake_status == 1 and len(buf) == 0:
329-
data = b"\x14" + self.tls_version + "\x00\x01\x01" #ChangeCipherSpec
330-
data += b"\x16" + self.tls_version + "\x00\x20" + os.urandom(22) #Finished
329+
data = b"\x14" + self.tls_version + b"\x00\x01\x01" #ChangeCipherSpec
330+
data += b"\x16" + self.tls_version + b"\x00\x20" + os.urandom(22) #Finished
331331
data += hmac.new(self.server_info.key + self.server_info.data.client_id, data, hashlib.sha1).digest()[:10]
332332
ret = data + self.send_buffer
333333
self.send_buffer = b''
@@ -376,8 +376,8 @@ def server_encode(self, buf):
376376
data = self.tls_version + self.pack_auth_data(self.client_id) + b"\x20" + self.client_id + binascii.unhexlify(b"c02f000005ff01000100")
377377
data = b"\x02\x00" + struct.pack('>H', len(data)) + data #server hello
378378
data = b"\x16\x03\x03" + struct.pack('>H', len(data)) + data
379-
data += b"\x14" + self.tls_version + "\x00\x01\x01" #ChangeCipherSpec
380-
data += b"\x16" + self.tls_version + "\x00\x20" + os.urandom(22) #Finished
379+
data += b"\x14" + self.tls_version + b"\x00\x01\x01" #ChangeCipherSpec
380+
data += b"\x16" + self.tls_version + b"\x00\x20" + os.urandom(22) #Finished
381381
data += hmac.new(self.server_info.key + self.client_id, data, hashlib.sha1).digest()[:10]
382382
return data
383383

@@ -410,10 +410,10 @@ def server_decode(self, buf):
410410
verify_len = 43 - 10
411411
if len(buf) < 43:
412412
raise Exception('server_decode data error')
413-
if not match_begin(buf, b"\x14" + self.tls_version + "\x00\x01\x01"): #ChangeCipherSpec
413+
if not match_begin(buf, b"\x14" + self.tls_version + b"\x00\x01\x01"): #ChangeCipherSpec
414414
raise Exception('server_decode data error')
415415
buf = buf[6:]
416-
if not match_begin(buf, b"\x16" + self.tls_version + "\x00\x20"): #Finished
416+
if not match_begin(buf, b"\x16" + self.tls_version + b"\x00\x20"): #Finished
417417
raise Exception('server_decode data error')
418418
if hmac.new(self.server_info.key + self.client_id, verify[:verify_len], hashlib.sha1).digest()[:10] != verify[verify_len:verify_len+10]:
419419
raise Exception('server_decode data error')

0 commit comments

Comments
 (0)