mirror of
https://github.com/house-of-vanity/OutFleet.git
synced 2025-08-21 22:47:15 +00:00
Many things
This commit is contained in:
24
lib.py
24
lib.py
@@ -7,7 +7,7 @@ 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',
|
||||||
datefmt='%d-%m-%Y %H:%M:%S')
|
datefmt='%d-%m-%Y %H:%M:%S')
|
||||||
log = logging.getLogger('OutlineFleet.lib')
|
|
||||||
|
|
||||||
|
|
||||||
class ServerDict(TypedDict):
|
class ServerDict(TypedDict):
|
||||||
@@ -44,6 +44,7 @@ class Server:
|
|||||||
'hostname_for_access_keys': self.client.get_server_information()["hostnameForAccessKeys"],
|
'hostname_for_access_keys': self.client.get_server_information()["hostnameForAccessKeys"],
|
||||||
'keys': self.client.get_keys()
|
'keys': self.client.get_keys()
|
||||||
}
|
}
|
||||||
|
self.log = logging.getLogger(f'OutFleet.server[{self.data["name"]}]')
|
||||||
|
|
||||||
def info(self) -> ServerDict:
|
def info(self) -> ServerDict:
|
||||||
return self.data
|
return self.data
|
||||||
@@ -51,23 +52,32 @@ class Server:
|
|||||||
def apply_config(self, config):
|
def apply_config(self, config):
|
||||||
if config.get("name"):
|
if config.get("name"):
|
||||||
self.client.set_server_name(config.get("name"))
|
self.client.set_server_name(config.get("name"))
|
||||||
log.info("Changed %s name to '%s'", self.data["server_id"], config.get("name"))
|
self.log.info("Changed %s name to '%s'", self.data["server_id"], config.get("name"))
|
||||||
if config.get("metrics"):
|
if config.get("metrics"):
|
||||||
self.client.set_metrics_status(True if config.get("metrics") == 'True' else False)
|
self.client.set_metrics_status(True if config.get("metrics") == 'True' else False)
|
||||||
log.info("Changed %s metrics status to '%s'", self.data["server_id"], config.get("metrics"))
|
self.log.info("Changed %s metrics status to '%s'", self.data["server_id"], config.get("metrics"))
|
||||||
if config.get("port_for_new_access_keys"):
|
if config.get("port_for_new_access_keys"):
|
||||||
self.client.set_port_new_for_access_keys(int(config.get("port_for_new_access_keys")))
|
self.client.set_port_new_for_access_keys(int(config.get("port_for_new_access_keys")))
|
||||||
log.info("Changed %s port_for_new_access_keys to '%s'", self.data["server_id"], config.get("port_for_new_access_keys"))
|
self.log.info("Changed %s port_for_new_access_keys to '%s'", self.data["server_id"], config.get("port_for_new_access_keys"))
|
||||||
if config.get("hostname_for_access_keys"):
|
if config.get("hostname_for_access_keys"):
|
||||||
self.client.set_hostname(config.get("hostname_for_access_keys"))
|
self.client.set_hostname(config.get("hostname_for_access_keys"))
|
||||||
log.info("Changed %s hostname_for_access_keys to '%s'", self.data["server_id"], config.get("hostname_for_access_keys"))
|
self.log.info("Changed %s hostname_for_access_keys to '%s'", self.data["server_id"], config.get("hostname_for_access_keys"))
|
||||||
if config.get("comment"):
|
if config.get("comment"):
|
||||||
with open("config.yaml", "r") as file:
|
with open("config.yaml", "r") as file:
|
||||||
config_file = yaml.safe_load(file) or {}
|
config_file = yaml.safe_load(file) or {}
|
||||||
config_file["servers"][self.data['server_id']]['comment'] = config.get("comment")
|
config_file["servers"][self.data['server_id']]['comment'] = config.get("comment")
|
||||||
with open("config.yaml", "w") as file:
|
with open("config.yaml", "w") as file:
|
||||||
yaml.safe_dump(config_file, file)
|
yaml.safe_dump(config_file, file)
|
||||||
log.info("Changed %s comment to '%s'", self.data["server_id"], config.get("comment"))
|
self.log.info("Changed %s comment to '%s'", self.data["server_id"], config.get("comment"))
|
||||||
|
|
||||||
def create_key(self, key_name):
|
def create_key(self, key_name):
|
||||||
return self.client.create_key(key_name)
|
self.log.info("New key created: %s", key_name)
|
||||||
|
return self.client.create_key(key_name)
|
||||||
|
|
||||||
|
def rename_key(self, key_id, new_name):
|
||||||
|
self.log.info("Key %s renamed: %s", key_id, new_name)
|
||||||
|
return self.client.rename_key(key_id, new_name)
|
||||||
|
|
||||||
|
def delete_key(self, key_id):
|
||||||
|
self.log.info("Key %s deleted", key_id)
|
||||||
|
return self.client.delete_key(key_id)
|
41
main.py
41
main.py
@@ -12,7 +12,8 @@ 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',
|
||||||
datefmt='%d-%m-%Y %H:%M:%S')
|
datefmt='%d-%m-%Y %H:%M:%S')
|
||||||
log = logging.getLogger('OutlineFleet')
|
|
||||||
|
log = logging.getLogger('OutFleet')
|
||||||
|
|
||||||
SERVERS = list()
|
SERVERS = list()
|
||||||
CLIENTS = list()
|
CLIENTS = list()
|
||||||
@@ -140,11 +141,43 @@ def add_client():
|
|||||||
|
|
||||||
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'):
|
||||||
log.info("%s", server.create_key(request.form.get('name')))
|
client = next((item for item in server.data["keys"] if item.name == request.form.get('old_name')), None)
|
||||||
|
if client:
|
||||||
|
if client.name == request.form.get('name'):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
server.rename_key(client.key_id, request.form.get('name'))
|
||||||
|
else:
|
||||||
|
server.create_key(request.form.get('name'))
|
||||||
|
else:
|
||||||
|
client = next((item for item in server.data["keys"] if item.name == request.form.get('old_name')), None)
|
||||||
|
if client:
|
||||||
|
server.delete_key(client.key_id)
|
||||||
update_state()
|
update_state()
|
||||||
return redirect(url_for('index', nt="User has been added"))
|
return redirect(url_for('clients', nt="Clients updated", selected_client=request.form.get('user_id')))
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/del_client', methods=['POST'])
|
||||||
|
def del_client():
|
||||||
|
if request.method == 'POST':
|
||||||
|
with open("config.yaml", "r") as file:
|
||||||
|
config = yaml.safe_load(file) or {}
|
||||||
|
|
||||||
|
clients = config.get('clients', dict())
|
||||||
|
user_id = request.form.get('user_id')
|
||||||
|
if user_id in clients:
|
||||||
|
for server in SERVERS:
|
||||||
|
client = next((item for item in server.data["keys"] if item.name == request.form.get('name')), None)
|
||||||
|
if client:
|
||||||
|
server.delete_key(client.key_id)
|
||||||
|
|
||||||
|
config["clients"].pop(user_id)
|
||||||
|
with open("config.yaml", "w") as file:
|
||||||
|
yaml.safe_dump(config, file)
|
||||||
|
update_state()
|
||||||
|
return redirect(url_for('clients', nt="User has been deleted"))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
update_state()
|
update_state()
|
||||||
app.run()
|
app.run(host='0.0.0.0')
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
<a href="#" id="menuLink" class="nav-menu-button">Menu</a>
|
<a href="#" id="menuLink" class="nav-menu-button">Menu</a>
|
||||||
|
|
||||||
<div class="nav-inner">
|
<div class="nav-inner">
|
||||||
<button onclick="location.href='/';" style="cursor:pointer;" class="primary-button pure-button">OutlineFleet</button>
|
<button onclick="location.href='/';" style="cursor:pointer;" class="primary-button pure-button">OutFleet</button>
|
||||||
|
|
||||||
<div class="pure-menu custom-restricted-width">
|
<div class="pure-menu custom-restricted-width">
|
||||||
<ul class="pure-menu-list">
|
<ul class="pure-menu-list">
|
||||||
|
@@ -60,7 +60,7 @@
|
|||||||
{% if selected_client and not add_client %}
|
{% if selected_client and not add_client %}
|
||||||
{% set client = CLIENTS[selected_client] %}
|
{% set client = CLIENTS[selected_client] %}
|
||||||
|
|
||||||
<div class="pure-u-1-3">
|
<div class="pure-u-1-2">
|
||||||
<div class="server-content-header pure-g">
|
<div class="server-content-header pure-g">
|
||||||
<div class="pure-u-1-2">
|
<div class="pure-u-1-2">
|
||||||
<h1 class="server-content-title">{{client['name']}}</h1>
|
<h1 class="server-content-title">{{client['name']}}</h1>
|
||||||
@@ -74,12 +74,13 @@
|
|||||||
<fieldset>
|
<fieldset>
|
||||||
<div class="pure-g">
|
<div class="pure-g">
|
||||||
<div class="pure-u-1 pure-u-md-1-3">
|
<div class="pure-u-1 pure-u-md-1-3">
|
||||||
<input type="text" class="pure-u-23-24" name="name" required value="{{client['name']}}"/>
|
<input type="text" class="pure-u-1" name="name" required value="{{client['name']}}"/>
|
||||||
|
<input type="hidden" class="pure-u-1" name="old_name" required value="{{client['name']}}"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="pure-u-1 pure-u-md-1-3">
|
<div class="pure-u-1 pure-u-md-1-3">
|
||||||
<input type="text" class="pure-u-23-24" name="comment" value="{{client['comment']}}"/>
|
<input type="text" class="pure-u-1" name="comment" value="{{client['comment']}}"/>
|
||||||
</div>
|
</div>
|
||||||
<input type="hidden" class="pure-u-23-24" name="user_id" value="{{selected_client}}"/>
|
<input type="hidden" class="pure-u-1" name="user_id" value="{{selected_client}}"/>
|
||||||
|
|
||||||
<div class="pure-checkbox">
|
<div class="pure-checkbox">
|
||||||
{% for server in SERVERS %}
|
{% for server in SERVERS %}
|
||||||
@@ -93,12 +94,67 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" class="pure-button pure-input-1 pure-button-primary">Add</button>
|
<button type="submit" class="pure-button pure-input-1 pure-button-primary">Save</button>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|
||||||
|
<div style="padding-top: 15px; padding-bottom: 15px">
|
||||||
|
<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>
|
</div>
|
||||||
|
<div class="pure-u-1 pure-u-md-1">
|
||||||
|
<h3>Dynamic Access Keys</h3>
|
||||||
|
<table class="pure-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Server</th>
|
||||||
|
<th>Dynamic</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>
|
||||||
|
</div>
|
||||||
|
<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="user_id" value="{{selected_client}}"/>
|
||||||
|
<button type="submit" class="pure-button button-error pure-input-1 ">Delete</button>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@@ -64,7 +64,7 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
{% set server = SERVERS[selected_server|int] %}
|
{% set server = SERVERS[selected_server|int] %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div id="main" class="pure-u-1-3">
|
<div id="main" class="pure-u-1">
|
||||||
<div class="server-content">
|
<div class="server-content">
|
||||||
<div class="server-content-header pure-g">
|
<div class="server-content-header pure-g">
|
||||||
<div class="pure-u-1-2">
|
<div class="pure-u-1-2">
|
||||||
|
Reference in New Issue
Block a user