This commit is contained in:
2023-09-25 23:48:25 +03:00
parent 2f73bb2b8d
commit 4b1a3e3811
5 changed files with 51 additions and 8 deletions

View File

@ -7,4 +7,7 @@
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
<component name="PackageRequirementsSettings">
<option name="versionSpecifier" value="Strong equality (==x.y.z)" />
</component>
</module> </module>

13
Dockerfile_amd64 Normal file
View File

@ -0,0 +1,13 @@
FROM arm64v8/python:3-alpine
WORKDIR /app
COPY requirements.txt .
COPY static static
COPY templates templates
COPY main.py .
COPY lib.py .
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python", "main.py"]

36
main.py
View File

@ -5,7 +5,7 @@ import random
import string import string
from flask import Flask, render_template, request, url_for, redirect from flask import Flask, render_template, request, url_for, redirect
from flask_cors import CORS
from lib import Server from lib import Server
logging.basicConfig( logging.basicConfig(
@ -16,9 +16,10 @@ logging.basicConfig(
log = logging.getLogger('OutFleet') log = logging.getLogger('OutFleet')
SERVERS = list() SERVERS = list()
CLIENTS = list() CLIENTS = dict()
HOSTNAME = 'test.local:5000'
app = Flask(__name__) app = Flask(__name__)
CORS(app)
def format_timestamp(ts): def format_timestamp(ts):
return datetime.fromtimestamp(ts // 1000).strftime('%Y-%m-%d %H:%M:%S') return datetime.fromtimestamp(ts // 1000).strftime('%Y-%m-%d %H:%M:%S')
@ -34,7 +35,7 @@ def update_state():
global SERVERS global SERVERS
global CLIENTS global CLIENTS
SERVERS = list() SERVERS = list()
CLIENTS = list() CLIENTS = dict()
config = dict() config = dict()
try: try:
with open("config.yaml", "r") as file: with open("config.yaml", "r") as file:
@ -85,7 +86,9 @@ def clients():
nl=request.args.get('nl'), nl=request.args.get('nl'),
selected_client=request.args.get('selected_client'), selected_client=request.args.get('selected_client'),
add_client=request.args.get('add_client', None), add_client=request.args.get('add_client', None),
format_timestamp=format_timestamp) format_timestamp=format_timestamp,
dynamic_hostname=HOSTNAME,
)
else: else:
server = request.form['server_id'] server = request.form['server_id']
server = next((item for item in SERVERS if item.info()["server_id"] == server), None) server = next((item for item in SERVERS if item.info()["server_id"] == server), None)
@ -178,6 +181,29 @@ def del_client():
return redirect(url_for('clients', nt="User has been deleted")) return redirect(url_for('clients', nt="User has been deleted"))
@app.route('/dynamic/<server_name>/<client_id>', methods=['GET'])
def dynamic(server_name, client_id):
client = next((keys for client, keys in CLIENTS.items() if client == client_id), None)
server = next((item for item in SERVERS if item.info()["name"] == server_name), None)
key = next((item for item in server.data["keys"] if item.name == client["name"]), None)
if server and client and key:
if server.data["server_id"] in client["servers"]:
log.info("Dynamic config for %s requested by '%s'", server.data["name"], client["name"])
return {
"server": server.data["hostname_for_access_keys"],
"server_port": key.port,
"password": key.password,
"method": key.method
}
log.info("CLIENT: %s", client)
log.info("SERVER: %s", server.data)
return f"{server_name}, {client_id}"
if __name__ == '__main__': if __name__ == '__main__':
update_state() update_state()
app.run(host='0.0.0.0') app.run(host='0.0.0.0')

View File

@ -1,3 +1,4 @@
outline-vpn-api outline-vpn-api
PyYAML PyYAML>=6.0.1
Flask Flask>=2.3.3
flask-cors

View File

@ -138,7 +138,7 @@
<tr> <tr>
<td>{{ server.info()['name'] }}</td> <td>{{ server.info()['name'] }}</td>
<td> <td>
<pre style="font-size: 10pt">{% for key in server.data["keys"] %}{% if key.name == client['name'] %}{{ key.access_url }}{% endif %}{% endfor %}</pre> <pre style="font-size: 10pt">{% for key in server.data["keys"] %}{% if key.name == client['name'] %}ssconf://{{ dynamic_hostname }}/dynamic/{{server.info()['name']}}/{{selected_client}}{% endif %}{% endfor %}</pre>
</td> </td>
</tr> </tr>
{% endif %} {% endif %}