2018-11-08 17:05:34 +00:00
|
|
|
#!/usr/bin/env python3
|
2019-11-02 17:10:10 +00:00
|
|
|
# Copyright (C) 2018-2019 Ycarus (Yannick Chabanois) <ycarus@zugaina.org>
|
2018-11-16 13:14:08 +00:00
|
|
|
#
|
|
|
|
# This is free software, licensed under the GNU General Public License v3.0.
|
|
|
|
# See /LICENSE for more information.
|
|
|
|
#
|
2018-11-08 17:05:34 +00:00
|
|
|
|
2018-11-08 12:55:20 +00:00
|
|
|
import json
|
|
|
|
import base64
|
2019-12-27 20:42:47 +00:00
|
|
|
import secrets
|
2018-11-08 12:55:20 +00:00
|
|
|
import uuid
|
|
|
|
import configparser
|
2018-11-14 16:34:13 +00:00
|
|
|
import subprocess
|
2018-11-08 17:05:34 +00:00
|
|
|
import os
|
2020-01-06 20:18:29 +00:00
|
|
|
import sys
|
2019-07-13 05:30:58 +00:00
|
|
|
import socket
|
2018-11-29 21:43:02 +00:00
|
|
|
import re
|
2019-06-02 21:11:58 +00:00
|
|
|
import hashlib
|
2019-08-30 05:52:59 +00:00
|
|
|
import time
|
2019-11-02 17:10:10 +00:00
|
|
|
import uvicorn
|
|
|
|
import jwt
|
2019-12-20 15:19:07 +00:00
|
|
|
from jwt import PyJWTError
|
2019-11-02 17:10:10 +00:00
|
|
|
from pprint import pprint
|
|
|
|
from datetime import datetime,timedelta
|
2018-11-08 17:05:34 +00:00
|
|
|
from tempfile import mkstemp
|
2019-11-02 17:10:10 +00:00
|
|
|
from typing import List
|
2018-11-08 17:05:34 +00:00
|
|
|
from shutil import move
|
2018-11-08 12:55:20 +00:00
|
|
|
from pprint import pprint
|
2019-10-10 19:13:14 +00:00
|
|
|
from netjsonconfig import OpenWrt
|
2020-01-09 08:48:02 +00:00
|
|
|
from fastapi import Depends, FastAPI, HTTPException, Security, Query
|
2019-11-02 17:10:10 +00:00
|
|
|
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm, SecurityScopes
|
|
|
|
from passlib.context import CryptContext
|
|
|
|
from pydantic import BaseModel, ValidationError
|
|
|
|
from starlette.status import HTTP_401_UNAUTHORIZED
|
2019-12-30 19:49:39 +00:00
|
|
|
from enum import Enum
|
2018-11-08 12:55:20 +00:00
|
|
|
|
2018-12-28 07:55:46 +00:00
|
|
|
import logging
|
2019-11-02 17:10:10 +00:00
|
|
|
log = logging.getLogger('api')
|
2019-12-26 19:25:11 +00:00
|
|
|
log.setLevel(logging.ERROR)
|
|
|
|
#log.setLevel(logging.DEBUG)
|
2018-11-08 12:55:20 +00:00
|
|
|
|
|
|
|
# Generate a random secret key
|
2019-11-02 17:10:10 +00:00
|
|
|
SECRET_KEY = uuid.uuid4().hex
|
|
|
|
JWT_SECRET_KEY = uuid.uuid4().hex
|
|
|
|
PERMANENT_SESSION_LIFETIME = timedelta(hours=24)
|
2019-11-13 07:39:00 +00:00
|
|
|
ACCESS_TOKEN_EXPIRE_MINUTES = 1440
|
2019-11-02 17:10:10 +00:00
|
|
|
ALGORITHM = "HS256"
|
2018-11-08 12:55:20 +00:00
|
|
|
|
|
|
|
# Get main net interface
|
|
|
|
file = open('/etc/shorewall/params.net', "r")
|
|
|
|
read = file.read()
|
|
|
|
iface = None
|
|
|
|
for line in read.splitlines():
|
|
|
|
if 'NET_IFACE=' in line:
|
|
|
|
iface=line.split('=',1)[1]
|
|
|
|
|
|
|
|
# Get interface rx/tx
|
|
|
|
def get_bytes(t, iface='eth0'):
|
|
|
|
with open('/sys/class/net/' + iface + '/statistics/' + t + '_bytes', 'r') as f:
|
|
|
|
data = f.read();
|
|
|
|
return int(data)
|
|
|
|
|
2019-12-26 19:25:11 +00:00
|
|
|
def get_bytes_ss(port):
|
|
|
|
ss_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
|
|
|
|
ss_socket.sendto('ping'.encode(), ("127.0.0.1",8839));
|
|
|
|
ss_recv = ss_socket.recv(1024);
|
|
|
|
json_txt = ss_recv.decode("utf-8").replace('stat: ','');
|
|
|
|
result = json.loads(json_txt);
|
|
|
|
return result[str(port)]
|
|
|
|
|
|
|
|
def add_ss_user(port,key):
|
|
|
|
ss_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
|
2019-12-27 20:42:47 +00:00
|
|
|
data = 'add: {"server_port": ' + port + ',"key": "' + key + '"}'
|
|
|
|
ss_socket.sendto(data.encode(), ("127.0.0.1",8839));
|
|
|
|
with open('/etc/shadowsocks-libev/manager.json') as f:
|
|
|
|
content = f.read()
|
|
|
|
content = re.sub(",\s*}","}",content)
|
|
|
|
data = json.loads(content)
|
|
|
|
data['port_key'][port] = key
|
|
|
|
with open('/etc/shadowsocks-libev/manager.json','w') as f:
|
|
|
|
json.dump(data,f, indent=4)
|
|
|
|
|
2019-12-26 19:25:11 +00:00
|
|
|
|
2019-12-27 20:42:47 +00:00
|
|
|
def remove_ss_user(port):
|
2019-12-26 19:25:11 +00:00
|
|
|
ss_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
|
2019-12-27 20:42:47 +00:00
|
|
|
data = 'remove: {"server_port": ' + port + '}'
|
|
|
|
ss_socket.sendto(data.encode(), ("127.0.0.1",8839));
|
|
|
|
with open('/etc/shadowsocks-libev/manager.json') as f:
|
|
|
|
content = f.read()
|
|
|
|
content = re.sub(",\s*}","}",content)
|
|
|
|
data = json.loads(content)
|
|
|
|
del data['port_key'][port]
|
|
|
|
with open('/etc/shadowsocks-libev/manager.json','w') as f:
|
|
|
|
json.dump(data,f, indent=4)
|
2019-12-26 19:25:11 +00:00
|
|
|
|
2020-01-09 08:48:02 +00:00
|
|
|
def add_glorytun_tcp(userid):
|
|
|
|
port = '650{:02d}'.format(userid)
|
|
|
|
with open('/etc/glorytun-tcp/tun0','r') as f, open('/etc/glorytun-tcp/tun' + str(userid),'a+') as n:
|
|
|
|
for line in f:
|
|
|
|
if 'PORT' in line:
|
|
|
|
n.write('PORT=' + port + "\n")
|
|
|
|
elif 'DEV' in line:
|
|
|
|
n.write('DEV=tun' + str(userid) + "\n")
|
|
|
|
else:
|
|
|
|
n.write(line)
|
|
|
|
glorytun_tcp_key = secrets.token_hex(32)
|
|
|
|
with open('/etc/glorytun-tcp/tun' + str(userid) + '.key','w') as f:
|
|
|
|
f.write(glorytun_tcp_key)
|
|
|
|
os.system("systemctl -q restart glorytun-tcp@tun" + str(userid))
|
|
|
|
|
|
|
|
def add_glorytun_udp(userid):
|
|
|
|
port = '650{:02d}'.format(userid)
|
|
|
|
with open('/etc/glorytun-udp/tun0','r') as f, open('/etc/glorytun-udp/tun' + str(userid),'a+') as n:
|
|
|
|
for line in f:
|
|
|
|
if 'BIND_PORT' in line:
|
|
|
|
n.write('BIND_PORT=' + port + "\n")
|
|
|
|
elif 'DEV' in line:
|
|
|
|
n.write('DEV=tun' + str(userid) + "\n")
|
|
|
|
else:
|
|
|
|
n.write(line)
|
|
|
|
glorytun_udp_key = secrets.token_hex(32)
|
|
|
|
with open('/etc/glorytun-udp/tun' + str(userid) + '.key','w') as f:
|
|
|
|
f.write(glorytun_udp_key)
|
|
|
|
os.system("systemctl -q restart glorytun-udp@tun" + str(userid))
|
|
|
|
|
2018-11-08 12:55:20 +00:00
|
|
|
def ordered(obj):
|
|
|
|
if isinstance(obj, dict):
|
|
|
|
return sorted((k, ordered(v)) for k, v in obj.items())
|
|
|
|
if isinstance(obj, list):
|
|
|
|
return sorted(ordered(x) for x in obj)
|
|
|
|
else:
|
|
|
|
return obj
|
|
|
|
|
2019-06-02 21:11:58 +00:00
|
|
|
def file_as_bytes(file):
|
|
|
|
with file:
|
|
|
|
return file.read()
|
|
|
|
|
2020-01-09 21:20:05 +00:00
|
|
|
def shorewall_add_port(username,port,proto,name,fwtype='ACCEPT'):
|
2019-06-02 21:11:58 +00:00
|
|
|
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall/rules', 'rb'))).hexdigest()
|
2019-04-18 19:09:26 +00:00
|
|
|
fd, tmpfile = mkstemp()
|
|
|
|
with open('/etc/shorewall/rules','r') as f, open(tmpfile,'a+') as n:
|
|
|
|
for line in f:
|
2020-01-09 21:20:05 +00:00
|
|
|
if fwtype == 'ACCEPT' and not port + ' # OMR open ' + name + ' port ' + proto in line and not port + ' # OMR ' + username + ' open ' + name + ' port ' + proto in line:
|
2019-09-29 18:54:54 +00:00
|
|
|
n.write(line)
|
2020-01-09 21:20:05 +00:00
|
|
|
elif fwtype == 'DNAT' and not port + ' # OMR redirect ' + name + ' port ' + proto in line and not port + ' # OMR ' + username + ' redirect ' + name + ' port ' + proto in line:
|
2019-09-29 18:54:54 +00:00
|
|
|
n.write(line)
|
|
|
|
if fwtype == 'ACCEPT':
|
2020-01-09 21:20:05 +00:00
|
|
|
n.write('ACCEPT net $FW ' + proto + ' ' + port + ' # OMR ' + username + ' open ' + name + ' port ' + proto + "\n")
|
2019-09-29 18:54:54 +00:00
|
|
|
elif fwtype == 'DNAT':
|
2020-01-09 21:20:05 +00:00
|
|
|
n.write('DNAT net vpn:$OMR_ADDR ' + proto + ' ' + port + ' # OMR ' + username + ' redirect ' + name + ' port ' + proto + "\n")
|
2019-09-29 18:54:54 +00:00
|
|
|
os.close(fd)
|
|
|
|
move(tmpfile,'/etc/shorewall/rules')
|
|
|
|
final_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall/rules', 'rb'))).hexdigest()
|
|
|
|
if not initial_md5 == final_md5:
|
|
|
|
os.system("systemctl -q reload shorewall")
|
|
|
|
|
2020-01-09 21:20:05 +00:00
|
|
|
def shorewall_del_port(username,port,proto,name,fwtype='ACCEPT'):
|
2019-09-29 18:54:54 +00:00
|
|
|
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall/rules', 'rb'))).hexdigest()
|
|
|
|
fd, tmpfile = mkstemp()
|
|
|
|
with open('/etc/shorewall/rules','r') as f, open(tmpfile,'a+') as n:
|
|
|
|
for line in f:
|
2020-01-09 21:20:05 +00:00
|
|
|
if fwtype == 'ACCEPT' and not port + ' # OMR open ' + name + ' port ' + proto in line and not port + ' # OMR ' + username + ' open ' + name + ' port ' + proto in line:
|
2019-09-29 18:54:54 +00:00
|
|
|
n.write(line)
|
2020-01-09 21:20:05 +00:00
|
|
|
elif fwtype == 'DNAT' and not port + ' # OMR redirect ' + name + ' port ' + proto in line and not port + ' # OMR ' + username + ' redirect ' + name + ' port ' + proto in line:
|
2019-04-18 19:09:26 +00:00
|
|
|
n.write(line)
|
|
|
|
os.close(fd)
|
|
|
|
move(tmpfile,'/etc/shorewall/rules')
|
2019-06-02 21:11:58 +00:00
|
|
|
final_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall/rules', 'rb'))).hexdigest()
|
|
|
|
if not initial_md5 == final_md5:
|
|
|
|
os.system("systemctl -q reload shorewall")
|
2019-04-18 19:09:26 +00:00
|
|
|
|
2020-01-09 21:20:05 +00:00
|
|
|
def shorewall6_add_port(username,port,proto,name,fwtype='ACCEPT'):
|
2020-01-09 08:48:02 +00:00
|
|
|
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall6/rules', 'rb'))).hexdigest()
|
|
|
|
fd, tmpfile = mkstemp()
|
|
|
|
with open('/etc/shorewall6/rules','r') as f, open(tmpfile,'a+') as n:
|
|
|
|
for line in f:
|
2020-01-09 21:20:05 +00:00
|
|
|
if fwtype == 'ACCEPT' and not port + ' # OMR open ' + name + ' port ' + proto in line and not port + ' # OMR ' + username + ' open ' + name + ' port ' + proto in line:
|
2020-01-09 08:48:02 +00:00
|
|
|
n.write(line)
|
2020-01-09 21:20:05 +00:00
|
|
|
elif fwtype == 'DNAT' and not port + ' # OMR redirect ' + name + ' port ' + proto in line and not port + ' # OMR ' + username + ' redirect ' + name + ' port ' + proto in line:
|
2020-01-09 08:48:02 +00:00
|
|
|
n.write(line)
|
|
|
|
if fwtype == 'ACCEPT':
|
2020-01-09 21:20:05 +00:00
|
|
|
n.write('ACCEPT net $FW ' + proto + ' ' + port + ' # OMR ' + username + ' open ' + name + ' port ' + proto + "\n")
|
2020-01-09 08:48:02 +00:00
|
|
|
elif fwtype == 'DNAT':
|
2020-01-09 21:20:05 +00:00
|
|
|
n.write('DNAT net vpn:$OMR_ADDR ' + proto + ' ' + port + ' # OMR ' + username + ' redirect ' + name + ' port ' + proto + "\n")
|
2020-01-09 08:48:02 +00:00
|
|
|
os.close(fd)
|
|
|
|
move(tmpfile,'/etc/shorewall6/rules')
|
|
|
|
final_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall6/rules', 'rb'))).hexdigest()
|
|
|
|
if not initial_md5 == final_md5:
|
|
|
|
os.system("systemctl -q reload shorewall6")
|
|
|
|
|
2020-01-09 21:20:05 +00:00
|
|
|
def shorewall6_del_port(username,port,proto,name,fwtype='ACCEPT'):
|
2020-01-09 08:48:02 +00:00
|
|
|
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall6/rules', 'rb'))).hexdigest()
|
|
|
|
fd, tmpfile = mkstemp()
|
|
|
|
with open('/etc/shorewall6/rules','r') as f, open(tmpfile,'a+') as n:
|
|
|
|
for line in f:
|
2020-01-09 21:20:05 +00:00
|
|
|
if fwtype == 'ACCEPT' and not port + ' # OMR open ' + name + ' port ' + proto in line and not port + ' # OMR ' + username + ' open ' + name + ' port ' + proto in line:
|
2020-01-09 08:48:02 +00:00
|
|
|
n.write(line)
|
2020-01-09 21:20:05 +00:00
|
|
|
elif fwtype == 'DNAT' and not port + ' # OMR redirect ' + name + ' port ' + proto in line and not port + ' # OMR ' + username + ' redirect ' + name + ' port ' + proto in line:
|
2020-01-09 08:48:02 +00:00
|
|
|
n.write(line)
|
|
|
|
os.close(fd)
|
|
|
|
move(tmpfile,'/etc/shorewall6/rules')
|
|
|
|
final_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall6/rules', 'rb'))).hexdigest()
|
|
|
|
if not initial_md5 == final_md5:
|
|
|
|
os.system("systemctl -q reload shorewall6")
|
|
|
|
|
2019-12-26 19:25:11 +00:00
|
|
|
def set_lastchange(sync = 0):
|
2019-08-12 14:43:05 +00:00
|
|
|
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json') as f:
|
|
|
|
content = f.read()
|
|
|
|
content = re.sub(",\s*}","}",content)
|
|
|
|
try:
|
|
|
|
data = json.loads(content)
|
|
|
|
except ValueError as e:
|
|
|
|
return jsonify({'error': 'Config file not readable','route': 'lastchange'}), 200
|
2019-12-26 19:25:11 +00:00
|
|
|
data["lastchange"] = time.time() + sync
|
2019-08-12 14:43:05 +00:00
|
|
|
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json','w') as outfile:
|
|
|
|
json.dump(data,outfile,indent=4)
|
2019-04-18 19:09:26 +00:00
|
|
|
|
2019-12-26 19:25:11 +00:00
|
|
|
def modif_config_user(user,changes):
|
|
|
|
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json') as f:
|
|
|
|
content = json.load(f)
|
|
|
|
content['users'][0][user.username].update(changes)
|
|
|
|
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json','w') as f:
|
|
|
|
json.dump(content,f)
|
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json') as f:
|
|
|
|
omr_config_data = json.load(f)
|
2019-04-18 19:09:26 +00:00
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
fake_users_db = omr_config_data['users'][0]
|
2018-11-08 12:55:20 +00:00
|
|
|
|
2019-11-16 19:49:26 +00:00
|
|
|
def verify_password(plain_password, user_password):
|
|
|
|
if plain_password == user_password:
|
2019-11-02 17:10:10 +00:00
|
|
|
log.debug("password true")
|
|
|
|
return True
|
|
|
|
return False
|
2018-11-08 17:05:34 +00:00
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
def get_password_hash(password):
|
|
|
|
return password
|
|
|
|
|
|
|
|
def get_user(db, username: str):
|
|
|
|
if username in db:
|
|
|
|
user_dict = db[username]
|
|
|
|
return UserInDB(**user_dict)
|
|
|
|
|
|
|
|
def authenticate_user(fake_db, username: str, password: str):
|
|
|
|
user = get_user(fake_db, username)
|
|
|
|
if not user:
|
|
|
|
log.debug("user doesn't exist")
|
|
|
|
return False
|
2019-11-16 19:49:26 +00:00
|
|
|
if not verify_password(password, user.user_password):
|
2019-11-02 17:10:10 +00:00
|
|
|
log.debug("wrong password")
|
|
|
|
return False
|
|
|
|
return user
|
|
|
|
|
|
|
|
class Token(BaseModel):
|
|
|
|
access_token: str
|
|
|
|
token_type: str
|
|
|
|
|
|
|
|
|
|
|
|
class TokenData(BaseModel):
|
|
|
|
username: str = None
|
|
|
|
|
|
|
|
class User(BaseModel):
|
|
|
|
username: str
|
2019-12-26 19:25:11 +00:00
|
|
|
vpn: str = None
|
|
|
|
vpn_port: int = None
|
|
|
|
vpn_client_ip: str = None
|
2020-01-09 08:48:02 +00:00
|
|
|
permission: str = 'rw'
|
2019-11-13 07:39:00 +00:00
|
|
|
shadowsocks_port: int = None
|
2020-01-09 08:48:02 +00:00
|
|
|
disabled: bool = 'false'
|
|
|
|
userid: int = None
|
2019-11-02 17:10:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
class UserInDB(User):
|
2019-11-16 19:49:26 +00:00
|
|
|
user_password: str
|
2019-11-02 17:10:10 +00:00
|
|
|
|
|
|
|
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token")
|
2019-12-30 19:49:39 +00:00
|
|
|
app = FastAPI(redoc_url=None)
|
2018-11-08 12:55:20 +00:00
|
|
|
|
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
|
|
|
|
|
|
|
oauth2_scheme = OAuth2PasswordBearer(
|
|
|
|
tokenUrl="/token",
|
|
|
|
scopes={"me": "Read information about the current user.", "items": "Read items."},
|
|
|
|
)
|
|
|
|
|
|
|
|
def create_access_token(*, data: dict, expires_delta: timedelta = None):
|
|
|
|
to_encode = data.copy()
|
|
|
|
if expires_delta:
|
|
|
|
expire = datetime.utcnow() + expires_delta
|
|
|
|
else:
|
|
|
|
expire = datetime.utcnow() + timedelta(minutes=15)
|
|
|
|
to_encode.update({"exp": expire})
|
|
|
|
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
|
|
|
|
return encoded_jwt
|
|
|
|
|
|
|
|
async def get_current_user(token: str = Depends(oauth2_scheme)):
|
|
|
|
credentials_exception = HTTPException(
|
|
|
|
status_code=HTTP_401_UNAUTHORIZED,
|
|
|
|
detail="Could not validate credentials",
|
|
|
|
headers={"WWW-Authenticate": "Bearer"},
|
|
|
|
)
|
|
|
|
try:
|
|
|
|
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
|
|
|
|
username: str = payload.get("sub")
|
|
|
|
if username is None:
|
|
|
|
raise credentials_exception
|
|
|
|
token_data = TokenData(username=username)
|
|
|
|
except PyJWTError:
|
|
|
|
raise credentials_exception
|
|
|
|
user = get_user(fake_users_db, username=token_data.username)
|
|
|
|
if user is None:
|
|
|
|
raise credentials_exception
|
|
|
|
return user
|
|
|
|
|
|
|
|
# Provide a method to create access tokens. The create_jwt()
|
|
|
|
# function is used to actually generate the token
|
|
|
|
@app.post('/token', response_model=Token)
|
|
|
|
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
|
|
|
|
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
|
|
|
|
if not user:
|
|
|
|
raise HTTPException(status_code=400, detail="Incorrect username or password")
|
2018-11-08 12:55:20 +00:00
|
|
|
|
|
|
|
# Identity can be any data that is json serializable
|
2019-11-02 17:10:10 +00:00
|
|
|
access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
|
|
|
|
access_token = create_access_token(
|
|
|
|
data={"sub": user.username}, expires_delta=access_token_expires
|
|
|
|
)
|
|
|
|
return {"access_token": access_token, "token_type": "bearer"}
|
2018-11-08 12:55:20 +00:00
|
|
|
|
|
|
|
# Get VPS status
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.get('/status')
|
2019-11-13 07:39:00 +00:00
|
|
|
def status(current_user: User = Depends(get_current_user)):
|
2018-11-29 13:47:05 +00:00
|
|
|
vps_loadavg = os.popen("cat /proc/loadavg | awk '{print $1\" \"$2\" \"$3}'").read().rstrip()
|
|
|
|
vps_uptime = os.popen("cat /proc/uptime | awk '{print $1}'").read().rstrip()
|
2019-07-13 05:30:58 +00:00
|
|
|
vps_hostname = socket.gethostname()
|
2019-11-13 07:39:00 +00:00
|
|
|
vps_current_time = time.time()
|
2019-12-26 19:25:11 +00:00
|
|
|
vps_kernel = os.popen('uname -r').read().rstrip()
|
|
|
|
vps_omr_version = os.popen("grep -s 'OpenMPTCProuter VPS' /etc/* | awk '{print $4}'").read().rstrip()
|
2018-12-06 09:48:23 +00:00
|
|
|
mptcp_enabled = os.popen('sysctl -n net.mptcp.mptcp_enabled').read().rstrip()
|
2019-12-27 20:42:47 +00:00
|
|
|
shadowsocks_port = current_user.shadowsocks_port
|
|
|
|
if not shadowsocks_port == None:
|
|
|
|
ss_traffic = get_bytes_ss(current_user.shadowsocks_port)
|
|
|
|
else:
|
|
|
|
ss_traffic = 0
|
2018-11-29 13:47:05 +00:00
|
|
|
|
2018-11-08 12:55:20 +00:00
|
|
|
if iface:
|
2019-12-27 20:42:47 +00:00
|
|
|
return {'vps': {'time': vps_current_time,'loadavg': vps_loadavg,'uptime': vps_uptime,'mptcp': mptcp_enabled,'hostname': vps_hostname,'kernel': vps_kernel, 'vps_omr_version': vps_omr_version}, 'network': {'tx': get_bytes('tx',iface),'rx': get_bytes('rx',iface)}, 'shadowsocks': {'traffic': ss_traffic}}
|
2018-11-08 12:55:20 +00:00
|
|
|
else:
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'error': 'No iface defined','route': 'status'}
|
2018-11-08 12:55:20 +00:00
|
|
|
|
|
|
|
# Get VPS config
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.get('/config')
|
|
|
|
def config(current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
userid = current_user.userid
|
|
|
|
if userid == None:
|
|
|
|
userid = 0
|
2019-03-27 20:28:18 +00:00
|
|
|
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json') as f:
|
|
|
|
try:
|
|
|
|
omr_config_data = json.load(f)
|
|
|
|
except ValueError as e:
|
|
|
|
omr_config_data = {}
|
2019-11-16 19:49:26 +00:00
|
|
|
with open('/etc/shadowsocks-libev/manager.json') as f:
|
2018-11-29 21:43:02 +00:00
|
|
|
content = f.read()
|
|
|
|
content = re.sub(",\s*}","}",content)
|
2018-12-06 09:48:23 +00:00
|
|
|
try:
|
|
|
|
data = json.loads(content)
|
|
|
|
except ValueError as e:
|
|
|
|
data = {'key': '', 'server_port': 65101, 'method': 'chacha20'}
|
2019-11-16 19:49:26 +00:00
|
|
|
#shadowsocks_port = data["server_port"]
|
|
|
|
shadowsocks_port = current_user.shadowsocks_port
|
2019-12-27 20:42:47 +00:00
|
|
|
if not shadowsocks_port == None:
|
|
|
|
shadowsocks_key = data["port_key"][str(shadowsocks_port)]
|
|
|
|
else:
|
|
|
|
shadowsocks_key = ''
|
2018-11-08 12:55:20 +00:00
|
|
|
shadowsocks_method = data["method"]
|
2018-11-29 22:14:23 +00:00
|
|
|
if 'fast_open' in data:
|
|
|
|
shadowsocks_fast_open = data["fast_open"]
|
|
|
|
else:
|
|
|
|
shadowsocks_fast_open = False
|
2019-01-02 14:10:38 +00:00
|
|
|
if 'reuse_port' in data:
|
2018-11-29 22:14:23 +00:00
|
|
|
shadowsocks_reuse_port = data["reuse_port"]
|
|
|
|
else:
|
|
|
|
shadowsocks_reuse_port = False
|
|
|
|
if 'no_delay' in data:
|
|
|
|
shadowsocks_no_delay = data["no_delay"]
|
|
|
|
else:
|
|
|
|
shadowsocks_no_delay = False
|
|
|
|
if 'mptcp' in data:
|
|
|
|
shadowsocks_mptcp = data["mptcp"]
|
|
|
|
else:
|
|
|
|
shadowsocks_mptcp = False
|
2019-01-02 14:10:38 +00:00
|
|
|
if 'ebpf' in data:
|
|
|
|
shadowsocks_ebpf = data["ebpf"]
|
|
|
|
else:
|
|
|
|
shadowsocks_ebpf = False
|
2018-11-08 12:55:20 +00:00
|
|
|
if "plugin" in data:
|
|
|
|
shadowsocks_obfs = True
|
2019-01-25 19:43:49 +00:00
|
|
|
if 'v2ray' in data["plugin"]:
|
|
|
|
shadowsocks_obfs_plugin = 'v2ray'
|
|
|
|
else:
|
|
|
|
shadowsocks_obfs_plugin = 'obfs'
|
|
|
|
if 'tls' in data["plugin_opts"]:
|
|
|
|
shadowsocks_obfs_type = 'tls'
|
|
|
|
else:
|
2019-01-25 21:17:55 +00:00
|
|
|
shadowsocks_obfs_type = 'http'
|
2018-11-08 12:55:20 +00:00
|
|
|
else:
|
|
|
|
shadowsocks_obfs = False
|
2019-01-25 19:43:49 +00:00
|
|
|
shadowsocks_obfs_plugin = ''
|
|
|
|
shadowsocks_obfs_type = ''
|
2019-12-30 19:49:39 +00:00
|
|
|
shadowsocks_port = current_user.shadowsocks_port
|
|
|
|
if not shadowsocks_port == None:
|
|
|
|
ss_traffic = get_bytes_ss(current_user.shadowsocks_port)
|
|
|
|
else:
|
|
|
|
ss_traffic = 0
|
2020-01-09 08:48:02 +00:00
|
|
|
if os.path.isfile('/etc/glorytun-tcp/tun' + str(userid) +'.key'):
|
|
|
|
glorytun_key = open('/etc/glorytun-tcp/tun' + str(userid) + '.key').readline().rstrip()
|
2018-12-06 09:48:23 +00:00
|
|
|
else:
|
|
|
|
glorytun_key = ''
|
|
|
|
glorytun_port = '65001'
|
2019-05-23 19:55:49 +00:00
|
|
|
glorytun_chacha = False
|
2020-01-09 08:48:02 +00:00
|
|
|
if os.path.isfile('/etc/glorytun-tcp/tun' + str(userid)):
|
|
|
|
with open('/etc/glorytun-tcp/tun' + str(userid),"r") as glorytun_file:
|
2018-12-06 09:48:23 +00:00
|
|
|
for line in glorytun_file:
|
|
|
|
if 'PORT=' in line:
|
|
|
|
glorytun_port = line.replace(line[:5], '').rstrip()
|
2019-05-23 19:55:49 +00:00
|
|
|
if 'chacha' in line:
|
|
|
|
glorytun_chacha = True
|
2020-01-09 08:48:02 +00:00
|
|
|
if userid == 0:
|
|
|
|
if 'glorytun_tcp_type' in omr_config_data:
|
|
|
|
if omr_config_data['glorytun_tcp_type'] == 'static':
|
|
|
|
glorytun_tcp_host_ip = '10.255.255.1'
|
|
|
|
glorytun_tcp_client_ip = '10.255.255.2'
|
|
|
|
else:
|
|
|
|
glorytun_tcp_host_ip = 'dhcp'
|
|
|
|
glorytun_tcp_client_ip = 'dhcp'
|
|
|
|
else:
|
2019-03-27 20:28:18 +00:00
|
|
|
glorytun_tcp_host_ip = '10.255.255.1'
|
|
|
|
glorytun_tcp_client_ip = '10.255.255.2'
|
|
|
|
else:
|
2020-01-09 08:48:02 +00:00
|
|
|
#glorytun_tcp_host_ip = '10.255.255.' + '{:02d}'.format(userid) + '1'
|
|
|
|
#glorytun_tcp_client_ip = '10.255.255.' + '{:02d}'.format(userid) + '2'
|
|
|
|
glorytun_tcp_host_ip = '10.255.255.' + str(userid) + '1'
|
|
|
|
glorytun_tcp_client_ip = '10.255.255.' + str(userid) + '2'
|
|
|
|
if userid == 0:
|
|
|
|
if 'glorytun_udp_type' in omr_config_data:
|
|
|
|
if omr_config_data['glorytun_udp_type'] == 'static':
|
|
|
|
glorytun_udp_host_ip = '10.255.254.1'
|
|
|
|
glorytun_udp_client_ip = '10.255.254.2'
|
|
|
|
else:
|
|
|
|
glorytun_udp_host_ip = 'dhcp'
|
|
|
|
glorytun_udp_client_ip = 'dhcp'
|
|
|
|
else:
|
2019-05-07 19:45:11 +00:00
|
|
|
glorytun_udp_host_ip = '10.255.254.1'
|
|
|
|
glorytun_udp_client_ip = '10.255.254.2'
|
2019-03-27 20:28:18 +00:00
|
|
|
else:
|
2020-01-09 08:48:02 +00:00
|
|
|
#glorytun_udp_host_ip = '10.255.254.' + '{:02d}'.format(userid) + '1'
|
|
|
|
#glorytun_udp_client_ip = '10.255.254.' + '{:02d}'.format(userid) + '2'
|
|
|
|
glorytun_udp_host_ip = '10.255.254.' + str(userid) + '1'
|
|
|
|
glorytun_udp_client_ip = '10.255.254.' + str(userid) + '2'
|
2018-12-03 10:07:03 +00:00
|
|
|
available_vpn = ["glorytun-tcp", "glorytun-udp"]
|
2019-08-02 15:22:43 +00:00
|
|
|
if os.path.isfile('/etc/dsvpn/dsvpn.key'):
|
|
|
|
dsvpn_key = open('/etc/dsvpn/dsvpn.key').readline().rstrip()
|
|
|
|
available_vpn.append("dsvpn")
|
|
|
|
else:
|
|
|
|
dsvpn_key = ''
|
|
|
|
dsvpn_port = '65011'
|
2019-08-07 18:42:42 +00:00
|
|
|
dsvpn_host_ip = '10.255.251.1'
|
|
|
|
dsvpn_client_ip = '10.255.251.2'
|
2018-11-23 14:19:30 +00:00
|
|
|
|
2019-03-28 19:17:06 +00:00
|
|
|
if os.path.isfile('/etc/iperf3/public.pem'):
|
|
|
|
with open('/etc/iperf3/public.pem',"rb") as iperfkey_file:
|
2019-03-27 20:28:18 +00:00
|
|
|
iperf_keyb = base64.b64encode(iperfkey_file.read())
|
|
|
|
iperf3_key = iperf_keyb.decode('utf-8')
|
|
|
|
else:
|
|
|
|
iperf3_key = ''
|
|
|
|
|
2019-04-18 19:09:26 +00:00
|
|
|
if os.path.isfile('/etc/pihole/setupVars.conf'):
|
|
|
|
pihole = True
|
|
|
|
else:
|
|
|
|
pihole = False
|
2019-03-27 20:28:18 +00:00
|
|
|
|
2019-11-13 07:39:00 +00:00
|
|
|
#if os.path.isfile('/etc/openvpn/server/static.key'):
|
|
|
|
# with open('/etc/openvpn/server/static.key',"rb") as ovpnkey_file:
|
|
|
|
# openvpn_keyb = base64.b64encode(ovpnkey_file.read())
|
|
|
|
# openvpn_key = openvpn_keyb.decode('utf-8')
|
|
|
|
# available_vpn.append("openvpn")
|
|
|
|
#else:
|
|
|
|
# openvpn_key = ''
|
|
|
|
openvpn_key = ''
|
2019-12-27 20:42:47 +00:00
|
|
|
if os.path.isfile('/etc/openvpn/ca/pki/private/' + current_user.username + '.key'):
|
|
|
|
with open('/etc/openvpn/ca/pki/private/' + current_user.username + '.key',"rb") as ovpnkey_file:
|
2019-10-25 18:22:00 +00:00
|
|
|
openvpn_keyb = base64.b64encode(ovpnkey_file.read())
|
|
|
|
openvpn_client_key = openvpn_keyb.decode('utf-8')
|
|
|
|
else:
|
|
|
|
openvpn_client_key = ''
|
2020-01-06 11:43:20 +00:00
|
|
|
if os.path.isfile('/etc/openvpn/ca/pki/issued/' + current_user.username + '.crt'):
|
|
|
|
with open('/etc/openvpn/ca/pki/issued/' + current_user.username + '.crt',"rb") as ovpnkey_file:
|
2019-10-25 18:22:00 +00:00
|
|
|
openvpn_keyb = base64.b64encode(ovpnkey_file.read())
|
|
|
|
openvpn_client_crt = openvpn_keyb.decode('utf-8')
|
2019-11-13 07:39:00 +00:00
|
|
|
available_vpn.append("openvpn")
|
2019-10-25 18:22:00 +00:00
|
|
|
else:
|
|
|
|
openvpn_client_crt = ''
|
2019-12-27 20:42:47 +00:00
|
|
|
if os.path.isfile('/etc/openvpn/ca/pki/ca.crt'):
|
|
|
|
with open('/etc/openvpn/ca/pki/ca.crt',"rb") as ovpnkey_file:
|
2019-10-25 18:22:00 +00:00
|
|
|
openvpn_keyb = base64.b64encode(ovpnkey_file.read())
|
|
|
|
openvpn_client_ca = openvpn_keyb.decode('utf-8')
|
|
|
|
else:
|
|
|
|
openvpn_client_ca = ''
|
2018-12-06 09:48:23 +00:00
|
|
|
openvpn_port = '65301'
|
|
|
|
if os.path.isfile('/etc/openvpn/openvpn-tun0.conf'):
|
|
|
|
with open('/etc/openvpn/openvpn-tun0.conf',"r") as openvpn_file:
|
|
|
|
for line in openvpn_file:
|
|
|
|
if 'port ' in line:
|
|
|
|
openvpn_port = line.replace(line[:5], '').rstrip()
|
2019-04-20 16:16:22 +00:00
|
|
|
openvpn_host_ip = '10.255.252.1'
|
2019-11-13 07:39:00 +00:00
|
|
|
#openvpn_client_ip = '10.255.252.2'
|
|
|
|
openvpn_client_ip = 'dhcp'
|
2018-11-23 14:19:30 +00:00
|
|
|
|
|
|
|
if os.path.isfile('/etc/mlvpn/mlvpn0.conf'):
|
|
|
|
mlvpn_config = configparser.ConfigParser()
|
2019-11-13 07:39:00 +00:00
|
|
|
mlvpn_config.read_file(open(r'/etc/mlvpn/mlvpn0.conf'))
|
2018-11-23 14:19:30 +00:00
|
|
|
mlvpn_key = mlvpn_config.get('general','password').strip('"')
|
2018-12-03 10:07:03 +00:00
|
|
|
available_vpn.append("mlvpn")
|
2018-11-23 14:19:30 +00:00
|
|
|
else:
|
|
|
|
mlvpn_key = ''
|
2019-04-20 16:16:22 +00:00
|
|
|
mlvpn_host_ip = '10.255.253.1'
|
|
|
|
mlvpn_client_ip = '10.255.253.2'
|
2018-12-03 10:07:03 +00:00
|
|
|
|
2018-11-14 16:34:13 +00:00
|
|
|
|
2018-11-21 09:00:00 +00:00
|
|
|
mptcp_enabled = os.popen('sysctl -n net.mptcp.mptcp_enabled').read().rstrip()
|
2018-11-14 16:34:13 +00:00
|
|
|
mptcp_checksum = os.popen('sysctl -n net.mptcp.mptcp_checksum').read().rstrip()
|
|
|
|
mptcp_path_manager = os.popen('sysctl -n net.mptcp.mptcp_path_manager').read().rstrip()
|
|
|
|
mptcp_scheduler = os.popen('sysctl -n net.mptcp.mptcp_scheduler').read().rstrip()
|
|
|
|
mptcp_syn_retries = os.popen('sysctl -n net.mptcp.mptcp_syn_retries').read().rstrip()
|
|
|
|
|
|
|
|
congestion_control = os.popen('sysctl -n net.ipv4.tcp_congestion_control').read().rstrip()
|
2018-11-08 12:55:20 +00:00
|
|
|
|
2018-11-21 09:00:00 +00:00
|
|
|
ipv6_network = os.popen('ip -6 addr show ' + iface +' | grep -oP "(?<=inet6 ).*(?= scope global)"').read().rstrip()
|
2019-02-28 07:26:37 +00:00
|
|
|
#ipv6_addr = os.popen('wget -6 -qO- -T 2 ipv6.openmptcprouter.com').read().rstrip()
|
2019-03-10 20:44:33 +00:00
|
|
|
ipv6_addr = os.popen('ip -6 addr show ' + iface +' | grep -oP "(?<=inet6 ).*(?= scope global)" | cut -d/ -f1').read().rstrip()
|
2019-07-25 06:25:12 +00:00
|
|
|
#ipv4_addr = os.popen('wget -4 -qO- -T 1 https://ip.openmptcprouter.com').read().rstrip()
|
2019-08-07 18:42:42 +00:00
|
|
|
ipv4_addr = os.popen("dig -4 TXT +timeout=2 +tries=1 +short o-o.myaddr.l.google.com @ns1.google.com | awk -F'\"' '{ print $2}'").read().rstrip()
|
2019-07-25 06:25:12 +00:00
|
|
|
if ipv4_addr == '':
|
|
|
|
ipv4_addr = os.popen('wget -4 -qO- -T 1 http://ifconfig.co').read().rstrip()
|
|
|
|
#ipv4_addr = ""
|
2018-11-21 09:00:00 +00:00
|
|
|
|
2019-06-15 18:31:01 +00:00
|
|
|
test_aes = os.popen('cat /proc/cpuinfo | grep aes').read().rstrip()
|
|
|
|
if test_aes == '':
|
|
|
|
vps_aes = False
|
|
|
|
else:
|
|
|
|
vps_aes = True
|
2018-11-21 09:00:00 +00:00
|
|
|
vps_kernel = os.popen('uname -r').read().rstrip()
|
|
|
|
vps_machine = os.popen('uname -m').read().rstrip()
|
2019-03-29 17:27:58 +00:00
|
|
|
vps_omr_version = os.popen("grep -s 'OpenMPTCProuter VPS' /etc/* | awk '{print $4}'").read().rstrip()
|
2018-11-29 13:47:05 +00:00
|
|
|
vps_loadavg = os.popen("cat /proc/loadavg | awk '{print $1" "$2" "$3}'").read().rstrip()
|
|
|
|
vps_uptime = os.popen("cat /proc/uptime | awk '{print $1}'").read().rstrip()
|
2019-07-25 06:25:12 +00:00
|
|
|
vps_domain = os.popen('wget -4 -qO- -T 1 http://hostname.openmptcprouter.com').read().rstrip()
|
|
|
|
#vps_domain = os.popen('dig -4 +short +times=3 +tries=1 -x ' + ipv4_addr + " | sed 's/\.$//'").read().rstrip()
|
2020-01-09 08:48:02 +00:00
|
|
|
user_permission = current_user.permission
|
2018-11-16 13:14:08 +00:00
|
|
|
|
2020-01-06 20:18:29 +00:00
|
|
|
vpn = current_user.vpn
|
2020-01-09 08:48:02 +00:00
|
|
|
if current_user.permission == 'ro':
|
|
|
|
del available_vpn
|
|
|
|
available_vpn = [vpn]
|
2019-06-24 16:14:16 +00:00
|
|
|
|
2018-11-14 14:10:42 +00:00
|
|
|
shorewall_redirect = "enable"
|
2018-11-08 17:22:43 +00:00
|
|
|
with open('/etc/shorewall/rules','r') as f:
|
|
|
|
for line in f:
|
|
|
|
if '#DNAT net vpn:$OMR_ADDR tcp 1-64999' in line:
|
2018-11-14 14:10:42 +00:00
|
|
|
shorewall_redirect = "disable"
|
2018-11-08 17:22:43 +00:00
|
|
|
|
2020-01-09 08:48:02 +00:00
|
|
|
return {'vps': {'kernel': vps_kernel,'machine': vps_machine,'omr_version': vps_omr_version,'loadavg': vps_loadavg,'uptime': vps_uptime,'aes': vps_aes},'shadowsocks': {'traffic': ss_traffic,'key': shadowsocks_key,'port': shadowsocks_port,'method': shadowsocks_method,'fast_open': shadowsocks_fast_open,'reuse_port': shadowsocks_reuse_port,'no_delay': shadowsocks_no_delay,'mptcp': shadowsocks_mptcp,'ebpf': shadowsocks_ebpf,'obfs': shadowsocks_obfs,'obfs_plugin': shadowsocks_obfs_plugin,'obfs_type': shadowsocks_obfs_type},'glorytun': {'key': glorytun_key,'udp': {'host_ip': glorytun_udp_host_ip,'client_ip': glorytun_udp_client_ip},'tcp': {'host_ip': glorytun_tcp_host_ip,'client_ip': glorytun_tcp_client_ip},'port': glorytun_port,'chacha': glorytun_chacha},'dsvpn': {'key': dsvpn_key, 'host_ip': dsvpn_host_ip, 'client_ip': dsvpn_client_ip, 'port': dsvpn_port},'openvpn': {'key': openvpn_key,'client_key': openvpn_client_key,'client_crt': openvpn_client_crt,'client_ca': openvpn_client_ca,'host_ip': openvpn_host_ip, 'client_ip': openvpn_client_ip, 'port': openvpn_port},'mlvpn': {'key': mlvpn_key, 'host_ip': mlvpn_host_ip, 'client_ip': mlvpn_client_ip},'shorewall': {'redirect_ports': shorewall_redirect},'mptcp': {'enabled': mptcp_enabled,'checksum': mptcp_checksum,'path_manager': mptcp_path_manager,'scheduler': mptcp_scheduler, 'syn_retries': mptcp_syn_retries},'network': {'congestion_control': congestion_control,'ipv6_network': ipv6_network,'ipv6': ipv6_addr,'ipv4': ipv4_addr,'domain': vps_domain},'vpn': {'available': available_vpn,'current': vpn},'iperf': {'user': 'openmptcprouter','password': 'openmptcprouter', 'key': iperf3_key},'pihole': {'state': pihole},'user': {'name': current_user.username,'permission': user_permission}}
|
2018-11-08 12:55:20 +00:00
|
|
|
|
|
|
|
# Set shadowsocks config
|
2019-11-02 17:32:35 +00:00
|
|
|
class ShadowsocksConfigparams(BaseModel):
|
|
|
|
port: int
|
|
|
|
method: str
|
2019-11-24 18:48:22 +00:00
|
|
|
fast_open: bool
|
2019-11-02 17:32:35 +00:00
|
|
|
reuse_port: bool
|
|
|
|
no_delay: bool
|
|
|
|
mptcp: bool
|
|
|
|
obfs: bool
|
2019-11-24 18:48:22 +00:00
|
|
|
obfs_plugin: str
|
2019-11-02 17:32:35 +00:00
|
|
|
obfs_type: str
|
|
|
|
key: str
|
|
|
|
|
2019-11-13 18:21:02 +00:00
|
|
|
@app.post('/shadowsocks')
|
2019-11-02 17:32:35 +00:00
|
|
|
def shadowsocks(*,params: ShadowsocksConfigparams,current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
if current_user.permission == "ro":
|
2019-12-26 19:25:11 +00:00
|
|
|
set_lastchange(10)
|
|
|
|
return {'result': 'permission','reason': 'Read only user','route': 'shadowsocks'}
|
2019-12-17 18:10:09 +00:00
|
|
|
ipv6_network = os.popen('ip -6 addr show ' + iface +' | grep -oP "(?<=inet6 ).*(?= scope global)"').read().rstrip()
|
2019-11-16 19:49:26 +00:00
|
|
|
with open('/etc/shadowsocks-libev/manager.json') as f:
|
2018-11-29 21:43:02 +00:00
|
|
|
content = f.read()
|
|
|
|
content = re.sub(",\s*}","}",content)
|
2018-12-06 09:48:23 +00:00
|
|
|
try:
|
|
|
|
data = json.loads(content)
|
|
|
|
except ValueError as e:
|
|
|
|
data = {'timeout': 600, 'verbose': 0, 'prefer_ipv6': False}
|
2018-11-29 21:43:02 +00:00
|
|
|
#key = data["key"]
|
2018-12-06 09:48:23 +00:00
|
|
|
if 'timeout' in data:
|
|
|
|
timeout = data["timeout"]
|
2018-11-29 22:14:23 +00:00
|
|
|
if 'verbose' in data:
|
|
|
|
verbose = data["verbose"]
|
|
|
|
else:
|
|
|
|
verbose = 0
|
2018-11-08 12:55:20 +00:00
|
|
|
prefer_ipv6 = data["prefer_ipv6"]
|
2019-11-02 17:32:35 +00:00
|
|
|
port = params.port
|
|
|
|
method = params.method
|
|
|
|
fast_open = params.fast_open
|
|
|
|
reuse_port = params.reuse_port
|
|
|
|
no_delay = params.no_delay
|
|
|
|
mptcp = params.mptcp
|
|
|
|
obfs = params.obfs
|
|
|
|
obfs_plugin = params.obfs_plugin
|
|
|
|
obfs_type = params.obfs_type
|
2019-11-24 18:48:22 +00:00
|
|
|
ebpf = 0
|
2019-11-02 17:32:35 +00:00
|
|
|
key = params.key
|
2019-11-16 19:49:26 +00:00
|
|
|
portkey = data["port_key"]
|
2019-12-26 19:25:11 +00:00
|
|
|
modif_config_user(current_user,{'shadowsocks_port': port})
|
2019-11-16 19:49:26 +00:00
|
|
|
portkey[str(port)] = key
|
2019-08-29 20:39:22 +00:00
|
|
|
#ipv4_addr = os.popen('wget -4 -qO- -T 2 http://ip.openmptcprouter.com').read().rstrip()
|
2019-04-18 20:34:14 +00:00
|
|
|
vps_domain = os.popen('wget -4 -qO- -T 2 http://hostname.openmptcprouter.com').read().rstrip()
|
2019-04-18 19:09:26 +00:00
|
|
|
|
2019-01-06 17:53:06 +00:00
|
|
|
if port is None or method is None or fast_open is None or reuse_port is None or no_delay is None or key is None:
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'error','reason': 'Invalid parameters','route': 'shadowsocks'}
|
2019-12-17 18:10:09 +00:00
|
|
|
if ipv6_network == '':
|
|
|
|
if obfs:
|
|
|
|
if obfs_plugin == "v2ray":
|
|
|
|
if obfs_type == "tls":
|
|
|
|
if vps_domain == '':
|
|
|
|
shadowsocks_config = {'server': '0.0.0.0','port_key': portkey,'local_port': 1081,'mode': 'tcp_and_udp','timeout': timeout,'method': method,'verbose': verbose,'ipv6_first': True, 'prefer_ipv6': prefer_ipv6,'fast_open': fast_open,'no_delay': no_delay,'reuse_port': reuse_port,'mptcp': mptcp,'ebpf': ebpf,'acl': '/etc/shadowsocks-libev/local.acl', 'plugin': '/usr/local/bin/v2ray-plugin','plugin_opts': 'server;tls'}
|
|
|
|
else:
|
|
|
|
shadowsocks_config = {'server': '0.0.0.0','port_key': portkey,'local_port': 1081,'mode': 'tcp_and_udp','timeout': timeout,'method': method,'verbose': verbose,'ipv6_first': True, 'prefer_ipv6': prefer_ipv6,'fast_open': fast_open,'no_delay': no_delay,'reuse_port': reuse_port,'mptcp': mptcp,'ebpf': ebpf,'acl': '/etc/shadowsocks-libev/local.acl', 'plugin': '/usr/local/bin/v2ray-plugin','plugin_opts': 'server;tls;host=' + vps_domain}
|
2019-04-18 19:09:26 +00:00
|
|
|
else:
|
2019-12-17 18:10:09 +00:00
|
|
|
shadowsocks_config = {'server': '0.0.0.0','port_key': portkey,'local_port': 1081,'mode': 'tcp_and_udp','timeout': timeout,'method': method,'verbose': verbose,'ipv6_first': True, 'prefer_ipv6': prefer_ipv6,'fast_open': fast_open,'no_delay': no_delay,'reuse_port': reuse_port,'mptcp': mptcp,'ebpf': ebpf,'acl': '/etc/shadowsocks-libev/local.acl', 'plugin': '/usr/local/bin/v2ray-plugin','plugin_opts': 'server'}
|
2019-01-25 19:43:49 +00:00
|
|
|
else:
|
2019-12-17 18:10:09 +00:00
|
|
|
if obfs_type == 'tls':
|
|
|
|
if vps_domain == '':
|
|
|
|
shadowsocks_config = {'server': '0.0.0.0','port_key': portkey,'local_port': 1081,'mode': 'tcp_and_udp','timeout': timeout,'method': method,'verbose': verbose,'ipv6_first': True, 'prefer_ipv6': prefer_ipv6,'fast_open': fast_open,'no_delay': no_delay,'reuse_port': reuse_port,'mptcp': mptcp,'ebpf': ebpf,'acl': '/etc/shadowsocks-libev/local.acl', 'plugin': '/usr/local/bin/obfs-server','plugin_opts': 'obfs=tls;mptcp;fast-open;t=400'}
|
|
|
|
else:
|
|
|
|
shadowsocks_config = {'server': '0.0.0.0','port_key': portkey,'local_port': 1081,'mode': 'tcp_and_udp','timeout': timeout,'method': method,'verbose': verbose,'ipv6_first': True, 'prefer_ipv6': prefer_ipv6,'fast_open': fast_open,'no_delay': no_delay,'reuse_port': reuse_port,'mptcp': mptcp,'ebpf': ebpf,'acl': '/etc/shadowsocks-libev/local.acl', 'plugin': '/usr/local/bin/obfs-server','plugin_opts': 'obfs=tls;mptcp;fast-open;t=400;host=' + vps_domain}
|
|
|
|
else:
|
|
|
|
shadowsocks_config = {'server': '0.0.0.0','port_key': portkey,'local_port': 1081,'mode': 'tcp_and_udp','timeout': timeout,'method': method,'verbose': verbose,'ipv6_first': True, 'prefer_ipv6': prefer_ipv6,'fast_open': fast_open,'no_delay': no_delay,'reuse_port': reuse_port,'mptcp': mptcp,'ebpf': ebpf,'acl': '/etc/shadowsocks-libev/local.acl', 'plugin': '/usr/local/bin/obfs-server','plugin_opts': 'obfs=http;mptcp;fast-open;t=400'}
|
2019-01-25 19:43:49 +00:00
|
|
|
else:
|
2019-12-17 18:10:09 +00:00
|
|
|
shadowsocks_config = {'server': '0.0.0.0','port_key': portkey,'local_port': 1081,'mode': 'tcp_and_udp','timeout': timeout,'method': method,'verbose': verbose,'ipv6_first': True, 'prefer_ipv6': prefer_ipv6,'fast_open': fast_open,'no_delay': no_delay,'reuse_port': reuse_port,'mptcp': mptcp,'ebpf': ebpf,'acl': '/etc/shadowsocks-libev/local.acl'}
|
|
|
|
else:
|
|
|
|
if obfs:
|
|
|
|
if obfs_plugin == "v2ray":
|
|
|
|
if obfs_type == "tls":
|
|
|
|
if vps_domain == '':
|
|
|
|
shadowsocks_config = {'server': '::0','port_key': portkey,'local_port': 1081,'mode': 'tcp_and_udp','timeout': timeout,'method': method,'verbose': verbose,'ipv6_first': True, 'prefer_ipv6': prefer_ipv6,'fast_open': fast_open,'no_delay': no_delay,'reuse_port': reuse_port,'mptcp': mptcp,'ebpf': ebpf,'acl': '/etc/shadowsocks-libev/local.acl', 'plugin': '/usr/local/bin/v2ray-plugin','plugin_opts': 'server;tls'}
|
|
|
|
else:
|
|
|
|
shadowsocks_config = {'server': '::0','port_key': portkey,'local_port': 1081,'mode': 'tcp_and_udp','timeout': timeout,'method': method,'verbose': verbose,'ipv6_first': True, 'prefer_ipv6': prefer_ipv6,'fast_open': fast_open,'no_delay': no_delay,'reuse_port': reuse_port,'mptcp': mptcp,'ebpf': ebpf,'acl': '/etc/shadowsocks-libev/local.acl', 'plugin': '/usr/local/bin/v2ray-plugin','plugin_opts': 'server;tls;host=' + vps_domain}
|
2019-04-18 19:09:26 +00:00
|
|
|
else:
|
2019-12-17 18:10:09 +00:00
|
|
|
shadowsocks_config = {'server': '::0','port_key': portkey,'local_port': 1081,'mode': 'tcp_and_udp','timeout': timeout,'method': method,'verbose': verbose,'ipv6_first': True, 'prefer_ipv6': prefer_ipv6,'fast_open': fast_open,'no_delay': no_delay,'reuse_port': reuse_port,'mptcp': mptcp,'ebpf': ebpf,'acl': '/etc/shadowsocks-libev/local.acl', 'plugin': '/usr/local/bin/v2ray-plugin','plugin_opts': 'server'}
|
2019-01-25 19:43:49 +00:00
|
|
|
else:
|
2019-12-17 18:10:09 +00:00
|
|
|
if obfs_type == 'tls':
|
|
|
|
if vps_domain == '':
|
|
|
|
shadowsocks_config = {'server': ('[::0]', '0.0.0.0'),'port_key': portkey,'local_port': 1081,'mode': 'tcp_and_udp','timeout': timeout,'method': method,'verbose': verbose,'ipv6_first': True, 'prefer_ipv6': prefer_ipv6,'fast_open': fast_open,'no_delay': no_delay,'reuse_port': reuse_port,'mptcp': mptcp,'ebpf': ebpf,'acl': '/etc/shadowsocks-libev/local.acl', 'plugin': '/usr/local/bin/obfs-server','plugin_opts': 'obfs=tls;mptcp;fast-open;t=400'}
|
|
|
|
else:
|
|
|
|
shadowsocks_config = {'server': ('[::0]', '0.0.0.0'),'port_key': portkey,'local_port': 1081,'mode': 'tcp_and_udp','timeout': timeout,'method': method,'verbose': verbose,'ipv6_first': True, 'prefer_ipv6': prefer_ipv6,'fast_open': fast_open,'no_delay': no_delay,'reuse_port': reuse_port,'mptcp': mptcp,'ebpf': ebpf,'acl': '/etc/shadowsocks-libev/local.acl', 'plugin': '/usr/local/bin/obfs-server','plugin_opts': 'obfs=tls;mptcp;fast-open;t=400;host=' + vps_domain}
|
|
|
|
else:
|
|
|
|
shadowsocks_config = {'server': ('[::0]', '0.0.0.0'),'port_key': portkey,'local_port': 1081,'mode': 'tcp_and_udp','timeout': timeout,'method': method,'verbose': verbose,'ipv6_first': True, 'prefer_ipv6': prefer_ipv6,'fast_open': fast_open,'no_delay': no_delay,'reuse_port': reuse_port,'mptcp': mptcp,'ebpf': ebpf,'acl': '/etc/shadowsocks-libev/local.acl', 'plugin': '/usr/local/bin/obfs-server','plugin_opts': 'obfs=http;mptcp;fast-open;t=400'}
|
|
|
|
else:
|
|
|
|
shadowsocks_config = {'server': ('[::0]', '0.0.0.0'),'port_key': portkey,'local_port': 1081,'mode': 'tcp_and_udp','timeout': timeout,'method': method,'verbose': verbose,'ipv6_first': True, 'prefer_ipv6': prefer_ipv6,'fast_open': fast_open,'no_delay': no_delay,'reuse_port': reuse_port,'mptcp': mptcp,'ebpf': ebpf,'acl': '/etc/shadowsocks-libev/local.acl'}
|
2018-11-08 12:55:20 +00:00
|
|
|
|
|
|
|
if ordered(data) != ordered(json.loads(json.dumps(shadowsocks_config))):
|
2019-11-16 19:49:26 +00:00
|
|
|
with open('/etc/shadowsocks-libev/manager.json','w') as outfile:
|
2018-12-06 09:48:23 +00:00
|
|
|
json.dump(shadowsocks_config,outfile,indent=4)
|
2019-11-16 19:49:26 +00:00
|
|
|
os.system("systemctl restart shadowsocks-libev-manager@manager.service")
|
2018-11-08 17:05:34 +00:00
|
|
|
for x in range (1,os.cpu_count()):
|
2019-11-16 19:49:26 +00:00
|
|
|
os.system("systemctl restart shadowsocks-libev-manager@manager" + str(x) + ".service")
|
2019-09-29 18:54:54 +00:00
|
|
|
shorewall_add_port(str(port),'tcp','shadowsocks')
|
|
|
|
shorewall_add_port(str(port),'udp','shadowsocks')
|
2019-08-12 14:43:05 +00:00
|
|
|
set_lastchange()
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'done','reason': 'changes applied','route': 'shadowsocks'}
|
2018-11-08 12:55:20 +00:00
|
|
|
else:
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'done','reason': 'no changes','route': 'shadowsocks'}
|
2018-11-08 12:55:20 +00:00
|
|
|
|
2018-11-08 17:05:34 +00:00
|
|
|
# Set shorewall config
|
2019-11-02 17:32:35 +00:00
|
|
|
class ShorewallAllparams(BaseModel):
|
|
|
|
redirect_ports: str
|
2020-01-09 08:48:02 +00:00
|
|
|
ipproto: str = "ipv4"
|
2019-11-02 17:32:35 +00:00
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.post('/shorewall')
|
2019-11-02 17:32:35 +00:00
|
|
|
def shorewall(*, params: ShorewallAllparams,current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
if current_user.permission == "ro":
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'permission','reason': 'Read only user','route': 'shorewall'}
|
2019-11-02 17:32:35 +00:00
|
|
|
state = params.redirect_ports
|
2019-01-06 17:53:06 +00:00
|
|
|
if state is None:
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'error','reason': 'Invalid parameters','route': 'shorewall'}
|
2020-01-09 08:48:02 +00:00
|
|
|
if params.ipproto == 'ipv4':
|
|
|
|
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall/rules', 'rb'))).hexdigest()
|
|
|
|
fd, tmpfile = mkstemp()
|
|
|
|
with open('/etc/shorewall/rules','r') as f, open(tmpfile,'a+') as n:
|
|
|
|
for line in f:
|
|
|
|
if state == 'enable' and line == '#DNAT net vpn:$OMR_ADDR tcp 1-64999\n':
|
|
|
|
n.write(line.replace(line[:1], ''))
|
|
|
|
elif state == 'enable' and line == '#DNAT net vpn:$OMR_ADDR udp 1-64999\n':
|
|
|
|
n.write(line.replace(line[:1], ''))
|
|
|
|
elif state == 'disable' and line == 'DNAT net vpn:$OMR_ADDR tcp 1-64999\n':
|
|
|
|
n.write('#' + line)
|
|
|
|
elif state == 'disable' and line == 'DNAT net vpn:$OMR_ADDR udp 1-64999\n':
|
|
|
|
n.write('#' + line)
|
|
|
|
else:
|
|
|
|
n.write(line)
|
|
|
|
os.close(fd)
|
|
|
|
move(tmpfile,'/etc/shorewall/rules')
|
|
|
|
final_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall/rules', 'rb'))).hexdigest()
|
|
|
|
if not initial_md5 == final_md5:
|
|
|
|
os.system("systemctl -q reload shorewall")
|
|
|
|
else:
|
|
|
|
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall6/rules', 'rb'))).hexdigest()
|
|
|
|
fd, tmpfile = mkstemp()
|
|
|
|
with open('/etc/shorewall6/rules','r') as f, open(tmpfile,'a+') as n:
|
|
|
|
for line in f:
|
|
|
|
if state == 'enable' and line == '#DNAT net vpn:$OMR_ADDR tcp 1-64999\n':
|
|
|
|
n.write(line.replace(line[:1], ''))
|
|
|
|
elif state == 'enable' and line == '#DNAT net vpn:$OMR_ADDR udp 1-64999\n':
|
|
|
|
n.write(line.replace(line[:1], ''))
|
|
|
|
elif state == 'disable' and line == 'DNAT net vpn:$OMR_ADDR tcp 1-64999\n':
|
|
|
|
n.write('#' + line)
|
|
|
|
elif state == 'disable' and line == 'DNAT net vpn:$OMR_ADDR udp 1-64999\n':
|
|
|
|
n.write('#' + line)
|
|
|
|
else:
|
|
|
|
n.write(line)
|
|
|
|
os.close(fd)
|
|
|
|
move(tmpfile,'/etc/shorewall6/rules')
|
|
|
|
final_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall6/rules', 'rb'))).hexdigest()
|
|
|
|
if not initial_md5 == final_md5:
|
|
|
|
os.system("systemctl -q reload shorewall6")
|
2018-11-08 17:05:34 +00:00
|
|
|
# Need to do the same for IPv6...
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'done','reason': 'changes applied'}
|
2018-11-08 17:05:34 +00:00
|
|
|
|
2019-11-02 17:32:35 +00:00
|
|
|
class ShorewallListparams(BaseModel):
|
|
|
|
name: str
|
2020-01-09 08:48:02 +00:00
|
|
|
ipproto: str = "ipv4"
|
2019-11-02 17:32:35 +00:00
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.post('/shorewalllist')
|
2019-11-02 17:32:35 +00:00
|
|
|
def shorewall_list(*,params: ShorewallListparams, current_user: User = Depends(get_current_user)):
|
|
|
|
name = params.name
|
2019-09-29 18:54:54 +00:00
|
|
|
if name is None:
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'error','reason': 'Invalid parameters','route': 'shorewalllist'}
|
2019-09-29 18:54:54 +00:00
|
|
|
fwlist = []
|
2020-01-09 08:48:02 +00:00
|
|
|
if params.ipproto == 'ipv4':
|
|
|
|
with open('/etc/shorewall/rules','r') as f:
|
|
|
|
for line in f:
|
|
|
|
if '# OMR ' + name in line:
|
|
|
|
fwlist.append(line)
|
|
|
|
else:
|
|
|
|
with open('/etc/shorewall6/rules','r') as f:
|
|
|
|
for line in f:
|
|
|
|
if '# OMR ' + name in line:
|
|
|
|
fwlist.append(line)
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'list': fwlist}
|
2019-09-29 18:54:54 +00:00
|
|
|
|
2019-11-02 17:32:35 +00:00
|
|
|
class Shorewallparams(BaseModel):
|
|
|
|
name: str
|
2019-12-17 18:10:09 +00:00
|
|
|
port: str
|
2019-11-02 17:32:35 +00:00
|
|
|
proto: str
|
|
|
|
fwtype: str
|
2020-01-09 08:48:02 +00:00
|
|
|
ipproto: str = "ipv4"
|
2019-11-02 17:32:35 +00:00
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.post('/shorewallopen')
|
2019-11-02 17:32:35 +00:00
|
|
|
def shorewall_open(*,params: Shorewallparams, current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
if current_user.permission == "ro":
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'permission','reason': 'Read only user','route': 'shorewallopen'}
|
2019-11-02 17:32:35 +00:00
|
|
|
name = params.name
|
|
|
|
port = params.port
|
|
|
|
proto = params.proto
|
|
|
|
fwtype = params.fwtype
|
2019-09-29 18:54:54 +00:00
|
|
|
if name is None:
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'error','reason': 'Invalid parameters','route': 'shorewallopen'}
|
2020-01-09 08:48:02 +00:00
|
|
|
if params.ipproto == 'ipv4':
|
2020-01-09 21:20:05 +00:00
|
|
|
shorewall_add_port(current_user.username,str(port),proto,name,fwtype)
|
2020-01-09 08:48:02 +00:00
|
|
|
else:
|
2020-01-09 21:20:05 +00:00
|
|
|
shorewall6_add_port(current_user.username,str(port),proto,name,fwtype)
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'done','reason': 'changes applied'}
|
2019-09-29 18:54:54 +00:00
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.post('/shorewallclose')
|
2019-11-02 17:32:35 +00:00
|
|
|
def shorewall_close(*,params: Shorewallparams,current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
if current_user.permission == "ro":
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'permission','reason': 'Read only user','route': 'shorewallclose'}
|
2019-11-02 17:32:35 +00:00
|
|
|
name = params.name
|
|
|
|
port = params.port
|
|
|
|
proto = params.proto
|
|
|
|
fwtype = params.fwtype
|
2019-09-29 18:54:54 +00:00
|
|
|
if name is None:
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'error','reason': 'Invalid parameters','route': 'shorewallclose'}
|
2020-01-09 08:48:02 +00:00
|
|
|
if params.ipproto == 'ipv4':
|
2020-01-09 21:20:05 +00:00
|
|
|
shorewall_del_port(current_user.username,str(port),proto,name,fwtype)
|
2020-01-09 08:48:02 +00:00
|
|
|
else:
|
2020-01-09 21:20:05 +00:00
|
|
|
shorewall6_del_port(current_user.username,str(port),proto,name,fwtype)
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'done','reason': 'changes applied','route': 'shorewallclose'}
|
2019-09-29 18:54:54 +00:00
|
|
|
|
2018-11-14 16:34:13 +00:00
|
|
|
# Set MPTCP config
|
2019-11-02 17:32:35 +00:00
|
|
|
class MPTCPparams(BaseModel):
|
|
|
|
checksum: str
|
|
|
|
path_manager: str
|
|
|
|
scheduler: str
|
|
|
|
syn_retries: int
|
|
|
|
congestion_control: str
|
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.post('/mptcp')
|
2019-11-02 17:32:35 +00:00
|
|
|
def mptcp(*, params: MPTCPparams,current_user: User = Depends(get_current_user)):
|
2019-12-26 19:25:11 +00:00
|
|
|
if current_user.permissions == "ro":
|
|
|
|
set_lastchange(10)
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'permission','reason': 'Read only user','route': 'mptcp'}
|
2019-11-02 17:32:35 +00:00
|
|
|
checksum = params.checksum
|
|
|
|
path_manager = params.path_manager
|
|
|
|
scheduler = params.scheduler
|
|
|
|
syn_retries = params.syn_retries
|
|
|
|
congestion_control = params.congestion_control
|
2019-01-06 18:00:45 +00:00
|
|
|
if not checksum or not path_manager or not scheduler or not syn_retries or not congestion_control:
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'error','reason': 'Invalid parameters','route': 'mptcp'}
|
2018-12-28 07:55:46 +00:00
|
|
|
os.system('sysctl -qw net.mptcp.mptcp_checksum=' + checksum)
|
|
|
|
os.system('sysctl -qw net.mptcp.mptcp_path_manager=' + path_manager)
|
|
|
|
os.system('sysctl -qw net.mptcp.mptcp_scheduler=' + scheduler)
|
|
|
|
os.system('sysctl -qw net.mptcp.mptcp_syn_retries=' + syn_retries)
|
|
|
|
os.system('sysctl -qw net.ipv4.tcp_congestion_control=' + congestion_control)
|
2019-08-12 14:43:05 +00:00
|
|
|
set_lastchange()
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'done','reason': 'changes applied'}
|
|
|
|
|
|
|
|
class Vpn(BaseModel):
|
|
|
|
vpn: str
|
2018-11-14 16:34:13 +00:00
|
|
|
|
2019-06-24 16:14:16 +00:00
|
|
|
# Set global VPN config
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.post('/vpn')
|
|
|
|
def vpn(*,vpnconfig: Vpn,current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
if current_user.permission == "ro":
|
2019-12-26 19:25:11 +00:00
|
|
|
set_lastchange(10)
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'permission','reason': 'Read only user','route': 'vpn'}
|
2019-11-02 17:10:10 +00:00
|
|
|
vpn = vpnconfig.vpn
|
2019-06-24 16:14:16 +00:00
|
|
|
if not vpn:
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'error','reason': 'Invalid parameters','route': 'vpn'}
|
2019-06-24 16:14:16 +00:00
|
|
|
os.system('echo ' + vpn + ' > /etc/openmptcprouter-vps-admin/current-vpn')
|
2019-12-26 19:25:11 +00:00
|
|
|
modif_config_user(current_user,{'vpn': vpn})
|
|
|
|
current_user.vpn = vpn
|
2019-08-12 14:43:05 +00:00
|
|
|
set_lastchange()
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'done','reason': 'changes applied'}
|
|
|
|
|
2019-06-24 16:14:16 +00:00
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
class GlorytunConfig(BaseModel):
|
|
|
|
key: str
|
|
|
|
port: int
|
|
|
|
chacha: bool
|
2018-11-14 16:34:13 +00:00
|
|
|
|
2018-12-06 09:48:23 +00:00
|
|
|
# Set Glorytun config
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.post('/glorytun')
|
|
|
|
def glorytun(*, glorytunconfig: GlorytunConfig,current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
if current_user.permission == "ro":
|
2019-12-26 19:25:11 +00:00
|
|
|
set_lastchange(10)
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'permission','reason': 'Read only user','route': 'glorytun'}
|
2019-11-02 17:10:10 +00:00
|
|
|
key = glorytunconfig.key
|
|
|
|
port = glorytunconfig.port
|
|
|
|
chacha = glorytunconfig.chacha
|
2019-06-02 21:11:58 +00:00
|
|
|
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/glorytun-tcp/tun0', 'rb'))).hexdigest()
|
2018-12-06 09:48:23 +00:00
|
|
|
with open('/etc/glorytun-tcp/tun0.key','w') as outfile:
|
|
|
|
outfile.write(key)
|
|
|
|
with open('/etc/glorytun-udp/tun0.key','w') as outfile:
|
|
|
|
outfile.write(key)
|
|
|
|
fd, tmpfile = mkstemp()
|
|
|
|
with open('/etc/glorytun-tcp/tun0','r') as f, open(tmpfile,'a+') as n:
|
|
|
|
for line in f:
|
|
|
|
if 'PORT=' in line:
|
|
|
|
n.write('PORT=' + str(port) + '\n')
|
2019-05-23 19:55:49 +00:00
|
|
|
elif 'OPTIONS=' in line:
|
|
|
|
if chacha:
|
|
|
|
n.write('OPTIONS="chacha20 retry count -1 const 5000000 timeout 90000 keepalive count 5 idle 10 interval 2 buffer-size 65536 multiqueue"\n')
|
|
|
|
else:
|
|
|
|
n.write('OPTIONS="retry count -1 const 5000000 timeout 90000 keepalive count 5 idle 10 interval 2 buffer-size 65536 multiqueue"\n')
|
2018-12-06 09:48:23 +00:00
|
|
|
else:
|
|
|
|
n.write(line)
|
|
|
|
os.close(fd)
|
|
|
|
move(tmpfile,'/etc/glorytun-tcp/tun0')
|
2019-06-02 21:11:58 +00:00
|
|
|
final_md5 = hashlib.md5(file_as_bytes(open('/etc/glorytun-tcp/tun0', 'rb'))).hexdigest()
|
|
|
|
if not initial_md5 == final_md5:
|
|
|
|
os.system("systemctl -q restart glorytun-tcp@tun0")
|
|
|
|
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/glorytun-udp/tun0', 'rb'))).hexdigest()
|
2018-12-06 09:48:23 +00:00
|
|
|
fd, tmpfile = mkstemp()
|
|
|
|
with open('/etc/glorytun-udp/tun0','r') as f, open(tmpfile,'a+') as n:
|
|
|
|
for line in f:
|
|
|
|
if 'BIND_PORT=' in line:
|
|
|
|
n.write('BIND_PORT=' + str(port) + '\n')
|
2019-05-23 19:55:49 +00:00
|
|
|
elif 'OPTIONS=' in line:
|
|
|
|
if chacha:
|
|
|
|
n.write('OPTIONS="chacha persist"\n')
|
|
|
|
else:
|
|
|
|
n.write('OPTIONS="persist"\n')
|
2018-12-06 09:48:23 +00:00
|
|
|
else:
|
|
|
|
n.write(line)
|
|
|
|
os.close(fd)
|
|
|
|
move(tmpfile,'/etc/glorytun-udp/tun0')
|
2019-06-02 21:11:58 +00:00
|
|
|
final_md5 = hashlib.md5(file_as_bytes(open('/etc/glorytun-udp/tun0', 'rb'))).hexdigest()
|
|
|
|
if not initial_md5 == final_md5:
|
|
|
|
os.system("systemctl -q restart glorytun-udp@tun0")
|
2019-09-29 18:54:54 +00:00
|
|
|
shorewall_add_port(str(port),'tcp','glorytun')
|
2019-08-12 14:43:05 +00:00
|
|
|
set_lastchange()
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'done'}
|
2018-12-06 09:48:23 +00:00
|
|
|
|
2019-08-02 15:22:43 +00:00
|
|
|
# Set A Dead Simple VPN config
|
2019-11-02 17:32:35 +00:00
|
|
|
class DSVPN(BaseModel):
|
|
|
|
key: str
|
|
|
|
port: int
|
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.post('/dsvpn')
|
2019-11-02 17:32:35 +00:00
|
|
|
def dsvpn(*,params: DSVPN,current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
if current_user.permission == "ro":
|
2019-12-26 19:25:11 +00:00
|
|
|
set_lastchange(10)
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'permission','reason': 'Read only user','route': 'dsvpn'}
|
2019-11-02 17:32:35 +00:00
|
|
|
key = params.key
|
|
|
|
port = params.port
|
2019-08-02 15:22:43 +00:00
|
|
|
if not key or port is None:
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'error','reason': 'Invalid parameters','route': 'dsvpn'}
|
2019-08-02 15:22:43 +00:00
|
|
|
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/dsvpn/dsvpn.key', 'rb'))).hexdigest()
|
|
|
|
with open('/etc/dsvpn/dsvpn.key','w') as outfile:
|
|
|
|
outfile.write(key)
|
|
|
|
final_md5 = hashlib.md5(file_as_bytes(open('/etc/dsvpn/dsvpn.key', 'rb'))).hexdigest()
|
|
|
|
if not initial_md5 == final_md5:
|
|
|
|
os.system("systemctl -q restart dsvpn-server")
|
2019-09-29 18:54:54 +00:00
|
|
|
shorewall_add_port(str(port),'tcp','dsvpn')
|
2019-08-12 14:43:05 +00:00
|
|
|
set_lastchange()
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'done'}
|
2019-08-02 15:22:43 +00:00
|
|
|
|
2018-12-06 09:48:23 +00:00
|
|
|
# Set OpenVPN config
|
2019-11-02 17:32:35 +00:00
|
|
|
class OpenVPN(BaseModel):
|
|
|
|
key: str
|
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.post('/openvpn')
|
2019-11-02 17:32:35 +00:00
|
|
|
def openvpn(*,ovpn: OpenVPN,current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
if current_user.permission == "ro":
|
2019-12-26 19:25:11 +00:00
|
|
|
set_lastchange(10)
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'permission','reason': 'Read only user','route': 'openvpn'}
|
2019-11-02 17:32:35 +00:00
|
|
|
key = ovpn.key
|
2018-11-29 21:43:02 +00:00
|
|
|
if not key:
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'error','reason': 'Invalid parameters','route': 'openvpn'}
|
2019-06-02 21:11:58 +00:00
|
|
|
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/openvpn/server/static.key', 'rb'))).hexdigest()
|
2018-12-06 09:48:23 +00:00
|
|
|
with open('/etc/openvpn/server/static.key','w') as outfile:
|
|
|
|
outfile.write(base64.b64decode(key))
|
2019-06-02 21:11:58 +00:00
|
|
|
final_md5 = hashlib.md5(file_as_bytes(open('/etc/openvpn/server/static.key', 'rb'))).hexdigest()
|
|
|
|
if not initial_md5 == final_md5:
|
|
|
|
os.system("systemctl -q restart openvpn@tun0")
|
2019-08-12 14:43:05 +00:00
|
|
|
set_lastchange()
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'done'}
|
|
|
|
|
|
|
|
class Wanips(BaseModel):
|
|
|
|
ips: str
|
2018-11-14 14:10:42 +00:00
|
|
|
|
2019-08-29 20:39:22 +00:00
|
|
|
# Set WANIP
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.post('/wan')
|
|
|
|
def wan(*, wanips: Wanips,current_user: User = Depends(get_current_user)):
|
|
|
|
ips = wanips.ips
|
2019-08-29 20:39:22 +00:00
|
|
|
if not ips:
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'error','reason': 'Invalid parameters','route': 'wan'}
|
2019-08-29 20:39:22 +00:00
|
|
|
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/shadowsocks-libev/local.acl', 'rb'))).hexdigest()
|
|
|
|
with open('/etc/shadowsocks-libev/local.acl','w') as outfile:
|
|
|
|
outfile.write('[white_list]\n')
|
|
|
|
outfile.write(ips)
|
|
|
|
final_md5 = hashlib.md5(file_as_bytes(open('/etc/shadowsocks-libev/local.acl', 'rb'))).hexdigest()
|
2020-01-09 21:20:05 +00:00
|
|
|
#modif_config_user(current_user,{'wanips': wanip})
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'done'}
|
2019-08-29 20:39:22 +00:00
|
|
|
|
2020-01-09 21:20:05 +00:00
|
|
|
class Lanips(BaseModel):
|
|
|
|
lanips: List[str] = []
|
|
|
|
|
|
|
|
# Set user lan config
|
|
|
|
@app.post('/lan')
|
|
|
|
def router(*,lanconfig: Lanips,current_user: User = Depends(get_current_user)):
|
|
|
|
lanips = lanconfig.lanips
|
|
|
|
if not lanips:
|
|
|
|
return {'result': 'error','reason': 'Invalid parameters','route': 'lan'}
|
|
|
|
modif_config_user(current_user,{'lanips': lanips})
|
|
|
|
return {'result': 'done','reason': 'changes applied'}
|
|
|
|
|
|
|
|
|
2018-12-06 09:48:23 +00:00
|
|
|
# Update VPS
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.get('/update')
|
|
|
|
def update(current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
if current_user.permission == "ro":
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'permission','reason': 'Read only user','route': 'update'}
|
2018-12-06 09:48:23 +00:00
|
|
|
os.system("wget -O - http://www.openmptcprouter.com/server/debian9-x86_64.sh | sh")
|
|
|
|
# Need to reboot if kernel change
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'done'}
|
2018-11-08 17:05:34 +00:00
|
|
|
|
2019-09-29 18:54:54 +00:00
|
|
|
# Backup
|
2019-11-02 17:32:35 +00:00
|
|
|
class Backupfile(BaseModel):
|
|
|
|
data: str
|
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.post('/backuppost')
|
2019-11-02 17:32:35 +00:00
|
|
|
def backuppost(*,backupfile: Backupfile ,current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
if current_user.permission == "ro":
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'permission','reason': 'Read only user','route': 'backuppost'}
|
2019-11-02 17:32:35 +00:00
|
|
|
backup_file = backupfile.data
|
2019-09-29 18:54:54 +00:00
|
|
|
if not backup_file:
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'error','reason': 'Invalid parameters','route': 'backuppost'}
|
2019-12-26 19:25:11 +00:00
|
|
|
with open('/var/opt/openmptcprouter/' + current_user.username + '-backup.tar.gz','wb') as f:
|
2019-09-29 18:54:54 +00:00
|
|
|
f.write(base64.b64decode(backup_file))
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'done'}
|
2019-09-29 18:54:54 +00:00
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.get('/backupget')
|
|
|
|
def send_backup(current_user: User = Depends(get_current_user)):
|
2019-12-26 19:25:11 +00:00
|
|
|
with open('/var/opt/openmptcprouter/' + current_user.username + '-backup.tar.gz',"rb") as backup_file:
|
2019-09-29 18:54:54 +00:00
|
|
|
file_base64 = base64.b64encode(backup_file.read())
|
|
|
|
file_base64utf = file_base64.decode('utf-8')
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'data': file_base64utf}
|
2019-09-29 18:54:54 +00:00
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.get('/backuplist')
|
|
|
|
def list_backup(current_user: User = Depends(get_current_user)):
|
2019-12-26 19:25:11 +00:00
|
|
|
if os.path.isfile('/var/opt/openmptcprouter/' + current_user.username + '-backup.tar.gz'):
|
|
|
|
modiftime = os.path.getmtime('/var/opt/openmptcprouter/' + current_user.username + '-backup.tar.gz')
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'backup': True, 'modif': modiftime}
|
2019-10-10 19:13:14 +00:00
|
|
|
else:
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'backup': False}
|
2019-10-10 19:13:14 +00:00
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.get('/backupshow')
|
|
|
|
def show_backup(current_user: User = Depends(get_current_user)):
|
2019-12-26 19:25:11 +00:00
|
|
|
if os.path.isfile('/var/opt/openmptcprouter/' + current_user.username + '-backup.tar.gz'):
|
|
|
|
router = OpenWrt(native=open('/var/opt/openmptcprouter/' + current_user.username + '-backup.tar.gz'))
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'backup': True,'data': router}
|
2019-10-10 19:13:14 +00:00
|
|
|
else:
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'backup': False}
|
2019-10-10 19:13:14 +00:00
|
|
|
|
2019-11-02 17:10:10 +00:00
|
|
|
@app.post('/backupedit')
|
2019-11-02 17:32:35 +00:00
|
|
|
def edit_backup(params,current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
if current_user.permission == "ro":
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'permission','reason': 'Read only user','route': 'backupedit'}
|
2019-10-10 19:13:14 +00:00
|
|
|
o = OpenWrt(params)
|
2019-12-26 19:25:11 +00:00
|
|
|
o.write(current_user.username + '-backup',path='/var/opt/openmptcprouter/')
|
2019-11-02 17:10:10 +00:00
|
|
|
return {'result': 'done'}
|
2019-10-10 19:13:14 +00:00
|
|
|
|
2019-12-30 19:49:39 +00:00
|
|
|
class VPN(str, Enum):
|
|
|
|
openvpn = "openvpn"
|
2020-01-09 08:48:02 +00:00
|
|
|
glorytuntcp = "glorytun-tcp"
|
|
|
|
glorytunudp = "glorytun-udp"
|
2019-12-30 19:49:39 +00:00
|
|
|
|
2020-01-09 08:48:02 +00:00
|
|
|
class permissions(str, Enum):
|
2019-12-30 19:49:39 +00:00
|
|
|
ro = "ro"
|
|
|
|
rw = "rw"
|
|
|
|
admin = "admin"
|
2019-09-29 18:54:54 +00:00
|
|
|
|
2019-12-26 19:25:11 +00:00
|
|
|
class NewUser(BaseModel):
|
2020-01-09 08:48:02 +00:00
|
|
|
username: str = Query(None, title="Username")
|
|
|
|
permission: permissions = Query("ro", title="permission of the user")
|
|
|
|
# shadowsocks_port: int = Query(None, title="Shadowsocks port")
|
|
|
|
vpn: VPN = Query("openvpn", title="default VPN for the user")
|
|
|
|
# vpn_port: int = None
|
|
|
|
# userid: int = Query(0, title="User ID",description="User ID is used to create port of each VPN and shadowsocks",gt=0,le=99)
|
2019-12-26 19:25:11 +00:00
|
|
|
|
|
|
|
@app.post('/add_user')
|
|
|
|
def add_user(*, params: NewUser,current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
if not current_user.permission == "admin":
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'permission','reason': 'Need admin user','route': 'add_user'}
|
2020-01-09 08:48:02 +00:00
|
|
|
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json') as f:
|
|
|
|
content = json.load(f)
|
|
|
|
userid = 2
|
|
|
|
for users in content['users'][0]:
|
|
|
|
#usercontent = content['users'][0][users]
|
|
|
|
for usercontent in users:
|
|
|
|
if 'userid' in usercontent:
|
|
|
|
if usercontent['userid'] > userid:
|
|
|
|
userid = usercontent['userid']
|
2019-12-27 20:42:47 +00:00
|
|
|
user_key = secrets.token_hex(32)
|
|
|
|
user_json = json.loads('{"'+ params.username + '": {"username":"'+ params.username +'","permission":"'+params.permission+'","user_password": "'+user_key.upper()+'","disabled":"false"}}')
|
2020-01-09 08:48:02 +00:00
|
|
|
# shadowsocks_port = params.shadowsocks_port
|
|
|
|
# if params.shadowsocks_port is None:
|
|
|
|
shadowsocks_port = '651{:02d}'.format(userid)
|
|
|
|
|
|
|
|
shadowsocks_key = base64.urlsafe_b64encode(secrets.token_hex(16).encode())
|
|
|
|
add_ss_user(str(shadowsocks_port),shadowsocks_key.decode('utf-8'))
|
|
|
|
user_json[params.username].update({"shadowsocks_port": shadowsocks_port})
|
2019-12-27 20:42:47 +00:00
|
|
|
if params.vpn is not None:
|
|
|
|
user_json[params.username].update({"vpn": params.vpn})
|
|
|
|
content['users'][0].update(user_json)
|
2019-12-26 19:25:11 +00:00
|
|
|
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json','w') as f:
|
2019-12-27 20:42:47 +00:00
|
|
|
json.dump(content,f,indent=4)
|
2020-01-09 08:48:02 +00:00
|
|
|
# Create VPNs configuration
|
2020-01-06 20:18:29 +00:00
|
|
|
os.system('cd /etc/openvpn/ca && EASYRSA_CERT_EXPIRE=3650 ./easyrsa build-client-full "' + params.username + '" nopass')
|
2020-01-09 08:48:02 +00:00
|
|
|
add_glorytun_tcp(userid)
|
|
|
|
add_glorytun_udp(userid)
|
|
|
|
|
|
|
|
set_lastchange(30)
|
2020-01-06 20:18:29 +00:00
|
|
|
os.execv(__file__, sys.argv)
|
2019-12-27 20:42:47 +00:00
|
|
|
|
|
|
|
class RemoveUser(BaseModel):
|
|
|
|
username: str
|
2019-12-26 19:25:11 +00:00
|
|
|
|
2019-12-27 20:42:47 +00:00
|
|
|
@app.post('/remove_user')
|
|
|
|
def remove_user(*, params: RemoveUser,current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
if not current_user.permission == "admin":
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'permission','reason': 'Need admin user','route': 'remove_user'}
|
2019-12-27 20:42:47 +00:00
|
|
|
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json') as f:
|
|
|
|
content = json.load(f)
|
|
|
|
shadowsocks_port = content['users'][0][params.username]['shadowsocks_port']
|
|
|
|
del content['users'][0][params.username]
|
|
|
|
remove_ss_user(str(shadowsocks_port))
|
|
|
|
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json','w') as f:
|
|
|
|
json.dump(content,f,indent=4)
|
|
|
|
os.remove('/etc/openvpn/ca/pki/issued/' + params.username + '.crt')
|
|
|
|
os.remove('/etc/openvpn/ca/pki/private/' + params.username + '.key')
|
2020-01-09 08:48:02 +00:00
|
|
|
set_lastchange(30)
|
2020-01-06 20:18:29 +00:00
|
|
|
os.execv(__file__, sys.argv)
|
2019-12-27 20:42:47 +00:00
|
|
|
|
2020-01-09 08:48:02 +00:00
|
|
|
@app.get('/list_users')
|
2019-12-27 20:42:47 +00:00
|
|
|
def list_users(current_user: User = Depends(get_current_user)):
|
2020-01-09 08:48:02 +00:00
|
|
|
if not current_user.permission == "admin":
|
2020-01-06 11:43:20 +00:00
|
|
|
return {'result': 'permission','reason': 'Need admin user','route': 'list_users'}
|
2019-12-27 20:42:47 +00:00
|
|
|
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json') as f:
|
|
|
|
content = json.load(f)
|
2020-01-09 08:48:02 +00:00
|
|
|
return content['users'][0]
|
2019-12-26 19:25:11 +00:00
|
|
|
|
2018-11-08 12:55:20 +00:00
|
|
|
if __name__ == '__main__':
|
2018-12-13 14:14:45 +00:00
|
|
|
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json') as f:
|
|
|
|
omr_config_data = json.load(f)
|
|
|
|
omrport=65500
|
|
|
|
if 'port' in omr_config_data:
|
|
|
|
omrport = omr_config_data["port"]
|
2019-12-27 20:42:47 +00:00
|
|
|
omrhost='0.0.0.0'
|
|
|
|
if 'host' in omr_config_data:
|
|
|
|
omrhost = omr_config_data["host"]
|
2019-12-26 19:25:11 +00:00
|
|
|
# uvicorn.run(app,host='0.0.0.0',port=omrport,log_level='debug',ssl_certfile='/etc/openmptcprouter-vps-admin/cert.pem',ssl_keyfile='/etc/openmptcprouter-vps-admin/key.pem')
|
2019-12-27 20:42:47 +00:00
|
|
|
uvicorn.run(app,host=omrhost,port=omrport,log_level='error',ssl_certfile='/etc/openmptcprouter-vps-admin/cert.pem',ssl_keyfile='/etc/openmptcprouter-vps-admin/key.pem')
|
2019-11-02 17:10:10 +00:00
|
|
|
# uvicorn.run(app,host='0.0.0.0',port=omrport,ssl_context=('/etc/openmptcprouter-vps-admin/cert.pem','/etc/openmptcprouter-vps-admin/key.pem'),threaded=True)
|