BreakWa11
9 years ago
3 changed files with 223 additions and 2 deletions
@ -0,0 +1,218 @@ |
|||||
|
#!/usr/bin/python |
||||
|
# -*- coding: UTF-8 -*- |
||||
|
|
||||
|
import traceback |
||||
|
from shadowsocks import common, shell |
||||
|
from configloader import load_config, get_config |
||||
|
import getopt |
||||
|
import sys |
||||
|
|
||||
|
class MuJsonLoader(object): |
||||
|
def __init__(self): |
||||
|
self.json = None |
||||
|
|
||||
|
def load(self, path): |
||||
|
with open(path, 'r+') as f: |
||||
|
self.json = shell.parse_json_in_str(f.read().decode('utf8')) |
||||
|
|
||||
|
def save(self, path): |
||||
|
import json |
||||
|
if self.json: |
||||
|
output = json.dumps(self.json, sort_keys=True, indent=4, separators=(',', ': ')) |
||||
|
with open(path, 'w') as f: |
||||
|
f.write(output) |
||||
|
|
||||
|
class MuMgr(object): |
||||
|
def __init__(self): |
||||
|
self.config_path = get_config().MUDB_FILE |
||||
|
self.data = MuJsonLoader() |
||||
|
|
||||
|
def userinfo(self, user): |
||||
|
ret = "" |
||||
|
for key in user.keys(): |
||||
|
ret += '\n' |
||||
|
if key in ['transfer_enable', 'u', 'd'] : |
||||
|
val = user[key] |
||||
|
if val / 1024 < 4: |
||||
|
ret += " %s : %s" % (key, val) |
||||
|
elif val / 1024**2 < 4: |
||||
|
val /= float(1024) |
||||
|
ret += " %s : %s K bytes" % (key, val) |
||||
|
elif val / 1024**3 < 4: |
||||
|
val /= float(1024**2) |
||||
|
ret += " %s : %s M bytes" % (key, val) |
||||
|
else: |
||||
|
val /= float(1024**3) |
||||
|
ret += " %s : %s G bytes" % (key, val) |
||||
|
else: |
||||
|
ret += " %s : %s" % (key, user[key]) |
||||
|
return ret |
||||
|
|
||||
|
def add(self, user): |
||||
|
up = {'enable': True, 'u': 0, 'd': 0, 'passwd': "m", 'method': "aes-128-cfb", |
||||
|
'protocol': "auth_sha1_v2_compatible", |
||||
|
'obfs': "tls1.2_ticket_auth_compatible", |
||||
|
'transfer_enable': 1125899906842624} |
||||
|
up.update(user) |
||||
|
|
||||
|
self.data.load(self.config_path) |
||||
|
for row in self.data.json: |
||||
|
match = False |
||||
|
if 'user' in user and row['user'] == user['user']: |
||||
|
match = True |
||||
|
if 'port' in user and row['port'] == user['port']: |
||||
|
match = True |
||||
|
if match: |
||||
|
print("user [%s] port [%s] already exist" % (row['user'], row['port'])) |
||||
|
return |
||||
|
self.data.json.append(up) |
||||
|
print("### add user info %s" % self.userinfo(up)) |
||||
|
self.data.save(self.config_path) |
||||
|
|
||||
|
def edit(self, user): |
||||
|
self.data.load(self.config_path) |
||||
|
for row in self.data.json: |
||||
|
match = True |
||||
|
if 'user' in user and row['user'] != user['user']: |
||||
|
match = False |
||||
|
if 'port' in user and row['port'] != user['port']: |
||||
|
match = False |
||||
|
if match: |
||||
|
print("edit user [%s]" % (row['user'],)) |
||||
|
row.update(user) |
||||
|
print("### new user info %s" % self.userinfo(row)) |
||||
|
break |
||||
|
self.data.save(self.config_path) |
||||
|
|
||||
|
def delete(self, user): |
||||
|
self.data.load(self.config_path) |
||||
|
index = 0 |
||||
|
for row in self.data.json: |
||||
|
match = True |
||||
|
if 'user' in user and row['user'] != user['user']: |
||||
|
match = False |
||||
|
if 'port' in user and row['port'] != user['port']: |
||||
|
match = False |
||||
|
if match: |
||||
|
print("delete user [%s]" % row['user']) |
||||
|
del self.data.json[index] |
||||
|
break |
||||
|
index += 1 |
||||
|
self.data.save(self.config_path) |
||||
|
|
||||
|
def clear_ud(self, user): |
||||
|
up = {'u': 0, 'd': 0} |
||||
|
self.data.load(self.config_path) |
||||
|
for row in self.data.json: |
||||
|
match = True |
||||
|
if 'user' in user and row['user'] != user['user']: |
||||
|
match = False |
||||
|
if 'port' in user and row['port'] != user['port']: |
||||
|
match = False |
||||
|
if match: |
||||
|
print("clear user %s" % self.userinfo(row['user'])) |
||||
|
row.update(up) |
||||
|
self.data.save(self.config_path) |
||||
|
|
||||
|
def list_user(self, user): |
||||
|
self.data.load(self.config_path) |
||||
|
for row in self.data.json: |
||||
|
match = True |
||||
|
if 'user' in user and row['user'] != user['user']: |
||||
|
match = False |
||||
|
if 'port' in user and row['port'] != user['port']: |
||||
|
match = False |
||||
|
if match: |
||||
|
print("### user [%s] info %s" % (row['user'], self.userinfo(row))) |
||||
|
|
||||
|
def print_server_help(): |
||||
|
print('''usage: python mujson_manage.py -a|-d|-e|-c|-l [OPTION]... |
||||
|
|
||||
|
Actions: |
||||
|
-a ADD add/edit a user |
||||
|
-d DELETE delete a user |
||||
|
-e EDIT edit a user |
||||
|
-c CLEAR set u/d to zero |
||||
|
-l LIST display a user infomation or all users infomation |
||||
|
|
||||
|
Options: |
||||
|
-u USER the user name |
||||
|
-p PORT server port |
||||
|
-k PASSWORD password |
||||
|
-m METHOD encryption method, default: aes-128-cfb |
||||
|
-O PROTOCOL protocol plugin, default: auth_sha1_v2_compatible |
||||
|
-o OBFS obfs plugin, default: tls1.2_ticket_auth_compatible |
||||
|
-t TRANSFER max transfer for G bytes, default: 1048576, can be float point number |
||||
|
|
||||
|
General options: |
||||
|
-h, --help show this help message and exit |
||||
|
''') |
||||
|
|
||||
|
def main(): |
||||
|
shortopts = 'hadeclu:p:k:O:o:m:t' |
||||
|
longopts = ['help'] |
||||
|
action = None |
||||
|
user = {} |
||||
|
try: |
||||
|
optlist, args = getopt.getopt(sys.argv[1:], shortopts, longopts) |
||||
|
for key, value in optlist: |
||||
|
if key == '-a': |
||||
|
action = 1 |
||||
|
elif key == '-d': |
||||
|
action = 2 |
||||
|
elif key == '-e': |
||||
|
action = 3 |
||||
|
elif key == '-l': |
||||
|
action = 4 |
||||
|
elif key == '-c': |
||||
|
action = 0 |
||||
|
elif key == '-u': |
||||
|
user['user'] = value |
||||
|
elif key == '-p': |
||||
|
user['port'] = int(value) |
||||
|
elif key == '-k': |
||||
|
user['passwd'] = value |
||||
|
elif key == '-o': |
||||
|
user['obfs'] = value |
||||
|
elif key == '-O': |
||||
|
user['protocal'] = value |
||||
|
elif key == '-m': |
||||
|
user['method'] = value |
||||
|
elif key == '-t': |
||||
|
val = float(value) |
||||
|
try: |
||||
|
val = int(value) |
||||
|
except: |
||||
|
pass |
||||
|
user['transfer_enable'] = val * (1024 ** 3) |
||||
|
elif key in ('-h', '--help'): |
||||
|
print_server_help() |
||||
|
sys.exit(0) |
||||
|
except getopt.GetoptError as e: |
||||
|
print(e) |
||||
|
sys.exit(2) |
||||
|
|
||||
|
manage = MuMgr() |
||||
|
if action == 0: |
||||
|
manage.clear_ud(user) |
||||
|
elif action == 1: |
||||
|
if 'user' in user and 'port' in user: |
||||
|
manage.add(user) |
||||
|
else: |
||||
|
print("You have to set the user name and port with -u/-p") |
||||
|
elif action == 2: |
||||
|
if 'user' in user or 'port' in user: |
||||
|
manage.delete(user) |
||||
|
else: |
||||
|
print("You have to set the user name or port with -u/-p") |
||||
|
elif action == 3: |
||||
|
if 'user' in user or 'port' in user: |
||||
|
manage.edit(user) |
||||
|
else: |
||||
|
print("You have to set the user name or port with -u/-p") |
||||
|
elif action == 4: |
||||
|
manage.list_user(user) |
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
main() |
||||
|
|
Loading…
Reference in new issue