1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter-vps-admin.git synced 2025-02-12 18:41:52 +00:00
openmptcprouter-vps-admin/omr-admin.py

1565 lines
73 KiB
Python
Raw Normal View History

2018-11-08 17:05:34 +00:00
#!/usr/bin/env python3
2020-03-05 14:02:20 +00:00
#
2019-11-02 17:10:10 +00:00
# Copyright (C) 2018-2019 Ycarus (Yannick Chabanois) <ycarus@zugaina.org>
#
# 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
import re
2019-06-02 21:11:58 +00:00
import hashlib
2019-08-30 05:52:59 +00:00
import time
2020-03-03 12:49:23 +00:00
from pprint import pprint
from datetime import datetime, timedelta
from tempfile import mkstemp
from typing import List, Optional
from shutil import move
from enum import Enum
import logging
2019-11-02 17:10:10 +00:00
import uvicorn
import jwt
2019-12-20 15:19:07 +00:00
from jwt import PyJWTError
2020-01-13 20:47:29 +00:00
from netaddr import *
2019-10-10 19:13:14 +00:00
from netjsonconfig import OpenWrt
from fastapi import Depends, FastAPI, HTTPException, Security, Query
2020-03-03 12:49:23 +00:00
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm, SecurityScopes, OAuth2
2019-11-02 17:10:10 +00:00
from passlib.context import CryptContext
2020-03-03 12:49:23 +00:00
from fastapi.encoders import jsonable_encoder
from fastapi.security.base import SecurityBase
from fastapi.security.utils import get_authorization_scheme_param
from fastapi.openapi.docs import get_swagger_ui_html
from fastapi.openapi.models import OAuthFlows as OAuthFlowsModel
from fastapi.openapi.utils import get_openapi
from fastapi.openapi.models import SecurityBase as SecurityBaseModel
2020-03-05 14:02:20 +00:00
from pydantic import BaseModel, ValidationError # pylint: disable=E0611
2020-03-03 12:49:23 +00:00
from starlette.status import HTTP_403_FORBIDDEN
from starlette.responses import RedirectResponse, Response, JSONResponse
from starlette.requests import Request
2018-11-08 12:55:20 +00:00
2020-03-03 12:49:23 +00:00
LOG = logging.getLogger('api')
#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
2020-03-03 12:49:23 +00:00
FILE = open('/etc/shorewall/params.net', "r")
READ = FILE.read()
IFACE = None
for line in READ.splitlines():
2018-11-08 12:55:20 +00:00
if 'NET_IFACE=' in line:
2020-03-03 12:49:23 +00:00
IFACE = line.split('=', 1)[1]
2018-11-08 12:55:20 +00:00
# Get interface rx/tx
def get_bytes(t, iface='eth0'):
with open('/sys/class/net/' + iface + '/statistics/' + t + '_bytes', 'r') as f:
2020-03-03 12:49:23 +00:00
data = f.read()
2018-11-08 12:55:20 +00:00
return int(data)
def get_bytes_ss(port):
2020-03-03 12:49:23 +00:00
ss_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
2020-02-19 18:29:17 +00:00
ss_socket.settimeout(3)
2020-03-03 12:49:23 +00:00
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)
2020-01-17 20:32:48 +00:00
if str(port) in result:
return result[str(port)]
else:
return 0
2020-03-03 12:49:23 +00:00
def add_ss_user(port, key):
ss_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data = 'add: {"server_port": ' + port + ', "key": "' + key + '"}'
ss_socket.sendto(data.encode(), ("127.0.0.1", 8839))
2019-12-27 20:42:47 +00:00
with open('/etc/shadowsocks-libev/manager.json') as f:
content = f.read()
2020-03-03 13:06:18 +00:00
content = re.sub(",\s*}", "}", content) # pylint: disable=W1401
2019-12-27 20:42:47 +00:00
data = json.loads(content)
data['port_key'][port] = key
2020-03-03 12:49:23 +00:00
with open('/etc/shadowsocks-libev/manager.json', 'w') as f:
json.dump(data, f, indent=4)
2019-12-27 20:42:47 +00:00
2019-12-27 20:42:47 +00:00
def remove_ss_user(port):
2020-03-03 12:49:23 +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 + '}'
2020-03-03 12:49:23 +00:00
ss_socket.sendto(data.encode(), ("127.0.0.1", 8839))
2019-12-27 20:42:47 +00:00
with open('/etc/shadowsocks-libev/manager.json') as f:
content = f.read()
2020-03-03 13:06:18 +00:00
content = re.sub(",\s*}", "}", content) # pylint: disable=W1401
2019-12-27 20:42:47 +00:00
data = json.loads(content)
del data['port_key'][port]
2020-03-03 12:49:23 +00:00
with open('/etc/shadowsocks-libev/manager.json', 'w') as f:
json.dump(data, f, indent=4)
def add_glorytun_tcp(userid):
port = '650{:02d}'.format(userid)
2020-01-25 20:53:58 +00:00
ip = IPNetwork('10.255.255.0/24')
subnets = ip.subnet(30)
network = list(subnets)[userid]
2020-03-05 14:02:20 +00:00
with open('/etc/glorytun-tcp/tun0', 'r') as f, \
open('/etc/glorytun-tcp/tun' + str(userid), 'w') 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")
2020-03-05 14:02:20 +00:00
elif (not 'LOCALIP' in line
and not 'REMOTEIP' in line
and not 'BROADCASTIP' in line
and not line == "\n"):
n.write(line)
2020-01-27 19:15:30 +00:00
n.write("\n" + 'LOCALIP=' + str(list(network)[1]) + "\n")
n.write('REMOTEIP=' + str(list(network)[2]) + "\n")
n.write('BROADCASTIP=' + str(network.broadcast) + "\n")
glorytun_tcp_key = secrets.token_hex(32)
2020-03-03 12:49:23 +00:00
with open('/etc/glorytun-tcp/tun' + str(userid) + '.key', 'w') as f:
2020-01-25 20:53:58 +00:00
f.write(glorytun_tcp_key.upper())
2020-03-03 12:49:23 +00:00
os.system("systemctl -q enable glorytun-tcp@tun" + str(userid))
os.system("systemctl -q restart glorytun-tcp@tun" + str(userid))
2020-02-14 20:46:05 +00:00
def remove_glorytun_tcp(userid):
2020-03-03 12:49:23 +00:00
os.system("systemctl -q disable glorytun-tcp@tun" + str(userid))
2020-02-14 20:46:05 +00:00
os.system("systemctl -q stop glorytun-tcp@tun" + str(userid))
os.remove('/etc/glorytun-tcp/tun' + str(userid) + '.key')
os.remove('/etc/glorytun-tcp/tun' + str(userid))
def add_glorytun_udp(userid):
port = '650{:02d}'.format(userid)
2020-01-25 20:53:58 +00:00
ip = IPNetwork('10.255.254.0/24')
subnets = ip.subnet(30)
network = list(subnets)[userid]
2020-03-05 14:02:20 +00:00
with open('/etc/glorytun-udp/tun0', 'r') as f, \
open('/etc/glorytun-udp/tun' + str(userid), 'w') 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")
2020-03-05 14:02:20 +00:00
elif (not 'LOCALIP' in line
and not 'REMOTEIP' in line
and not 'BROADCASTIP' in line
and not line == "\n"):
n.write(line)
2020-01-27 19:15:30 +00:00
n.write("\n" + 'LOCALIP=' + str(list(network)[1]) + "\n")
n.write('REMOTEIP=' + str(list(network)[2]) + "\n")
n.write('BROADCASTIP=' + str(network.broadcast) + "\n")
2020-03-05 14:02:20 +00:00
with open('/etc/glorytun-tcp/tun' + str(userid) + '.key', 'r') as f, \
open('/etc/glorytun-udp/tun' + str(userid) + '.key', 'w') as n:
2020-01-25 20:53:58 +00:00
for line in f:
n.write(line)
2020-03-03 12:49:23 +00:00
os.system("systemctl -q enable glorytun-udp@tun" + str(userid))
os.system("systemctl -q restart glorytun-udp@tun" + str(userid))
2020-02-14 20:46:05 +00:00
def remove_glorytun_udp(userid):
2020-03-03 12:49:23 +00:00
os.system("systemctl -q disable glorytun-udp@tun" + str(userid))
2020-02-14 20:46:05 +00:00
os.system("systemctl -q stop glorytun-udp@tun" + str(userid))
os.remove('/etc/glorytun-udp/tun' + str(userid) + '.key')
os.remove('/etc/glorytun-udp/tun' + str(userid))
2020-01-12 17:41:34 +00:00
def add_dsvpn(userid):
port = '654{:02d}'.format(userid)
2020-01-25 20:53:58 +00:00
ip = IPNetwork('10.255.251.0/24')
subnets = ip.subnet(30)
network = list(subnets)[userid]
2020-03-03 12:49:23 +00:00
with open('/etc/dsvpn/dsvpn0', 'r') as f, open('/etc/dsvpn/dsvpn' + str(userid), 'w') as n:
2020-01-12 17:41:34 +00:00
for line in f:
if 'PORT' in line:
n.write('PORT=' + port + "\n")
elif 'DEV' in line:
n.write('DEV=dsvpn' + str(userid) + "\n")
elif 'LOCALTUNIP' in line:
2020-01-25 20:53:58 +00:00
n.write('LOCALTUNIP=' + str(list(network)[1]) + "\n")
elif 'REMOTETUNIP' in line:
n.write('REMOTETUNIP=' + str(list(network)[2]) + "\n")
2020-01-12 17:41:34 +00:00
else:
n.write(line)
dsvpn_key = secrets.token_hex(32)
2020-03-03 12:49:23 +00:00
with open('/etc/dsvpn/dsvpn' + str(userid) + '.key', 'w') as f:
2020-01-25 20:53:58 +00:00
f.write(dsvpn_key.upper())
2020-03-03 12:49:23 +00:00
os.system("systemctl -q enable dsvpn@dsvpn" + str(userid))
2020-01-12 17:41:34 +00:00
os.system("systemctl -q restart dsvpn@dsvpn" + str(userid))
2020-02-14 20:46:05 +00:00
def remove_dsvpn(userid):
2020-03-03 12:49:23 +00:00
os.system("systemctl -q disable dsvpn@dsvpn" + str(userid))
2020-02-14 20:46:05 +00:00
os.system("systemctl -q stop dsvpn@dsvpn" + str(userid))
os.remove('/etc/dsvpn/dsvpn' + str(userid))
os.remove('/etc/dsvpn/dsvpn' + str(userid) + '.key')
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-03-03 12:49:23 +00:00
def shorewall_add_port(user, port, proto, name, fwtype='ACCEPT'):
2020-01-20 20:05:40 +00:00
userid = user.userid
2020-03-03 12:49:23 +00:00
if userid is None:
2020-01-20 20:05:40 +00:00
userid = 0
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()
2020-03-05 14:02:20 +00:00
with open('/etc/shorewall/rules', 'r') as f, \
open(tmpfile, 'a+') as n:
2019-04-18 19:09:26 +00:00
for line in f:
2020-03-05 14:02:20 +00:00
if (fwtype == 'ACCEPT' and not port + ' # OMR open ' + name + ' port ' + proto in line and not port + ' # OMR ' + user.username + ' open ' + name + ' port ' + proto in line):
n.write(line)
2020-01-20 20:05:40 +00:00
elif fwtype == 'DNAT' and not port + ' # OMR redirect ' + name + ' port ' + proto in line and not port + ' # OMR ' + user.username + ' redirect ' + name + ' port ' + proto in line:
n.write(line)
if fwtype == 'ACCEPT':
2020-01-20 20:05:40 +00:00
n.write('ACCEPT net $FW ' + proto + ' ' + port + ' # OMR ' + user.username + ' open ' + name + ' port ' + proto + "\n")
elif fwtype == 'DNAT' and userid == 0:
n.write('DNAT net vpn:$OMR_ADDR ' + proto + ' ' + port + ' # OMR ' + user.username + ' redirect ' + name + ' port ' + proto + "\n")
2020-03-03 12:49:23 +00:00
elif fwtype == 'DNAT' and userid != 0:
2020-01-20 20:05:40 +00:00
n.write('DNAT net vpn:$OMR_ADDR_USER' + str(userid) + ' ' + proto + ' ' + port + ' # OMR ' + user.username + ' redirect ' + name + ' port ' + proto + "\n")
os.close(fd)
2020-03-03 12:49:23 +00:00
move(tmpfile, '/etc/shorewall/rules')
final_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall/rules', 'rb'))).hexdigest()
2020-03-03 12:49:23 +00:00
if initial_md5 != final_md5:
os.system("systemctl -q reload shorewall")
2020-03-03 12:49:23 +00:00
def shorewall_del_port(username, port, proto, name, fwtype='ACCEPT'):
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall/rules', 'rb'))).hexdigest()
fd, tmpfile = mkstemp()
2020-03-03 12:49:23 +00:00
with open('/etc/shorewall/rules', 'r') as f, open(tmpfile, 'a+') as n:
for line in f:
if fwtype == 'ACCEPT' and not port + ' # OMR open ' + name + ' port ' + proto in line and not port + ' # OMR ' + username + ' open ' + name + ' port ' + proto in line:
n.write(line)
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)
2020-03-03 12:49:23 +00:00
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()
2020-03-03 12:49:23 +00:00
if initial_md5 != final_md5:
2019-06-02 21:11:58 +00:00
os.system("systemctl -q reload shorewall")
2019-04-18 19:09:26 +00:00
2020-03-03 12:49:23 +00:00
def shorewall6_add_port(user, port, proto, name, fwtype='ACCEPT'):
2020-01-20 20:05:40 +00:00
userid = user.userid
2020-03-05 14:02:20 +00:00
if userid is None:
2020-01-20 20:05:40 +00:00
userid = 0
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall6/rules', 'rb'))).hexdigest()
fd, tmpfile = mkstemp()
2020-03-03 12:49:23 +00:00
with open('/etc/shorewall6/rules', 'r') as f, open(tmpfile, 'a+') as n:
for line in f:
2020-01-20 20:05:40 +00:00
if fwtype == 'ACCEPT' and not port + ' # OMR open ' + name + ' port ' + proto in line and not port + ' # OMR ' + user.username + ' open ' + name + ' port ' + proto in line:
n.write(line)
2020-01-20 20:05:40 +00:00
elif fwtype == 'DNAT' and not port + ' # OMR redirect ' + name + ' port ' + proto in line and not port + ' # OMR ' + user.username + ' redirect ' + name + ' port ' + proto in line:
n.write(line)
if fwtype == 'ACCEPT':
2020-01-20 20:05:40 +00:00
n.write('ACCEPT net $FW ' + proto + ' ' + port + ' # OMR ' + user.username + ' open ' + name + ' port ' + proto + "\n")
elif fwtype == 'DNAT' and userid == 0:
n.write('DNAT net vpn:$OMR_ADDR ' + proto + ' ' + port + ' # OMR ' + user.username + ' redirect ' + name + ' port ' + proto + "\n")
2020-03-03 12:49:23 +00:00
elif fwtype == 'DNAT' and userid != 0:
2020-01-20 20:05:40 +00:00
n.write('DNAT net vpn:$OMR_ADDR_USER' + str(userid) + ' ' + proto + ' ' + port + ' # OMR ' + user.username + ' redirect ' + name + ' port ' + proto + "\n")
os.close(fd)
2020-03-03 12:49:23 +00:00
move(tmpfile, '/etc/shorewall6/rules')
final_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall6/rules', 'rb'))).hexdigest()
2020-03-03 12:49:23 +00:00
if initial_md5 != final_md5:
os.system("systemctl -q reload shorewall6")
2020-03-03 12:49:23 +00:00
def shorewall6_del_port(username, port, proto, name, fwtype='ACCEPT'):
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall6/rules', 'rb'))).hexdigest()
fd, tmpfile = mkstemp()
2020-03-03 12:49:23 +00:00
with open('/etc/shorewall6/rules', 'r') as f, open(tmpfile, 'a+') as n:
for line in f:
if fwtype == 'ACCEPT' and not port + ' # OMR open ' + name + ' port ' + proto in line and not port + ' # OMR ' + username + ' open ' + name + ' port ' + proto in line:
n.write(line)
elif fwtype == 'DNAT' and not port + ' # OMR redirect ' + name + ' port ' + proto in line and not port + ' # OMR ' + username + ' redirect ' + name + ' port ' + proto in line:
n.write(line)
os.close(fd)
2020-03-03 12:49:23 +00:00
move(tmpfile, '/etc/shorewall6/rules')
final_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall6/rules', 'rb'))).hexdigest()
2020-03-03 12:49:23 +00:00
if initial_md5 != final_md5:
os.system("systemctl -q reload shorewall6")
2020-03-03 12:49:23 +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()
2020-03-03 13:06:18 +00:00
content = re.sub(",\s*}", "}", content) # pylint: disable=W1401
2019-08-12 14:43:05 +00:00
try:
data = json.loads(content)
except ValueError as e:
2020-03-03 12:49:23 +00:00
return {'error': 'Config file not readable', 'route': 'lastchange'}
data["lastchange"] = time.time() + sync
2020-03-03 12:49:23 +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
2020-03-03 12:49:23 +00:00
def set_global_param(key, value):
2020-01-13 20:47:29 +00:00
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json') as f:
content = f.read()
2020-03-03 13:06:18 +00:00
content = re.sub(",\s*}", "}", content) # pylint: disable=W1401
2020-01-13 20:47:29 +00:00
try:
data = json.loads(content)
except ValueError as e:
2020-03-03 12:49:23 +00:00
return {'error': 'Config file not readable', 'route': 'global_param'}
2020-01-13 20:47:29 +00:00
data[key] = value
2020-03-03 12:49:23 +00:00
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json', 'w') as outfile:
json.dump(data, outfile, indent=4)
2020-01-13 20:47:29 +00:00
2020-03-03 12:49:23 +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)
2020-03-03 12:49:23 +00:00
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json', 'w') as f:
json.dump(content, f, indent=4)
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:
2020-03-03 12:49:23 +00:00
LOG.debug("password true")
2019-11-02 17:10:10 +00:00
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:
2020-03-03 12:49:23 +00:00
LOG.debug("user doesn't exist")
2019-11-02 17:10:10 +00:00
return False
2019-11-16 19:49:26 +00:00
if not verify_password(password, user.user_password):
2020-03-03 12:49:23 +00:00
LOG.debug("wrong password")
2019-11-02 17:10:10 +00:00
return False
return user
class Token(BaseModel):
2020-03-03 12:49:23 +00:00
access_token: str = None
token_type: str = None
2019-11-02 17:10:10 +00:00
class TokenData(BaseModel):
username: str = None
class User(BaseModel):
username: str
vpn: str = None
vpn_port: int = None
vpn_client_ip: str = None
2020-01-13 20:47:29 +00:00
permissions: str = 'rw'
2019-11-13 07:39:00 +00:00
shadowsocks_port: int = None
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
2020-03-03 12:49:23 +00:00
# Add support for auth before seeing doc
class OAuth2PasswordBearerCookie(OAuth2):
def __init__(
2020-03-03 13:06:18 +00:00
self,
tokenUrl: str,
scheme_name: str = None,
scopes: dict = None,
auto_error: bool = True,
2020-03-03 12:49:23 +00:00
):
if not scopes:
scopes = {}
flows = OAuthFlowsModel(password={"tokenUrl": tokenUrl, "scopes": scopes})
super().__init__(flows=flows, scheme_name=scheme_name, auto_error=auto_error)
async def __call__(self, request: Request) -> Optional[str]:
header_authorization: str = request.headers.get("Authorization")
cookie_authorization: str = request.cookies.get("Authorization")
header_scheme, header_param = get_authorization_scheme_param(
header_authorization
)
cookie_scheme, cookie_param = get_authorization_scheme_param(
cookie_authorization
)
if header_scheme.lower() == "bearer":
authorization = True
scheme = header_scheme
param = header_param
elif cookie_scheme.lower() == "bearer":
authorization = True
scheme = cookie_scheme
param = cookie_param
2018-11-08 12:55:20 +00:00
2020-03-03 12:49:23 +00:00
else:
authorization = False
if not authorization or scheme.lower() != "bearer":
if self.auto_error:
raise HTTPException(
status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
)
else:
return None
return param
class BasicAuth(SecurityBase):
def __init__(self, scheme_name: str = None, auto_error: bool = True):
self.scheme_name = scheme_name or self.__class__.__name__
self.model = SecurityBaseModel(type="http")
self.auto_error = auto_error
async def __call__(self, request: Request) -> Optional[str]:
authorization: str = request.headers.get("Authorization")
scheme, param = get_authorization_scheme_param(authorization)
if not authorization or scheme.lower() != "basic":
if self.auto_error:
raise HTTPException(
status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
)
else:
return None
return param
basic_auth = BasicAuth(auto_error=False)
2018-11-08 12:55:20 +00:00
2019-11-02 17:10:10 +00:00
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
2020-03-03 12:49:23 +00:00
oauth2_scheme = OAuth2PasswordBearerCookie(tokenUrl="/token")
app = FastAPI(docs_url=None, redoc_url=None, openapi_url=None)
2019-11-02 17:10:10 +00:00
def create_access_token(*, data: dict, expires_delta: timedelta = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
2020-02-15 12:44:35 +00:00
expire = datetime.utcnow() + timedelta(minutes=60)
2019-11-02 17:10:10 +00:00
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(
2020-03-03 12:49:23 +00:00
status_code=HTTP_403_FORBIDDEN,
2019-11-02 17:10:10 +00:00
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:
2020-03-03 12:49:23 +00:00
LOG.debug("get_current_user: Username not found")
2019-11-02 17:10:10 +00:00
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
2020-03-03 12:49:23 +00:00
async def get_current_active_user(current_user: User = Depends(get_current_user)):
if current_user.disabled:
raise HTTPException(status_code=400, detail="Inactive user")
return current_user
# Show something at homepage
@app.get("/")
async def homepage():
return "Welcome to OpenMPTCProuter Server part"
2019-11-02 17:10:10 +00:00
# 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:
2020-03-03 12:49:23 +00:00
LOG.debug("Incorrect username or password")
2019-11-02 17:10:10 +00:00
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(
2020-03-03 13:06:18 +00:00
data={"sub": form_data.username}, expires_delta=access_token_expires
2019-11-02 17:10:10 +00:00
)
return {"access_token": access_token, "token_type": "bearer"}
2018-11-08 12:55:20 +00:00
2020-03-03 12:49:23 +00:00
@app.get("/logout")
async def route_logout_and_remove_cookie():
response = RedirectResponse(url="/")
response.delete_cookie("Authorization")
return response
# Login for doc
@app.get("/login_basic")
async def login_basic(auth: BasicAuth = Depends(basic_auth)):
if not auth:
response = Response(headers={"WWW-Authenticate": "Basic"}, status_code=401)
return response
try:
decoded = base64.b64decode(auth).decode("ascii")
username, _, password = decoded.partition(":")
user = authenticate_user(fake_users_db, username, password)
if not user:
raise HTTPException(status_code=400, detail="Incorrect email or password")
access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
access_token = create_access_token(
data={"sub": username}, expires_delta=access_token_expires
)
token = jsonable_encoder(access_token)
response = RedirectResponse(url="/docs")
response.set_cookie(
"Authorization",
value=f"Bearer {token}",
httponly=True,
max_age=1800,
expires=1800,
)
return response
except:
response = Response(headers={"WWW-Authenticate": "Basic"}, status_code=401)
return response
@app.get("/openapi.json")
async def get_open_api_endpoint(current_user: User = Depends(get_current_active_user)):
return JSONResponse(get_openapi(title="FastAPI", version=1, routes=app.routes))
@app.get("/docs")
async def get_documentation(current_user: User = Depends(get_current_active_user)):
return get_swagger_ui_html(openapi_url="/openapi.json", title="docs")
2018-11-08 12:55:20 +00:00
# Get VPS status
2019-11-02 17:10:10 +00:00
@app.get('/status')
2020-02-15 12:44:35 +00:00
async def status(current_user: User = Depends(get_current_user)):
2020-03-03 12:49:23 +00:00
LOG.debug('Get status...')
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()
vps_kernel = os.popen('uname -r').read().rstrip()
vps_omr_version = os.popen("grep -s 'OpenMPTCProuter VPS' /etc/* | awk '{print $4}'").read().rstrip()
mptcp_enabled = os.popen('sysctl -n net.mptcp.mptcp_enabled').read().rstrip()
2020-03-03 12:49:23 +00:00
#shadowsocks_port = current_user.shadowsocks_port
2020-02-15 16:25:54 +00:00
#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
2020-03-03 12:49:23 +00:00
LOG.debug('Get status: done')
if IFACE:
return {'vps': {'time': vps_current_time, 'loadavg': vps_loadavg, 'uptime': vps_uptime, 'mptcp': mptcp_enabled, 'hostname': vps_hostname, 'kernel': vps_kernel, '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:
2020-03-03 12:49:23 +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')
2020-02-15 12:44:35 +00:00
async def config(current_user: User = Depends(get_current_user)):
2020-03-03 12:49:23 +00:00
LOG.debug('Get config...')
userid = current_user.userid
2020-03-03 12:49:23 +00:00
if userid is None:
userid = 0
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 = {}
2020-03-03 12:49:23 +00:00
LOG.debug('Get config... shadowsocks')
2019-11-16 19:49:26 +00:00
with open('/etc/shadowsocks-libev/manager.json') as f:
content = f.read()
2020-03-03 13:06:18 +00:00
content = re.sub(",\s*}", "}", content) # pylint: disable=W1401
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"]
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:
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
2020-02-15 12:44:35 +00:00
#if not shadowsocks_port == None:
# ss_traffic = get_bytes_ss(current_user.shadowsocks_port)
#else:
ss_traffic = 0
2020-03-03 12:49:23 +00:00
LOG.debug('Get config... glorytun')
if os.path.isfile('/etc/glorytun-tcp/tun' + str(userid) +'.key'):
glorytun_key = open('/etc/glorytun-tcp/tun' + str(userid) + '.key').readline().rstrip()
else:
glorytun_key = ''
glorytun_port = '65001'
glorytun_chacha = False
2020-01-25 21:04:14 +00:00
glorytun_tcp_host_ip = ''
glorytun_tcp_client_ip = ''
glorytun_udp_host_ip = ''
glorytun_udp_client_ip = ''
if os.path.isfile('/etc/glorytun-tcp/tun' + str(userid)):
2020-03-03 12:49:23 +00:00
with open('/etc/glorytun-tcp/tun' + str(userid), "r") as glorytun_file:
for line in glorytun_file:
if 'PORT=' in line:
glorytun_port = line.replace(line[:5], '').rstrip()
2020-01-25 21:04:14 +00:00
if 'LOCALIP=' in line:
glorytun_tcp_host_ip = line.replace(line[:8], '').rstrip()
if 'REMOTEIP=' in line:
glorytun_tcp_client_ip = line.replace(line[:9], '').rstrip()
if 'chacha' in line:
glorytun_chacha = True
2020-01-25 21:04:14 +00:00
if userid == 0 and glorytun_tcp_host_ip == '':
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:
glorytun_tcp_host_ip = '10.255.255.1'
glorytun_tcp_client_ip = '10.255.255.2'
2020-01-25 21:04:14 +00:00
if os.path.isfile('/etc/glorytun-udp/tun' + str(userid)):
2020-03-03 12:49:23 +00:00
with open('/etc/glorytun-udp/tun' + str(userid), "r") as glorytun_file:
2020-01-25 21:04:14 +00:00
for line in glorytun_file:
if 'LOCALIP=' in line:
glorytun_udp_host_ip = line.replace(line[:8], '').rstrip()
if 'REMOTEIP=' in line:
glorytun_udp_client_ip = line.replace(line[:9], '').rstrip()
if userid == 0 and glorytun_udp_host_ip == '':
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'
available_vpn = ["glorytun-tcp", "glorytun-udp"]
2020-03-03 12:49:23 +00:00
LOG.debug('Get config... dsvpn')
2020-01-12 17:41:34 +00:00
if os.path.isfile('/etc/dsvpn/dsvpn' + str(userid) + '.key'):
dsvpn_key = open('/etc/dsvpn/dsvpn' + str(userid) + '.key').readline().rstrip()
2019-08-02 15:22:43 +00:00
available_vpn.append("dsvpn")
else:
dsvpn_key = ''
2020-01-12 17:41:34 +00:00
dsvpn_port = '65401'
2020-01-25 21:04:14 +00:00
dsvpn_host_ip = ''
dsvpn_client_ip = ''
2020-01-12 17:41:34 +00:00
if os.path.isfile('/etc/dsvpn/dsvpn' + str(userid)):
2020-03-03 12:49:23 +00:00
with open('/etc/dsvpn/dsvpn' + str(userid), "r") as dsvpn_file:
2020-01-12 17:41:34 +00:00
for line in dsvpn_file:
if 'PORT=' in line:
dsvpn_port = line.replace(line[:5], '').rstrip()
2020-01-25 21:04:14 +00:00
if 'LOCALTUNIP=' in line:
dsvpn_host_ip = line.replace(line[:11], '').rstrip()
if 'REMOTETUNIP=' in line:
dsvpn_client_ip = line.replace(line[:12], '').rstrip()
2020-01-12 17:41:34 +00:00
2020-01-25 21:04:14 +00:00
if userid == 0 and dsvpn_host_ip == '':
2020-01-12 17:41:34 +00:00
dsvpn_host_ip = '10.255.251.1'
dsvpn_client_ip = '10.255.251.2'
2018-11-23 14:19:30 +00:00
2020-03-03 12:49:23 +00:00
LOG.debug('Get config... iperf3')
if os.path.isfile('/etc/iperf3/public.pem'):
2020-03-03 12:49:23 +00:00
with open('/etc/iperf3/public.pem', "rb") as iperfkey_file:
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
2020-03-03 12:49:23 +00:00
LOG.debug('Get config... openvpn')
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'):
2020-03-03 12:49:23 +00:00
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'):
2020-03-03 12:49:23 +00:00
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'):
2020-03-03 12:49:23 +00:00
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 = ''
openvpn_port = '65301'
if os.path.isfile('/etc/openvpn/openvpn-tun0.conf'):
2020-03-03 12:49:23 +00:00
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
2020-03-03 13:06:18 +00:00
LOG.debug('Get config... mlvpn')
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'))
2020-03-03 12:49:23 +00:00
mlvpn_key = mlvpn_config.get('general', 'password').strip('"')
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-11-14 16:34:13 +00:00
2020-03-03 12:49:23 +00:00
LOG.debug('Get config... mptcp')
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
2020-03-03 12:49:23 +00:00
LOG.debug('Get config... ipv6')
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()
2020-03-03 12:49:23 +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()
2020-03-03 12:49:23 +00:00
LOG.debug('get server IPv4')
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()
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()
2020-03-03 12:49:23 +00:00
LOG.debug('get hostname')
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-13 20:47:29 +00:00
user_permissions = current_user.permissions
2020-03-03 12:49:23 +00:00
localip6 = ''
remoteip6 = ''
2020-01-20 20:05:40 +00:00
if userid == 0:
if os.path.isfile('/etc/openmptcprouter-vps-admin/omr-6in4/user' + str(userid)):
2020-03-03 12:49:23 +00:00
with open('/etc/openmptcprouter-vps-admin/omr-6in4/user' + str(userid), "r") as omr6in4_file:
for line in omr6in4_file:
if 'LOCALIP6=' in line:
localip6 = line.replace(line[:9], '').rstrip()
if 'REMOTEIP6=' in line:
remoteip6 = line.replace(line[:10], '').rstrip()
2020-01-20 20:05:40 +00:00
else:
2020-03-03 12:49:23 +00:00
locaip6 = 'fe80::a00:1'
remoteip6 = 'fe80::a00:2'
2020-01-20 20:05:40 +00:00
2020-02-24 09:27:15 +00:00
vpn = 'glorytun_tcp'
2020-02-24 11:13:05 +00:00
if 'vpn' in omr_config_data['users'][0][current_user.username]:
2020-02-24 09:27:15 +00:00
vpn = omr_config_data['users'][0][current_user.username]['vpn']
#vpn = current_user.vpn
2020-03-05 14:02:20 +00:00
if user_permissions == 'ro':
del available_vpn
available_vpn = [vpn]
2019-06-24 16:14:16 +00:00
alllanips = []
client2client = False
2020-03-03 12:49:23 +00:00
if 'client2client' in omr_config_data and omr_config_data['client2client']:
client2client = True
for users in omr_config_data['users'][0]:
2020-03-05 14:02:20 +00:00
if 'lanips' in omr_config_data['users'][0][users] and users != current_user.username and omr_config_data['users'][0][users]['lanips'][0] not in alllanips:
alllanips.append(omr_config_data['users'][0][users]['lanips'][0])
2018-11-14 14:10:42 +00:00
shorewall_redirect = "enable"
2020-03-03 12:49:23 +00:00
with open('/etc/shorewall/rules', 'r') as f:
2018-11-08 17:22:43 +00:00
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"
2020-03-03 12:49:23 +00:00
LOG.debug('Get config: done')
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_permissions}, '6in4': {'localip': localip6, 'remoteip': remoteip6}, 'client2client': {'enabled': client2client, 'lanips': alllanips}}
2018-11-08 12:55:20 +00:00
# Set shadowsocks config
class ShadowsocksConfigparams(BaseModel):
port: int
method: str
2019-11-24 18:48:22 +00:00
fast_open: bool
reuse_port: bool
no_delay: bool
mptcp: bool
obfs: bool
2019-11-24 18:48:22 +00:00
obfs_plugin: str
obfs_type: str
key: str
2019-11-13 18:21:02 +00:00
@app.post('/shadowsocks')
2020-03-03 12:49:23 +00:00
def shadowsocks(*, params: ShadowsocksConfigparams, current_user: User = Depends(get_current_user)):
2020-01-13 20:47:29 +00:00
if current_user.permissions == "ro":
set_lastchange(10)
2020-03-03 12:49:23 +00:00
return {'result': 'permission', 'reason': 'Read only user', 'route': 'shadowsocks'}
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:
content = f.read()
2020-03-03 13:06:18 +00:00
content = re.sub(",\s*}", "}", content) # pylint: disable=W1401
try:
data = json.loads(content)
except ValueError as e:
data = {'timeout': 600, 'verbose': 0, 'prefer_ipv6': False}
#key = data["key"]
if 'timeout' in data:
timeout = data["timeout"]
if 'verbose' in data:
verbose = data["verbose"]
else:
verbose = 0
2018-11-08 12:55:20 +00:00
prefer_ipv6 = data["prefer_ipv6"]
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
key = params.key
2019-11-16 19:49:26 +00:00
portkey = data["port_key"]
2020-03-03 12:49:23 +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:
2020-03-03 12:49:23 +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 == '':
2020-03-03 12:49:23 +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;tls'}
2019-12-17 18:10:09 +00:00
else:
2020-03-03 12:49:23 +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;tls;host=' + vps_domain}
2019-04-18 19:09:26 +00:00
else:
2020-03-03 12:49:23 +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 == '':
2020-03-03 12:49:23 +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/obfs-server', 'plugin_opts': 'obfs=tls;mptcp;fast-open;t=400'}
2019-12-17 18:10:09 +00:00
else:
2020-03-03 12:49:23 +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/obfs-server', 'plugin_opts': 'obfs=tls;mptcp;fast-open;t=400;host=' + vps_domain}
2019-12-17 18:10:09 +00:00
else:
2020-03-03 12:49:23 +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/obfs-server', 'plugin_opts': 'obfs=http;mptcp;fast-open;t=400'}
2019-01-25 19:43:49 +00:00
else:
2020-03-03 12:49:23 +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'}
2019-12-17 18:10:09 +00:00
else:
if obfs:
if obfs_plugin == "v2ray":
if obfs_type == "tls":
if vps_domain == '':
2020-03-03 12:49:23 +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;tls'}
2019-12-17 18:10:09 +00:00
else:
2020-03-03 12:49:23 +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;tls;host=' + vps_domain}
2019-04-18 19:09:26 +00:00
else:
2020-03-03 12:49:23 +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 == '':
2020-03-03 12:49:23 +00:00
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'}
2019-12-17 18:10:09 +00:00
else:
2020-03-03 12:49:23 +00:00
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}
2019-12-17 18:10:09 +00:00
else:
2020-03-03 12:49:23 +00:00
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'}
2019-12-17 18:10:09 +00:00
else:
2020-03-03 12:49:23 +00:00
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))):
2020-03-03 12:49:23 +00:00
with open('/etc/shadowsocks-libev/manager.json', 'w') as outfile:
json.dump(shadowsocks_config, outfile, indent=4)
2019-11-16 19:49:26 +00:00
os.system("systemctl restart shadowsocks-libev-manager@manager.service")
2020-03-03 12:49:23 +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")
2020-03-03 12:49:23 +00:00
shorewall_add_port(current_user, str(port), 'tcp', 'shadowsocks')
shorewall_add_port(current_user, str(port), 'udp', 'shadowsocks')
2019-08-12 14:43:05 +00:00
set_lastchange()
2020-03-03 12:49:23 +00:00
return {'result': 'done', 'reason': 'changes applied', 'route': 'shadowsocks'}
2018-11-08 12:55:20 +00:00
else:
2020-03-03 12:49:23 +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
class ShorewallAllparams(BaseModel):
redirect_ports: str
ipproto: str = "ipv4"
2019-11-02 17:10:10 +00:00
@app.post('/shorewall')
2020-03-03 12:49:23 +00:00
def shorewall(*, params: ShorewallAllparams, current_user: User = Depends(get_current_user)):
2020-01-13 20:47:29 +00:00
if current_user.permissions == "ro":
2020-03-03 12:49:23 +00:00
return {'result': 'permission', 'reason': 'Read only user', 'route': 'shorewall'}
state = params.redirect_ports
2019-01-06 17:53:06 +00:00
if state is None:
2020-03-03 12:49:23 +00:00
return {'result': 'error', 'reason': 'Invalid parameters', 'route': 'shorewall'}
if params.ipproto == 'ipv4':
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall/rules', 'rb'))).hexdigest()
fd, tmpfile = mkstemp()
2020-03-03 12:49:23 +00:00
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)
2020-03-03 12:49:23 +00:00
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()
2020-03-03 12:49:23 +00:00
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)
2020-03-03 12:49:23 +00:00
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...
2020-03-03 12:49:23 +00:00
return {'result': 'done', 'reason': 'changes applied'}
2018-11-08 17:05:34 +00:00
class ShorewallListparams(BaseModel):
name: str
ipproto: str = "ipv4"
2019-11-02 17:10:10 +00:00
@app.post('/shorewalllist')
2020-03-03 12:49:23 +00:00
def shorewall_list(*, params: ShorewallListparams, current_user: User = Depends(get_current_user)):
name = params.name
if name is None:
2020-03-03 12:49:23 +00:00
return {'result': 'error', 'reason': 'Invalid parameters', 'route': 'shorewalllist'}
fwlist = []
if params.ipproto == 'ipv4':
2020-03-03 12:49:23 +00:00
with open('/etc/shorewall/rules', 'r') as f:
for line in f:
if '# OMR ' + name in line:
fwlist.append(line)
else:
2020-03-03 12:49:23 +00:00
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}
class Shorewallparams(BaseModel):
name: str
2019-12-17 18:10:09 +00:00
port: str
proto: str
fwtype: str
ipproto: str = "ipv4"
2019-11-02 17:10:10 +00:00
@app.post('/shorewallopen')
2020-03-03 12:49:23 +00:00
def shorewall_open(*, params: Shorewallparams, current_user: User = Depends(get_current_user)):
2020-01-13 20:47:29 +00:00
if current_user.permissions == "ro":
2020-03-03 12:49:23 +00:00
return {'result': 'permission', 'reason': 'Read only user', 'route': 'shorewallopen'}
name = params.name
port = params.port
proto = params.proto
fwtype = params.fwtype
if name is None:
2020-03-03 12:49:23 +00:00
return {'result': 'error', 'reason': 'Invalid parameters', 'route': 'shorewallopen'}
if params.ipproto == 'ipv4':
2020-03-03 12:49:23 +00:00
shorewall_add_port(current_user, str(port), proto, name, fwtype)
else:
2020-03-03 12:49:23 +00:00
shorewall6_add_port(current_user, str(port), proto, name, fwtype)
return {'result': 'done', 'reason': 'changes applied'}
2019-11-02 17:10:10 +00:00
@app.post('/shorewallclose')
2020-03-03 12:49:23 +00:00
def shorewall_close(*, params: Shorewallparams, current_user: User = Depends(get_current_user)):
2020-01-13 20:47:29 +00:00
if current_user.permissions == "ro":
2020-03-03 12:49:23 +00:00
return {'result': 'permission', 'reason': 'Read only user', 'route': 'shorewallclose'}
name = params.name
port = params.port
proto = params.proto
fwtype = params.fwtype
if name is None:
2020-03-03 12:49:23 +00:00
return {'result': 'error', 'reason': 'Invalid parameters', 'route': 'shorewallclose'}
if params.ipproto == 'ipv4':
2020-03-03 12:49:23 +00:00
shorewall_del_port(current_user.username, str(port), proto, name, fwtype)
else:
2020-03-03 12:49:23 +00:00
shorewall6_del_port(current_user.username, str(port), proto, name, fwtype)
return {'result': 'done', 'reason': 'changes applied', 'route': 'shorewallclose'}
2018-11-14 16:34:13 +00:00
# Set MPTCP config
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')
2020-03-03 12:49:23 +00:00
def mptcp(*, params: MPTCPparams, current_user: User = Depends(get_current_user)):
if current_user.permissions == "ro":
set_lastchange(10)
2020-03-03 12:49:23 +00:00
return {'result': 'permission', 'reason': 'Read only user', 'route': 'mptcp'}
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:
2020-03-03 12:49:23 +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)
2020-02-19 18:29:17 +00:00
os.system('sysctl -qw net.mptcp.mptcp_syn_retries=' + str(syn_retries))
2018-12-28 07:55:46 +00:00
os.system('sysctl -qw net.ipv4.tcp_congestion_control=' + congestion_control)
2019-08-12 14:43:05 +00:00
set_lastchange()
2020-03-03 12:49:23 +00:00
return {'result': 'done', 'reason': 'changes applied'}
2019-11-02 17:10:10 +00:00
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')
2020-03-03 12:49:23 +00:00
def vpn(*, vpnconfig: Vpn, current_user: User = Depends(get_current_user)):
2020-01-13 20:47:29 +00:00
if current_user.permissions == "ro":
set_lastchange(10)
2020-03-03 12:49:23 +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:
2020-03-03 12:49:23 +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')
2020-03-03 12:49:23 +00:00
modif_config_user(current_user, {'vpn': vpn})
current_user.vpn = vpn
2019-08-12 14:43:05 +00:00
set_lastchange()
2020-03-03 12:49:23 +00:00
return {'result': 'done', 'reason': 'changes applied'}
2019-11-02 17:10:10 +00:00
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
# Set Glorytun config
2019-11-02 17:10:10 +00:00
@app.post('/glorytun')
2020-03-03 12:49:23 +00:00
def glorytun(*, glorytunconfig: GlorytunConfig, current_user: User = Depends(get_current_user)):
2020-01-13 20:47:29 +00:00
if current_user.permissions == "ro":
set_lastchange(10)
2020-03-03 12:49:23 +00:00
return {'result': 'permission', 'reason': 'Read only user', 'route': 'glorytun'}
2020-01-10 19:50:06 +00:00
userid = current_user.userid
if userid == None:
userid = 0
2019-11-02 17:10:10 +00:00
key = glorytunconfig.key
port = glorytunconfig.port
chacha = glorytunconfig.chacha
2020-01-10 19:50:06 +00:00
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/glorytun-tcp/tun' + str(userid), 'rb'))).hexdigest()
2020-03-03 12:49:23 +00:00
with open('/etc/glorytun-tcp/tun' + str(userid) + '.key', 'w') as outfile:
outfile.write(key)
2020-03-03 12:49:23 +00:00
with open('/etc/glorytun-udp/tun' + str(userid) + '.key', 'w') as outfile:
outfile.write(key)
fd, tmpfile = mkstemp()
2020-03-03 12:49:23 +00:00
with open('/etc/glorytun-tcp/tun' + str(userid), 'r') as f, open(tmpfile, 'a+') as n:
for line in f:
if 'PORT=' in line:
n.write('PORT=' + str(port) + '\n')
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')
else:
n.write(line)
os.close(fd)
2020-03-03 12:49:23 +00:00
move(tmpfile, '/etc/glorytun-tcp/tun' + str(userid))
2020-01-10 19:50:06 +00:00
final_md5 = hashlib.md5(file_as_bytes(open('/etc/glorytun-tcp/tun' + str(userid), 'rb'))).hexdigest()
2019-06-02 21:11:58 +00:00
if not initial_md5 == final_md5:
2020-01-10 19:50:06 +00:00
os.system("systemctl -q restart glorytun-tcp@tun" + str(userid))
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/glorytun-udp/tun' + str(userid), 'rb'))).hexdigest()
fd, tmpfile = mkstemp()
2020-03-03 12:49:23 +00:00
with open('/etc/glorytun-udp/tun' + str(userid), 'r') as f, open(tmpfile, 'a+') as n:
for line in f:
if 'BIND_PORT=' in line:
n.write('BIND_PORT=' + str(port) + '\n')
elif 'OPTIONS=' in line:
if chacha:
n.write('OPTIONS="chacha persist"\n')
else:
n.write('OPTIONS="persist"\n')
else:
n.write(line)
os.close(fd)
2020-03-03 12:49:23 +00:00
move(tmpfile, '/etc/glorytun-udp/tun' + str(userid))
2020-01-10 19:50:06 +00:00
final_md5 = hashlib.md5(file_as_bytes(open('/etc/glorytun-udp/tun' + str(userid), 'rb'))).hexdigest()
2019-06-02 21:11:58 +00:00
if not initial_md5 == final_md5:
2020-01-10 19:50:06 +00:00
os.system("systemctl -q restart glorytun-udp@tun" + str(userid))
2020-03-03 12:49:23 +00:00
shorewall_add_port(current_user, 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'}
2019-08-02 15:22:43 +00:00
# Set A Dead Simple VPN config
class DSVPN(BaseModel):
key: str
port: int
2019-11-02 17:10:10 +00:00
@app.post('/dsvpn')
2020-03-03 12:49:23 +00:00
def dsvpn(*, params: DSVPN, current_user: User = Depends(get_current_user)):
2020-01-13 20:47:29 +00:00
if current_user.permissions == "ro":
set_lastchange(10)
2020-03-03 12:49:23 +00:00
return {'result': 'permission', 'reason': 'Read only user', 'route': 'dsvpn'}
2020-01-12 17:41:34 +00:00
userid = current_user.userid
if userid == None:
userid = 0
key = params.key
port = params.port
2019-08-02 15:22:43 +00:00
if not key or port is None:
2020-03-03 12:49:23 +00:00
return {'result': 'error', 'reason': 'Invalid parameters', 'route': 'dsvpn'}
2020-01-12 17:41:34 +00:00
fd, tmpfile = mkstemp()
2020-03-03 12:49:23 +00:00
with open('/etc/dsvpn/dsvpn' + str(userid), 'r') as f, open(tmpfile, 'a+') as n:
2020-01-12 17:41:34 +00:00
for line in f:
if 'PORT=' in line:
n.write('PORT=' + str(port) + '\n')
else:
n.write(line)
os.close(fd)
2020-03-03 12:49:23 +00:00
move(tmpfile, '/etc/dsvpn/dsvpn' + str(userid))
2020-01-12 17:41:34 +00:00
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/dsvpn/dsvpn' + str(userid) + '.key', 'rb'))).hexdigest()
2020-03-03 12:49:23 +00:00
with open('/etc/dsvpn/dsvpn.key', 'w') as outfile:
2019-08-02 15:22:43 +00:00
outfile.write(key)
2020-01-12 17:41:34 +00:00
final_md5 = hashlib.md5(file_as_bytes(open('/etc/dsvpn/dsvpn' + str(userid) + '.key', 'rb'))).hexdigest()
2019-08-02 15:22:43 +00:00
if not initial_md5 == final_md5:
2020-01-12 17:41:34 +00:00
os.system("systemctl -q restart dsvpn-server@dsvpn" + str(userid))
2020-03-03 12:49:23 +00:00
shorewall_add_port(current_user, 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
# Set OpenVPN config
class OpenVPN(BaseModel):
key: str
2019-11-02 17:10:10 +00:00
@app.post('/openvpn')
2020-03-03 12:49:23 +00:00
def openvpn(*, ovpn: OpenVPN, current_user: User = Depends(get_current_user)):
2020-01-13 20:47:29 +00:00
if current_user.permissions == "ro":
set_lastchange(10)
2020-03-03 12:49:23 +00:00
return {'result': 'permission', 'reason': 'Read only user', 'route': 'openvpn'}
key = ovpn.key
if not key:
2020-03-03 12:49:23 +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()
2020-03-03 12:49: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')
2020-03-03 12:49:23 +00:00
def wan(*, wanips: Wanips, current_user: User = Depends(get_current_user)):
2019-11-02 17:10:10 +00:00
ips = wanips.ips
2019-08-29 20:39:22 +00:00
if not ips:
2020-03-03 12:49:23 +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()
2020-03-03 12:49:23 +00:00
with open('/etc/shadowsocks-libev/local.acl', 'w') as outfile:
2019-08-29 20:39:22 +00:00
outfile.write('[white_list]\n')
outfile.write(ips)
final_md5 = hashlib.md5(file_as_bytes(open('/etc/shadowsocks-libev/local.acl', 'rb'))).hexdigest()
#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
class Lanips(BaseModel):
lanips: List[str] = []
# Set user lan config
@app.post('/lan')
2020-03-03 12:49:23 +00:00
def lan(*, lanconfig: Lanips, current_user: User = Depends(get_current_user)):
lanips = lanconfig.lanips
if not lanips:
2020-03-03 12:49:23 +00:00
return {'result': 'error', 'reason': 'Invalid parameters', 'route': 'lan'}
modif_config_user(current_user, {'lanips': lanips})
2020-01-12 17:41:34 +00:00
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json') as f:
omr_config_data = json.load(f)
2020-01-13 20:47:29 +00:00
client2client = False
2020-01-12 17:41:34 +00:00
if 'client2client' in omr_config_data:
client2client = omr_config_data["client2client"]
2020-01-17 20:32:48 +00:00
if client2client == True:
2020-03-03 12:49:23 +00:00
with open('/etc/openvpn/ccd/' + current_user.username, 'w') as outfile:
2020-01-13 20:47:29 +00:00
for lan in lanips:
ip = IPNetwork(lan)
outfile.write('iroute ' + str(ip.network) + ' ' + str(ip.netmask) + "\n")
#outfile.write('route ' + str(ip.network) + ' ' + str(ip.netmask) + "\n")
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/openvpn/tun0.conf', 'rb'))).hexdigest()
fd, tmpfile = mkstemp()
2020-03-03 12:49:23 +00:00
with open('/etc/openvpn/tun0.conf', 'r') as f, open(tmpfile, 'a+') as n:
2020-01-13 20:47:29 +00:00
for line in f:
if not 'push "route ' + str(ip.network) + ' ' + str(ip.netmask) + '"' in line:
n.write(line)
n.write('push "route ' + str(ip.network) + ' ' + str(ip.netmask) + '"' + "\n")
os.close(fd)
2020-03-03 12:49:23 +00:00
move(tmpfile, '/etc/openvpn/tun0.conf')
2020-01-13 20:47:29 +00:00
final_md5 = hashlib.md5(file_as_bytes(open('/etc/openvpn/tun0.conf', 'rb'))).hexdigest()
if not initial_md5 == final_md5:
os.system("systemctl -q restart openvpn@tun0")
set_lastchange()
2020-03-03 12:49:23 +00:00
return {'result': 'done', 'reason': 'changes applied'}
2020-01-17 07:10:44 +00:00
class VPNips(BaseModel):
remoteip: str
localip: str
# Set user vpn IPs
@app.post('/vpnips')
2020-03-03 12:49:23 +00:00
def vpnips(*, vpnconfig: VPNips, current_user: User = Depends(get_current_user)):
2020-01-17 07:10:44 +00:00
remoteip = vpnconfig.remoteip
localip = vpnconfig.localip
if not remoteip or not localip:
2020-03-03 12:49:23 +00:00
return {'result': 'error', 'reason': 'Invalid parameters', 'route': 'vpnips'}
modif_config_user(current_user, {'vpnremoteip': remoteip})
modif_config_user(current_user, {'vpnlocalip': localip})
2020-01-17 07:10:44 +00:00
userid = current_user.userid
if userid == None:
userid = 0
2020-01-21 18:30:29 +00:00
if os.path.isfile('/etc/openmptcprouter-vps-admin/omr-6in4/user' + str(userid)):
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/openmptcprouter-vps-admin/omr-6in4/user' + str(userid), 'rb'))).hexdigest()
else:
initial_md5 = ''
2020-03-03 12:49:23 +00:00
with open('/etc/openmptcprouter-vps-admin/omr-6in4/user' + str(userid), 'w+') as n:
2020-01-17 07:10:44 +00:00
n.write('LOCALIP=' + localip + "\n")
n.write('REMOTEIP=' + remoteip + "\n")
2020-01-21 18:30:29 +00:00
n.write('LOCALIP6=fe80::a0' + hex(userid)[2:] + ':1/126' + "\n")
n.write('REMOTEIP6=fe80::a0' + hex(userid)[2:] + ':2/126' + "\n")
final_md5 = hashlib.md5(file_as_bytes(open('/etc/openmptcprouter-vps-admin/omr-6in4/user' + str(userid), 'rb'))).hexdigest()
2020-01-17 07:10:44 +00:00
if not initial_md5 == final_md5:
os.system("systemctl -q restart omr6in4@user" + str(userid))
set_lastchange()
2020-01-20 20:05:40 +00:00
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall/params.vpn', 'rb'))).hexdigest()
fd, tmpfile = mkstemp()
2020-03-03 12:49:23 +00:00
with open('/etc/shorewall/params.vpn', 'r') as f, open(tmpfile, 'a+') as n:
2020-01-20 20:05:40 +00:00
for line in f:
2020-01-21 18:30:29 +00:00
if not ('OMR_ADDR_USER' + str(userid) +'=' in line and not userid == 0) and not ('OMR_ADDR=' in line and userid == 0):
2020-01-20 20:05:40 +00:00
n.write(line)
2020-01-21 18:30:29 +00:00
if not userid == 0:
n.write('OMR_ADDR_USER' + str(userid) + '=' + remoteip + '\n')
elif userid == 0:
n.write('OMR_ADDR=' + remoteip + '\n')
2020-01-20 20:05:40 +00:00
os.close(fd)
2020-03-03 12:49:23 +00:00
move(tmpfile, '/etc/shorewall/params.vpn')
2020-01-20 20:05:40 +00:00
final_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall/params.vpn', 'rb'))).hexdigest()
if not initial_md5 == final_md5:
2020-03-03 12:49:23 +00:00
os.system("systemctl -q reload shorewall")
2020-01-20 20:05:40 +00:00
set_lastchange()
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall6/params.vpn', 'rb'))).hexdigest()
fd, tmpfile = mkstemp()
2020-03-03 12:49:23 +00:00
with open('/etc/shorewall6/params.vpn', 'r') as f, open(tmpfile, 'a+') as n:
2020-01-20 20:05:40 +00:00
for line in f:
2020-01-21 18:30:29 +00:00
if not ('OMR_ADDR_USER' + str(userid) +'=' in line and not userid == 0) and not ('OMR_ADDR=' in line and userid == 0):
2020-01-20 20:05:40 +00:00
n.write(line)
2020-01-21 18:30:29 +00:00
if not userid == 0:
n.write('OMR_ADDR_USER' + str(userid) + '=fe80::a0' + hex(userid)[2:] + ':2/126' + '\n')
elif userid == 0:
n.write('OMR_ADDR=fe80::a0' + hex(userid)[2:] + ':2/126' + '\n')
2020-01-20 20:05:40 +00:00
os.close(fd)
2020-03-03 12:49:23 +00:00
move(tmpfile, '/etc/shorewall6/params.vpn')
2020-01-20 20:05:40 +00:00
final_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall6/params.vpn', 'rb'))).hexdigest()
if not initial_md5 == final_md5:
2020-03-03 12:49:23 +00:00
os.system("systemctl -q reload shorewall6")
2020-01-20 20:05:40 +00:00
set_lastchange()
2020-03-03 12:49:23 +00:00
return {'result': 'done', 'reason': 'changes applied'}
2020-01-17 07:10:44 +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-13 20:47:29 +00:00
if current_user.permissions == "ro":
2020-03-03 12:49:23 +00:00
return {'result': 'permission', 'reason': 'Read only user', 'route': 'update'}
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
# Backup
class Backupfile(BaseModel):
data: str
2019-11-02 17:10:10 +00:00
@app.post('/backuppost')
2020-03-03 12:49:23 +00:00
def backuppost(*, backupfile: Backupfile, current_user: User = Depends(get_current_user)):
2020-01-13 20:47:29 +00:00
if current_user.permissions == "ro":
2020-03-03 12:49:23 +00:00
return {'result': 'permission', 'reason': 'Read only user', 'route': 'backuppost'}
backup_file = backupfile.data
if not backup_file:
2020-03-03 12:49:23 +00:00
return {'result': 'error', 'reason': 'Invalid parameters', 'route': 'backuppost'}
with open('/var/opt/openmptcprouter/' + current_user.username + '-backup.tar.gz', 'wb') as f:
f.write(base64.b64decode(backup_file))
2019-11-02 17:10:10 +00:00
return {'result': 'done'}
2019-11-02 17:10:10 +00:00
@app.get('/backupget')
def send_backup(current_user: User = Depends(get_current_user)):
2020-03-03 12:49:23 +00:00
with open('/var/opt/openmptcprouter/' + current_user.username + '-backup.tar.gz', "rb") as backup_file:
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-11-02 17:10:10 +00:00
@app.get('/backuplist')
def list_backup(current_user: User = Depends(get_current_user)):
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)):
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'))
2020-03-03 12:49:23 +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')
2020-03-03 12:49:23 +00:00
def edit_backup(params, current_user: User = Depends(get_current_user)):
2020-01-13 20:47:29 +00:00
if current_user.permissions == "ro":
2020-03-03 12:49:23 +00:00
return {'result': 'permission', 'reason': 'Read only user', 'route': 'backupedit'}
2019-10-10 19:13:14 +00:00
o = OpenWrt(params)
2020-03-03 12:49:23 +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-25 20:53:58 +00:00
glorytuntcp = "glorytun_tcp"
glorytunudp = "glorytun_udp"
2019-12-30 19:49:39 +00:00
class permissions(str, Enum):
2019-12-30 19:49:39 +00:00
ro = "ro"
rw = "rw"
admin = "admin"
class NewUser(BaseModel):
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)
@app.post('/add_user')
2020-03-03 12:49:23 +00:00
def add_user(*, params: NewUser, current_user: User = Depends(get_current_user)):
2020-01-13 20:47:29 +00:00
if not current_user.permissions == "admin":
2020-03-03 12:49:23 +00:00
return {'result': 'permission', 'reason': 'Need admin user', 'route': 'add_user'}
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json') as f:
content = json.load(f)
userid = 2
for users in content['users'][0]:
2020-01-17 14:46:55 +00:00
if 'userid' in content['users'][0][users]:
if int(content['users'][0][users]['userid']) > userid:
userid = int(content['users'][0][users]['userid'])
2020-01-17 07:10:44 +00:00
userid = userid + 1
2019-12-27 20:42:47 +00:00
user_key = secrets.token_hex(32)
2020-01-17 07:10:44 +00:00
user_json = json.loads('{"'+ params.username + '": {"username":"'+ params.username +'","permissions":"'+params.permission+'","user_password": "'+user_key.upper()+'","disabled":"false","userid":"' + str(userid) + '"}}')
# 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())
2020-03-03 12:49:23 +00:00
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)
2020-03-03 12:49:23 +00:00
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json', 'w') as f:
json.dump(content, f, indent=4)
# 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')
add_glorytun_tcp(userid)
add_glorytun_udp(userid)
2020-02-14 20:46:05 +00:00
add_dsvpn(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-27 20:42:47 +00:00
@app.post('/remove_user')
2020-03-03 12:49:23 +00:00
def remove_user(*, params: RemoveUser, current_user: User = Depends(get_current_user)):
2020-01-13 20:47:29 +00:00
if not current_user.permissions == "admin":
2020-03-03 12:49:23 +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']
2020-03-03 13:06:18 +00:00
userid = int(content['users'][0][params.username]['userid'])
2019-12-27 20:42:47 +00:00
del content['users'][0][params.username]
remove_ss_user(str(shadowsocks_port))
2020-03-03 12:49:23 +00:00
with open('/etc/openmptcprouter-vps-admin/omr-admin-config.json', 'w') as f:
json.dump(content, f, indent=4)
2020-01-14 18:23:14 +00:00
os.system('cd /etc/openvpn/ca && ./easyrsa --batch revoke ' + params.username)
os.system('cd /etc/openvpn/ca && ./easyrsa gen-crl')
os.system("systemctl -q restart openvpn@tun0")
2020-02-14 20:46:05 +00:00
remove_glorytun_tcp(userid)
remove_glorytun_udp(userid)
remove_dsvpn(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
2020-01-13 20:47:29 +00:00
class ClienttoClient(BaseModel):
enable: bool = False
@app.post('/client2client')
2020-03-03 12:49:23 +00:00
def client2client(*, params: ClienttoClient, current_user: User = Depends(get_current_user)):
2020-01-13 20:47:29 +00:00
if not current_user.permissions == "admin":
2020-03-03 12:49:23 +00:00
return {'result': 'permission', 'reason': 'Need admin user', 'route': 'client2client'}
set_global_param('client2client', params.enable)
2020-01-13 20:47:29 +00:00
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/openvpn/tun0.conf', 'rb'))).hexdigest()
fd, tmpfile = mkstemp()
2020-03-03 12:49:23 +00:00
with open('/etc/openvpn/tun0.conf', 'r') as f, open(tmpfile, 'a+') as n:
2020-01-13 20:47:29 +00:00
for line in f:
if not 'client-to-client' in line:
n.write(line)
n.write('client-to-client' + "\n")
os.close(fd)
2020-03-03 12:49:23 +00:00
move(tmpfile, '/etc/openvpn/tun0.conf')
2020-01-13 20:47:29 +00:00
final_md5 = hashlib.md5(file_as_bytes(open('/etc/openvpn/tun0.conf', 'rb'))).hexdigest()
if not initial_md5 == final_md5:
os.system("systemctl -q restart openvpn@tun0")
2020-01-29 20:20:43 +00:00
initial_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall/policy', 'rb'))).hexdigest()
fd, tmpfile = mkstemp()
2020-03-03 12:49:23 +00:00
with open('/etc/shorewall/policy', 'r') as f, open(tmpfile, 'a+') as n:
2020-01-29 20:20:43 +00:00
for line in f:
if not line == 'vpn vpn DROP\n' and not line == '# THE FOLLOWING POLICY MUST BE LAST\n' and not line == 'all all REJECT info\n':
n.write(line)
if params.enable == True:
n.write('vpn vpn DROP\n')
n.write('# THE FOLLOWING POLICY MUST BE LAST\n')
n.write('all all REJECT info\n')
os.close(fd)
2020-03-03 12:49:23 +00:00
move(tmpfile, '/etc/shorewall/policy')
2020-01-29 20:20:43 +00:00
final_md5 = hashlib.md5(file_as_bytes(open('/etc/shorewall/policy', 'rb'))).hexdigest()
2020-03-05 14:02:20 +00:00
if initial_md5 != final_md5:
2020-01-29 20:20:43 +00:00
os.system("systemctl -q reload shorewall")
2020-01-13 20:47:29 +00:00
return {'result': 'done'}
@app.get('/list_users')
2020-02-15 12:44:35 +00:00
async def list_users(current_user: User = Depends(get_current_user)):
2020-01-13 20:47:29 +00:00
if not current_user.permissions == "admin":
2020-03-03 12:49:23 +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)
return content['users'][0]
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)
2020-03-03 12:49:23 +00:00
omrport = 65500
2018-12-13 14:14:45 +00:00
if 'port' in omr_config_data:
omrport = omr_config_data["port"]
2020-03-03 12:49:23 +00:00
omrhost = '0.0.0.0'
2019-12-27 20:42:47 +00:00
if 'host' in omr_config_data:
omrhost = omr_config_data["host"]
# 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')
2020-03-03 12:49:23 +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')
# 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)