mirror of
https://github.com/house-of-vanity/OutFleet.git
synced 2025-07-07 01:24:06 +00:00
Added share text
This commit is contained in:
37
main.py
37
main.py
@ -8,6 +8,9 @@ from flask import Flask, render_template, request, url_for, redirect
|
|||||||
from flask_cors import CORS
|
from flask_cors import CORS
|
||||||
from lib import Server
|
from lib import Server
|
||||||
|
|
||||||
|
logging.getLogger('werkzeug').setLevel(logging.ERROR)
|
||||||
|
|
||||||
|
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
level=logging.INFO,
|
level=logging.INFO,
|
||||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||||||
@ -52,7 +55,7 @@ def update_state():
|
|||||||
try:
|
try:
|
||||||
server = Server(url=server_config["url"], cert=server_config["cert"], comment=server_config["comment"])
|
server = Server(url=server_config["url"], cert=server_config["cert"], comment=server_config["comment"])
|
||||||
SERVERS.append(server)
|
SERVERS.append(server)
|
||||||
log.info("Server found: %s", server.info()["name"])
|
log.info("Server state updated: %s", server.info()["name"])
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.warning("Can't access server: %s - %s", server_config["url"], e)
|
log.warning("Can't access server: %s - %s", server_config["url"], e)
|
||||||
|
|
||||||
@ -94,13 +97,13 @@ def clients():
|
|||||||
format_timestamp=format_timestamp,
|
format_timestamp=format_timestamp,
|
||||||
dynamic_hostname=HOSTNAME,
|
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)
|
||||||
server.apply_config(request.form)
|
# server.apply_config(request.form)
|
||||||
update_state()
|
# update_state()
|
||||||
return redirect(
|
# return redirect(
|
||||||
url_for('index', nt="Updated Outline VPN Server", selected_server=request.args.get('selected_server')))
|
# url_for('index', nt="Updated Outline VPN Server", selected_server=request.args.get('selected_server')))
|
||||||
|
|
||||||
|
|
||||||
@app.route('/add_server', methods=['POST'])
|
@app.route('/add_server', methods=['POST'])
|
||||||
@ -123,6 +126,7 @@ def add_server():
|
|||||||
config["servers"] = servers
|
config["servers"] = servers
|
||||||
with open("config.yaml", "w") as file:
|
with open("config.yaml", "w") as file:
|
||||||
yaml.safe_dump(config, file)
|
yaml.safe_dump(config, file)
|
||||||
|
log.info("Added server: %s", new_server.data["name"])
|
||||||
update_state()
|
update_state()
|
||||||
return redirect(url_for('index', nt="Added Outline VPN Server"))
|
return redirect(url_for('index', nt="Added Outline VPN Server"))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -146,6 +150,7 @@ def add_client():
|
|||||||
config["clients"] = clients
|
config["clients"] = clients
|
||||||
with open("config.yaml", "w") as file:
|
with open("config.yaml", "w") as file:
|
||||||
yaml.safe_dump(config, file)
|
yaml.safe_dump(config, file)
|
||||||
|
log.info("Client %s updated", request.form.get('name'))
|
||||||
|
|
||||||
for server in SERVERS:
|
for server in SERVERS:
|
||||||
if server.data["server_id"] in request.form.getlist('servers'):
|
if server.data["server_id"] in request.form.getlist('servers'):
|
||||||
@ -155,14 +160,22 @@ def add_client():
|
|||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
server.rename_key(client.key_id, request.form.get('name'))
|
server.rename_key(client.key_id, request.form.get('name'))
|
||||||
|
log.info("Renaming key %s to %s on server %s",
|
||||||
|
request.form.get('old_name'),
|
||||||
|
request.form.get('name'),
|
||||||
|
server.data["name"])
|
||||||
else:
|
else:
|
||||||
server.create_key(request.form.get('name'))
|
server.create_key(request.form.get('name'))
|
||||||
|
log.info("Creating key %s on server %s", request.form.get('name'), server.data["name"])
|
||||||
else:
|
else:
|
||||||
client = next((item for item in server.data["keys"] if item.name == request.form.get('old_name')), None)
|
client = next((item for item in server.data["keys"] if item.name == request.form.get('old_name')), None)
|
||||||
if client:
|
if client:
|
||||||
server.delete_key(client.key_id)
|
server.delete_key(client.key_id)
|
||||||
|
log.info("Deleting key %s on server %s", request.form.get('name'), server.data["name"])
|
||||||
update_state()
|
update_state()
|
||||||
return redirect(url_for('clients', nt="Clients updated", selected_client=request.form.get('user_id')))
|
return redirect(url_for('clients', nt="Clients updated", selected_client=request.form.get('user_id')))
|
||||||
|
else:
|
||||||
|
return redirect(url_for('index'))
|
||||||
|
|
||||||
|
|
||||||
@app.route('/del_client', methods=['POST'])
|
@app.route('/del_client', methods=['POST'])
|
||||||
@ -182,6 +195,7 @@ def del_client():
|
|||||||
config["clients"].pop(user_id)
|
config["clients"].pop(user_id)
|
||||||
with open("config.yaml", "w") as file:
|
with open("config.yaml", "w") as file:
|
||||||
yaml.safe_dump(config, file)
|
yaml.safe_dump(config, file)
|
||||||
|
log.info("Deleting client %s", request.form.get('name'))
|
||||||
update_state()
|
update_state()
|
||||||
return redirect(url_for('clients', nt="User has been deleted"))
|
return redirect(url_for('clients', nt="User has been deleted"))
|
||||||
|
|
||||||
@ -194,8 +208,7 @@ def dynamic(server_name, client_id):
|
|||||||
key = next((item for item in server.data["keys"] if item.name == client["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 and client and key:
|
||||||
if server.data["server_id"] in client["servers"]:
|
if server.data["server_id"] in client["servers"]:
|
||||||
log.info("Dynamic config for %s requested by '%s'", server.data["name"], client["name"])
|
log.info("Client %s wants ssconf for %s", client["name"], server.data["name"])
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"server": server.data["hostname_for_access_keys"],
|
"server": server.data["hostname_for_access_keys"],
|
||||||
"server_port": key.port,
|
"server_port": key.port,
|
||||||
@ -203,7 +216,11 @@ def dynamic(server_name, client_id):
|
|||||||
"method": key.method,
|
"method": key.method,
|
||||||
"info": "Managed by OutFleet [github.com/house-of-vanity/OutFleet/]"
|
"info": "Managed by OutFleet [github.com/house-of-vanity/OutFleet/]"
|
||||||
}
|
}
|
||||||
|
else:
|
||||||
|
log.warning("Hack attempt! Client %s denied by ACL on %s", client["name"], server.data["name"])
|
||||||
|
return "Hey buddy, i think you got the wrong door the leather-club is two blocks down"
|
||||||
except:
|
except:
|
||||||
|
log.warning("Hack attempt! Client or server doesn't exist. SCAM")
|
||||||
return "Hey buddy, i think you got the wrong door the leather-club is two blocks down"
|
return "Hey buddy, i think you got the wrong door the leather-club is two blocks down"
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<div id="list" class="pure-u-1-3" xmlns="http://www.w3.org/1999/html">
|
<div id="list" class="pure-u-1-3" xmlns="http://www.w3.org/1999/html" xmlns="http://www.w3.org/1999/html">
|
||||||
<div class="server-item pure-g">
|
<div class="server-item pure-g">
|
||||||
<h1 class="server-content-title">Clients</h1>
|
<h1 class="server-content-title">Clients</h1>
|
||||||
</div>
|
</div>
|
||||||
@ -98,31 +98,18 @@
|
|||||||
</fieldset>
|
</fieldset>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
<div>
|
||||||
<div style="padding-top: 15px; padding-bottom: 15px">
|
<h3>Invite text</h3><hr>
|
||||||
<div class="pure-u-1 pure-u-md-1">
|
<p>Install OutLine VPN. Copy and paste below keys to OutLine client.</p>
|
||||||
<h3>SS Links</h3>
|
|
||||||
<table class="pure-table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Server</th>
|
|
||||||
<th>SSlink</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for server in SERVERS %}
|
{% for server in SERVERS %}
|
||||||
{% if server.info()['server_id'] in client['servers'] %}
|
{% if server.info()['server_id'] in client['servers'] %}
|
||||||
<tr>
|
<b>{{server.info()['name']}}</b></br>
|
||||||
<td>{{ server.info()['name'] }}</td>
|
<code>{% for key in server.data["keys"] %}{% if key.name == client['name'] %}ssconf://{{ dynamic_hostname }}/dynamic/{{server.info()['name']}}/{{selected_client}}#{{server.info()['comment']}}{% endif %}{% endfor %}</code></br></br>
|
||||||
<td>
|
{% endif %}
|
||||||
<pre style="font-size: 10pt">{% for key in server.data["keys"] %}{% if key.name == client['name'] %}{{ key.access_url }}{% endif %}{% endfor %}</pre>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</div>
|
||||||
</table>
|
<hr>
|
||||||
</div>
|
<div style="padding-top: 15px; padding-bottom: 15px">
|
||||||
<div class="pure-u-1">
|
<div class="pure-u-1">
|
||||||
<h3>Dynamic Access Keys</h3>
|
<h3>Dynamic Access Keys</h3>
|
||||||
<table class="pure-table">
|
<table class="pure-table">
|
||||||
@ -146,6 +133,30 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="pure-u-1 pure-u-md-1">
|
||||||
|
<h3>SS Links</h3>
|
||||||
|
<table class="pure-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Server</th>
|
||||||
|
<th>SSlink</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for server in SERVERS %}
|
||||||
|
{% if server.info()['server_id'] in client['servers'] %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ server.info()['name'] }}</td>
|
||||||
|
<td>
|
||||||
|
<pre style="font-size: 10pt">{% for key in server.data["keys"] %}{% if key.name == client['name'] %}{{ key.access_url }}{% endif %}{% endfor %}</pre>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
</div>
|
</div>
|
||||||
<form action="/del_client" class="pure-form pure-form-stacked" method="POST">
|
<form action="/del_client" class="pure-form pure-form-stacked" method="POST">
|
||||||
<input type="hidden" class="pure-u-1" name="name" required value="{{client['name']}}"/>
|
<input type="hidden" class="pure-u-1" name="name" required value="{{client['name']}}"/>
|
||||||
|
Reference in New Issue
Block a user