|
@ -63,15 +63,32 @@ class MuMgr(object): |
|
|
pass |
|
|
pass |
|
|
return ret |
|
|
return ret |
|
|
|
|
|
|
|
|
def ssrlink(self, user, encode): |
|
|
def ssrlink(self, user, encode, muid): |
|
|
protocol = user.get('protocol', '') |
|
|
protocol = user.get('protocol', '') |
|
|
obfs = user.get('obfs', '') |
|
|
obfs = user.get('obfs', '') |
|
|
protocol = protocol.replace("_compatible", "") |
|
|
protocol = protocol.replace("_compatible", "") |
|
|
obfs = obfs.replace("_compatible", "") |
|
|
obfs = obfs.replace("_compatible", "") |
|
|
link = "%s:%s:%s:%s:%s:%s" % (self.server_addr, user['port'], protocol, user['method'], obfs, common.to_str(base64.urlsafe_b64encode(common.to_bytes(user['passwd']))).replace("=", "")) |
|
|
link = "%s:%s:%s:%s:%s:%s" % (self.server_addr, user['port'], protocol, user['method'], obfs, common.to_str(base64.urlsafe_b64encode(common.to_bytes(user['passwd']))).replace("=", "")) |
|
|
|
|
|
if muid is not None: |
|
|
|
|
|
protocol_param = user.get('protocol_param', '') |
|
|
|
|
|
param = protocol_param.split('#') |
|
|
|
|
|
if len(param) == 2: |
|
|
|
|
|
user_dict = {} |
|
|
|
|
|
user_list = param[1].split(',') |
|
|
|
|
|
if user_list: |
|
|
|
|
|
for userinfo in user_list: |
|
|
|
|
|
items = userinfo.split(':') |
|
|
|
|
|
if len(items) == 2: |
|
|
|
|
|
user_int_id = int(items[0]) |
|
|
|
|
|
passwd = items[1] |
|
|
|
|
|
user_dict[user_int_id] = passwd |
|
|
|
|
|
if muid in user_dict: |
|
|
|
|
|
param = str(muid) + ':' + user_dict[muid] |
|
|
|
|
|
protocol_param = '/?protoparam=' + base64.urlsafe_b64encode(common.to_bytes(param)).replace("=", "") |
|
|
|
|
|
link += protocol_param |
|
|
return "ssr://" + (encode and common.to_str(base64.urlsafe_b64encode(common.to_bytes(link))).replace("=", "") or link) |
|
|
return "ssr://" + (encode and common.to_str(base64.urlsafe_b64encode(common.to_bytes(link))).replace("=", "") or link) |
|
|
|
|
|
|
|
|
def userinfo(self, user): |
|
|
def userinfo(self, user, muid = None): |
|
|
ret = "" |
|
|
ret = "" |
|
|
key_list = ['user', 'port', 'method', 'passwd', 'protocol', 'protocol_param', 'obfs', 'obfs_param', 'transfer_enable', 'u', 'd'] |
|
|
key_list = ['user', 'port', 'method', 'passwd', 'protocol', 'protocol_param', 'obfs', 'obfs_param', 'transfer_enable', 'u', 'd'] |
|
|
for key in sorted(user): |
|
|
for key in sorted(user): |
|
@ -96,8 +113,8 @@ class MuMgr(object): |
|
|
ret += " %s : %s G Bytes" % (key, val) |
|
|
ret += " %s : %s G Bytes" % (key, val) |
|
|
else: |
|
|
else: |
|
|
ret += " %s : %s" % (key, user[key]) |
|
|
ret += " %s : %s" % (key, user[key]) |
|
|
ret += "\n " + self.ssrlink(user, False) |
|
|
ret += "\n " + self.ssrlink(user, False, muid) |
|
|
ret += "\n " + self.ssrlink(user, True) |
|
|
ret += "\n " + self.ssrlink(user, True, muid) |
|
|
return ret |
|
|
return ret |
|
|
|
|
|
|
|
|
def rand_pass(self): |
|
|
def rand_pass(self): |
|
@ -183,7 +200,10 @@ class MuMgr(object): |
|
|
if 'port' in user and row['port'] != user['port']: |
|
|
if 'port' in user and row['port'] != user['port']: |
|
|
match = False |
|
|
match = False |
|
|
if match: |
|
|
if match: |
|
|
print("### user [%s] info %s" % (row['user'], self.userinfo(row))) |
|
|
muid = None |
|
|
|
|
|
if 'muid' in user: |
|
|
|
|
|
muid = user['muid'] |
|
|
|
|
|
print("### user [%s] info %s" % (row['user'], self.userinfo(row, muid))) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def print_server_help(): |
|
|
def print_server_help(): |
|
@ -207,6 +227,7 @@ Options: |
|
|
-g OBFS_PARAM obfs plugin param |
|
|
-g OBFS_PARAM obfs plugin param |
|
|
-t TRANSFER max transfer for G bytes, default: 8388608 (8 PB or 8192 TB) |
|
|
-t TRANSFER max transfer for G bytes, default: 8388608 (8 PB or 8192 TB) |
|
|
-f FORBID set forbidden ports. Example (ban 1~79 and 81~100): -f "1-79,81-100" |
|
|
-f FORBID set forbidden ports. Example (ban 1~79 and 81~100): -f "1-79,81-100" |
|
|
|
|
|
-i MUID set sub id to display (only work with -l) |
|
|
|
|
|
|
|
|
General options: |
|
|
General options: |
|
|
-h, --help show this help message and exit |
|
|
-h, --help show this help message and exit |
|
@ -214,7 +235,7 @@ General options: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main(): |
|
|
def main(): |
|
|
shortopts = 'adeclu:p:k:O:o:G:g:m:t:f:h' |
|
|
shortopts = 'adeclu:i:p:k:O:o:G:g:m:t:f:h' |
|
|
longopts = ['help'] |
|
|
longopts = ['help'] |
|
|
action = None |
|
|
action = None |
|
|
user = {} |
|
|
user = {} |
|
@ -265,6 +286,8 @@ def main(): |
|
|
action = 0 |
|
|
action = 0 |
|
|
elif key == '-u': |
|
|
elif key == '-u': |
|
|
user['user'] = value |
|
|
user['user'] = value |
|
|
|
|
|
elif key == '-i': |
|
|
|
|
|
user['muid'] = int(value) |
|
|
elif key == '-p': |
|
|
elif key == '-p': |
|
|
user['port'] = int(value) |
|
|
user['port'] = int(value) |
|
|
elif key == '-k': |
|
|
elif key == '-k': |
|
|