mirror of https://github.com/CIRCL/AIL-framework
chg: [ail sync UI] restarr/launch/kill sync connections + show sync mode api/pull/push
parent
57f5afe831
commit
d9e0d4acc5
|
@ -121,6 +121,9 @@ def is_server_client_sync_mode_connected(ail_uuid, sync_mode):
|
|||
res = r_cache.hexists(f'ail_2_ail:server:client:{ail_uuid}', sync_mode)
|
||||
return res == 1
|
||||
|
||||
def is_server_client_connected(ail_uuid):
|
||||
return r_cache.sismember('ail_2_ail:server:all_clients', ail_uuid)
|
||||
|
||||
def clear_server_connected_clients():
|
||||
for ail_uuid in get_server_all_connected_clients():
|
||||
r_cache.delete(f'ail_2_ail:server:client:{ail_uuid}')
|
||||
|
@ -144,6 +147,11 @@ def send_command_to_server_controller(command, ail_uuid=None):
|
|||
r_cache.sadd('ail_2_ail:server_controller:command', str_command)
|
||||
|
||||
##-- --##
|
||||
def get_new_sync_client_id():
|
||||
for new_id in range(120000, 100000, -1):
|
||||
new_id = str(new_id)
|
||||
if not r_cache.exists(f'ail_2_ail:sync_client:{new_id}'):
|
||||
return str(new_id)
|
||||
|
||||
def get_all_sync_clients(r_set=False):
|
||||
res = r_cache.smembers('ail_2_ail:all_sync_clients')
|
||||
|
@ -155,11 +163,38 @@ def get_all_sync_clients(r_set=False):
|
|||
def get_sync_client_ail_uuid(client_id):
|
||||
return r_cache.hget(f'ail_2_ail:sync_client:{client_id}', 'ail_uuid')
|
||||
|
||||
def get_sync_client_sync_mode(client_id):
|
||||
return r_cache.hget(f'ail_2_ail:sync_client:{client_id}', 'sync_mode')
|
||||
|
||||
def set_sync_client_sync_mode(client_id, sync_mode):
|
||||
r_cache.hset(f'ail_2_ail:sync_client:{client_id}', 'sync_mode', sync_mode)
|
||||
|
||||
def create_sync_client_cache(ail_uuid, sync_mode, client_id=None):
|
||||
if client_id is None:
|
||||
client_id = get_new_sync_client_id()
|
||||
# save sync client status
|
||||
r_cache.hset(f'ail_2_ail:sync_client:{client_id}', 'ail_uuid', ail_uuid)
|
||||
r_cache.hset(f'ail_2_ail:sync_client:{client_id}', 'launch_time', int(time.time()))
|
||||
set_sync_client_sync_mode(client_id, sync_mode)
|
||||
|
||||
r_cache.sadd('ail_2_ail:all_sync_clients', client_id)
|
||||
|
||||
# create map ail_uuid/queue_uuid
|
||||
r_cache.sadd(f'ail_2_ail:ail_uuid:{ail_uuid}', client_id)
|
||||
return client_id
|
||||
|
||||
# current: only one push registred
|
||||
def get_client_id_by_ail_uuid(ail_uuid):
|
||||
def get_client_id_by_ail_uuid(ail_uuid, filter_push=True):
|
||||
res = r_cache.smembers(f'ail_2_ail:ail_uuid:{ail_uuid}')
|
||||
if res:
|
||||
return int(res.pop())
|
||||
if not filter_push:
|
||||
return res
|
||||
else:
|
||||
clients_id = []
|
||||
for client_id in res:
|
||||
client_id = int(client_id)
|
||||
if client_id <= 100000:
|
||||
clients_id.append(client_id)
|
||||
return clients_id
|
||||
|
||||
def get_all_running_sync_servers():
|
||||
running_ail_servers= []
|
||||
|
@ -168,11 +203,18 @@ def get_all_running_sync_servers():
|
|||
running_ail_servers.append(ail_uuid)
|
||||
return running_ail_servers
|
||||
|
||||
def get_ail_instance_all_running_sync_mode(ail_uuid):
|
||||
clients_id = get_client_id_by_ail_uuid(ail_uuid, filter_push=False)
|
||||
running_sync_mode = {'api': False, 'pull': False, 'push': False}
|
||||
for client_id in clients_id:
|
||||
sync_mode = get_sync_client_sync_mode(client_id)
|
||||
running_sync_mode[sync_mode] = True
|
||||
return running_sync_mode
|
||||
|
||||
def delete_sync_client_cache(client_id):
|
||||
ail_uuid = get_sync_client_ail_uuid(client_id)
|
||||
# map ail_uuid/queue_uuid
|
||||
# map ail_uuid
|
||||
r_cache.srem(f'ail_2_ail:ail_uuid:{ail_uuid}', client_id)
|
||||
r_cache.srem(f'ail_2_ail:queue_uuid:{queue_uuid}', client_id)
|
||||
|
||||
r_cache.delete(f'ail_2_ail:sync_client:{client_id}')
|
||||
r_cache.srem('ail_2_ail:all_sync_clients', client_id)
|
||||
|
@ -193,9 +235,10 @@ def send_command_to_manager(command, client_id=-1, ail_uuid=None):
|
|||
str_command = json.dumps(dict_action)
|
||||
r_cache.sadd('ail_2_ail:client_manager:command', str_command)
|
||||
|
||||
|
||||
def refresh_ail_instance_connection(ail_uuid):
|
||||
client_id = get_client_id_by_ail_uuid(ail_uuid)
|
||||
clients_id = get_client_id_by_ail_uuid(ail_uuid)
|
||||
if clients_id:
|
||||
clients_id = clients_id[0]
|
||||
launch_required = is_ail_instance_push_enabled(ail_uuid)
|
||||
|
||||
# relaunch
|
||||
|
@ -253,6 +296,7 @@ class AIL2AILClientManager(object):
|
|||
|
||||
def launch_sync_client(self, ail_uuid):
|
||||
dir_project = os.environ['AIL_HOME']
|
||||
sync_mode = 'push'
|
||||
client_id = self.get_new_sync_client_id()
|
||||
script_options = f'-u {ail_uuid} -m push -i {client_id}'
|
||||
screen.create_screen(AIL2AILClientManager.SCREEN_NAME)
|
||||
|
@ -262,13 +306,7 @@ class AIL2AILClientManager(object):
|
|||
AIL2AILClientManager.SCRIPT_NAME,
|
||||
script_options=script_options, kill_previous_windows=True)
|
||||
# save sync client status
|
||||
r_cache.hset(f'ail_2_ail:sync_client:{client_id}', 'ail_uuid', ail_uuid)
|
||||
r_cache.hset(f'ail_2_ail:sync_client:{client_id}', 'launch_time', int(time.time()))
|
||||
|
||||
r_cache.sadd('ail_2_ail:all_sync_clients', client_id)
|
||||
|
||||
# create map ail_uuid/queue_uuid
|
||||
r_cache.sadd(f'ail_2_ail:ail_uuid:{ail_uuid}', client_id)
|
||||
create_sync_client_cache(ail_uuid, sync_mode, client_id=client_id)
|
||||
|
||||
self.clients[client_id] = {'ail_uuid': ail_uuid}
|
||||
|
||||
|
@ -439,7 +477,7 @@ def get_ail_server_error(ail_uuid):
|
|||
return r_cache.hget(f'ail_2_ail:all_servers:metadata:{ail_uuid}', 'error')
|
||||
|
||||
# # TODO: HIDE ADD GLOBAL FILTER (ON BOTH SIDE)
|
||||
def get_ail_instance_metadata(ail_uuid, client_sync_mode=False, sync_queues=False):
|
||||
def get_ail_instance_metadata(ail_uuid, client_sync_mode=False, server_sync_mode=False, sync_queues=False):
|
||||
dict_meta = {}
|
||||
dict_meta['uuid'] = ail_uuid
|
||||
dict_meta['url'] = get_ail_instance_url(ail_uuid)
|
||||
|
@ -462,6 +500,9 @@ def get_ail_instance_metadata(ail_uuid, client_sync_mode=False, sync_queues=Fals
|
|||
dict_meta['client_sync_mode']['push'] = is_server_client_sync_mode_connected(ail_uuid, 'push')
|
||||
dict_meta['client_sync_mode']['api'] = is_server_client_sync_mode_connected(ail_uuid, 'api')
|
||||
|
||||
if server_sync_mode:
|
||||
dict_meta['server_sync_mode'] = get_ail_instance_all_running_sync_mode(ail_uuid)
|
||||
|
||||
return dict_meta
|
||||
|
||||
def get_all_ail_instances_metadata():
|
||||
|
@ -470,10 +511,11 @@ def get_all_ail_instances_metadata():
|
|||
l_servers.append(get_ail_instance_metadata(ail_uuid, sync_queues=True))
|
||||
return l_servers
|
||||
|
||||
def get_ail_instances_metadata(l_ail_servers, sync_queues=True, client_sync_mode=False):
|
||||
def get_ail_instances_metadata(l_ail_servers, sync_queues=True, client_sync_mode=False, server_sync_mode=False):
|
||||
l_servers = []
|
||||
for ail_uuid in l_ail_servers:
|
||||
server_metadata = get_ail_instance_metadata(ail_uuid, sync_queues=sync_queues, client_sync_mode=client_sync_mode)
|
||||
server_metadata = get_ail_instance_metadata(ail_uuid, sync_queues=sync_queues,
|
||||
client_sync_mode=client_sync_mode, server_sync_mode=server_sync_mode)
|
||||
l_servers.append(server_metadata)
|
||||
return l_servers
|
||||
|
||||
|
@ -644,6 +686,65 @@ def api_get_remote_ail_server_version(json_dict):
|
|||
res = get_remote_ail_server_version(ail_uuid)
|
||||
return res, 200
|
||||
|
||||
def api_kill_server_connected_clients(json_dict):
|
||||
ail_uuid = json_dict.get('uuid').replace(' ', '')
|
||||
if not is_valid_uuid_v4(ail_uuid):
|
||||
return {"status": "error", "reason": "Invalid ail uuid"}, 400
|
||||
ail_uuid = sanityze_uuid(ail_uuid)
|
||||
if not exists_ail_instance(ail_uuid):
|
||||
return {"status": "error", "reason": "AIL server not found"}, 404
|
||||
if not is_server_client_connected(ail_uuid):
|
||||
return {"status": "error", "reason": "Client not connected"}, 400
|
||||
|
||||
res = send_command_to_server_controller('kill', ail_uuid=ail_uuid)
|
||||
return res, 200
|
||||
|
||||
def api_kill_sync_client(json_dict):
|
||||
ail_uuid = json_dict.get('uuid').replace(' ', '')
|
||||
if not is_valid_uuid_v4(ail_uuid):
|
||||
return {"status": "error", "reason": "Invalid ail uuid"}, 400
|
||||
ail_uuid = sanityze_uuid(ail_uuid)
|
||||
if not exists_ail_instance(ail_uuid):
|
||||
return {"status": "error", "reason": "AIL server not found"}, 404
|
||||
|
||||
clients_id = get_client_id_by_ail_uuid(ail_uuid)
|
||||
if not clients_id:
|
||||
return {"status": "error", "reason": "Client not connected"}, 400
|
||||
|
||||
for client_id in clients_id:
|
||||
res = send_command_to_manager('kill', client_id=client_id, ail_uuid=ail_uuid)
|
||||
return res, 200
|
||||
|
||||
def api_launch_sync_client(json_dict):
|
||||
ail_uuid = json_dict.get('uuid').replace(' ', '')
|
||||
if not is_valid_uuid_v4(ail_uuid):
|
||||
return {"status": "error", "reason": "Invalid ail uuid"}, 400
|
||||
ail_uuid = sanityze_uuid(ail_uuid)
|
||||
if not exists_ail_instance(ail_uuid):
|
||||
return {"status": "error", "reason": "AIL server not found"}, 404
|
||||
|
||||
clients_id = get_client_id_by_ail_uuid(ail_uuid)
|
||||
if clients_id:
|
||||
return {"status": "error", "reason": "Client already connected"}, 400
|
||||
|
||||
res = send_command_to_manager('launch', ail_uuid=ail_uuid)
|
||||
return res, 200
|
||||
|
||||
def api_relaunch_sync_client(json_dict):
|
||||
ail_uuid = json_dict.get('uuid').replace(' ', '')
|
||||
if not is_valid_uuid_v4(ail_uuid):
|
||||
return {"status": "error", "reason": "Invalid ail uuid"}, 400
|
||||
ail_uuid = sanityze_uuid(ail_uuid)
|
||||
if not exists_ail_instance(ail_uuid):
|
||||
return {"status": "error", "reason": "AIL server not found"}, 404
|
||||
|
||||
clients_id = get_client_id_by_ail_uuid(ail_uuid)
|
||||
if not clients_id:
|
||||
return {"status": "error", "reason": "Client not connected"}, 400
|
||||
for client_id in clients_id:
|
||||
res = send_command_to_manager('relaunch', client_id=client_id, ail_uuid=ail_uuid)
|
||||
return res, 200
|
||||
|
||||
def api_create_ail_instance(json_dict):
|
||||
ail_uuid = json_dict.get('uuid').replace(' ', '')
|
||||
if not is_valid_uuid_v4(ail_uuid):
|
||||
|
|
|
@ -70,7 +70,7 @@ async def push(websocket, ail_uuid):
|
|||
else:
|
||||
await asyncio.sleep(10)
|
||||
|
||||
async def ail_to_ail_client(ail_uuid, sync_mode, api, ail_key=None):
|
||||
async def ail_to_ail_client(ail_uuid, sync_mode, api, ail_key=None, client_id=None):
|
||||
if not ail_2_ail.exists_ail_instance(ail_uuid):
|
||||
print('AIL server not found')
|
||||
return
|
||||
|
@ -88,7 +88,8 @@ async def ail_to_ail_client(ail_uuid, sync_mode, api, ail_key=None):
|
|||
uri = f"{ail_url}/{sync_mode}/{local_ail_uuid}"
|
||||
#print(uri)
|
||||
|
||||
ail_2_ail.clear_save_ail_server_error(ail_uuid)
|
||||
if client_id is None:
|
||||
client_id = ail_2_ail.create_sync_client_cache(ail_uuid, sync_mode)
|
||||
|
||||
try:
|
||||
async with websockets.client.connect(
|
||||
|
@ -97,6 +98,8 @@ async def ail_to_ail_client(ail_uuid, sync_mode, api, ail_key=None):
|
|||
#open_timeout=10, websockers 10.0 /!\ python>=3.7
|
||||
extra_headers={"Authorization": f"{ail_key}"}
|
||||
) as websocket:
|
||||
# success
|
||||
ail_2_ail.clear_save_ail_server_error(ail_uuid)
|
||||
|
||||
if sync_mode == 'pull':
|
||||
await pull(websocket, ail_uuid)
|
||||
|
@ -155,6 +158,8 @@ async def ail_to_ail_client(ail_uuid, sync_mode, api, ail_key=None):
|
|||
redis_logger.critical(f'{ail_uuid}: {error_message}')
|
||||
ail_2_ail.save_ail_server_error(ail_uuid, error_message)
|
||||
|
||||
ail_2_ail.delete_sync_client_cache(client_id)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
parser = argparse.ArgumentParser(description='Websocket SYNC Client')
|
||||
|
@ -168,6 +173,7 @@ if __name__ == '__main__':
|
|||
ail_uuid = args.ail_uuid
|
||||
sync_mode = args.sync_mode
|
||||
api = args.api
|
||||
client_id = args.client_id
|
||||
|
||||
if ail_uuid is None or sync_mode not in ['api', 'pull', 'push']:
|
||||
parser.print_help()
|
||||
|
@ -184,4 +190,4 @@ if __name__ == '__main__':
|
|||
ssl_context.verify_mode = ssl.CERT_NONE
|
||||
# SELF SIGNED CERTIFICATES
|
||||
|
||||
asyncio.get_event_loop().run_until_complete(ail_to_ail_client(ail_uuid, sync_mode, api))
|
||||
asyncio.get_event_loop().run_until_complete(ail_to_ail_client(ail_uuid, sync_mode, api, client_id=client_id))
|
||||
|
|
|
@ -73,7 +73,7 @@ async def server_controller():
|
|||
ail_uuid = command_dict.get('ail_uuid')
|
||||
connected_clients = CONNECTED_CLIENTS[ail_uuid].copy()
|
||||
for c_websocket in connected_clients:
|
||||
await c_websocket.close()
|
||||
await c_websocket.close(code=1000)
|
||||
redis_logger.info(f'Server Command Connection closed: {ail_uuid}')
|
||||
print(f'Server Command Connection closed: {ail_uuid}')
|
||||
|
||||
|
|
|
@ -55,7 +55,7 @@ def create_json_response(data, status_code):
|
|||
def ail_2_ail_dashboard():
|
||||
ail_uuid = ail_2_ail.get_ail_uuid()
|
||||
l_servers = ail_2_ail.get_all_running_sync_servers()
|
||||
l_servers = ail_2_ail.get_ail_instances_metadata(l_servers)
|
||||
l_servers = ail_2_ail.get_ail_instances_metadata(l_servers, server_sync_mode= True)
|
||||
l_clients = ail_2_ail.get_server_all_connected_clients()
|
||||
l_clients = ail_2_ail.get_ail_instances_metadata(l_clients, sync_queues=False, client_sync_mode=True)
|
||||
return render_template("ail_2_ail_dashboard.html", ail_uuid=ail_uuid,
|
||||
|
@ -79,7 +79,7 @@ def ail_servers():
|
|||
@login_admin
|
||||
def ail_server_view():
|
||||
ail_uuid = request.args.get('uuid')
|
||||
server_metadata = ail_2_ail.get_ail_instance_metadata(ail_uuid,sync_queues=True)
|
||||
server_metadata = ail_2_ail.get_ail_instance_metadata(ail_uuid, client_sync_mode=True, server_sync_mode=True, sync_queues=True)
|
||||
server_metadata['sync_queues'] = ail_2_ail.get_queues_metadata(server_metadata['sync_queues'])
|
||||
|
||||
return render_template("view_ail_server.html", server_metadata=server_metadata,
|
||||
|
@ -107,6 +107,50 @@ def ail_server_api_version():
|
|||
return create_json_response(res[0], res[1])
|
||||
return redirect(url_for('ail_2_ail_sync.ail_server_view', uuid=ail_uuid))
|
||||
|
||||
@ail_2_ail_sync.route('/settings/ail_2_ail/server/client/kill', methods=['GET'])
|
||||
@login_required
|
||||
@login_admin
|
||||
def ail_server_client_kill():
|
||||
ail_uuid = request.args.get('uuid')
|
||||
input_dict = {"uuid": ail_uuid}
|
||||
res = ail_2_ail.api_kill_server_connected_clients(input_dict)
|
||||
if res[1] != 200:
|
||||
return create_json_response(res[0], res[1])
|
||||
return redirect(url_for('ail_2_ail_sync.ail_2_ail_dashboard'))
|
||||
|
||||
@ail_2_ail_sync.route('/settings/ail_2_ail/server/sync_client/kill', methods=['GET'])
|
||||
@login_required
|
||||
@login_admin
|
||||
def ail_server_sync_client_kill():
|
||||
ail_uuid = request.args.get('uuid')
|
||||
input_dict = {"uuid": ail_uuid}
|
||||
res = ail_2_ail.api_kill_sync_client(input_dict)
|
||||
if res[1] != 200:
|
||||
return create_json_response(res[0], res[1])
|
||||
return redirect(url_for('ail_2_ail_sync.ail_2_ail_dashboard'))
|
||||
|
||||
@ail_2_ail_sync.route('/settings/ail_2_ail/server/sync_client/relaunch', methods=['GET'])
|
||||
@login_required
|
||||
@login_admin
|
||||
def ail_server_sync_client_relaunch():
|
||||
ail_uuid = request.args.get('uuid')
|
||||
input_dict = {"uuid": ail_uuid}
|
||||
res = ail_2_ail.api_relaunch_sync_client(input_dict)
|
||||
if res[1] != 200:
|
||||
return create_json_response(res[0], res[1])
|
||||
return redirect(url_for('ail_2_ail_sync.ail_2_ail_dashboard'))
|
||||
|
||||
@ail_2_ail_sync.route('/settings/ail_2_ail/server/sync_client/launch', methods=['GET'])
|
||||
@login_required
|
||||
@login_admin
|
||||
def ail_server_sync_client_launch():
|
||||
ail_uuid = request.args.get('uuid')
|
||||
input_dict = {"uuid": ail_uuid}
|
||||
res = ail_2_ail.api_launch_sync_client(input_dict)
|
||||
if res[1] != 200:
|
||||
return create_json_response(res[0], res[1])
|
||||
return redirect(url_for('ail_2_ail_sync.ail_2_ail_dashboard'))
|
||||
|
||||
@ail_2_ail_sync.route('/settings/ail_2_ail/server/add', methods=['GET', 'POST'])
|
||||
@login_required
|
||||
@login_admin
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
</div>
|
||||
|
||||
|
||||
<h1>Connected Servers:</h3>
|
||||
<h1>Connected - AIL Sync:</h3>
|
||||
|
||||
<table id="table_servers" class="table table-striped border-primary">
|
||||
<thead class="bg-dark text-white">
|
||||
|
@ -60,6 +60,8 @@
|
|||
<th>url</th>
|
||||
<th>description</th>
|
||||
<th>sync queues</th>
|
||||
<th>sync mode</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody style="font-size: 15px;">
|
||||
|
@ -77,15 +79,40 @@
|
|||
<a href="{{ url_for('ail_2_ail_sync.sync_queue_view') }}?uuid={{queue_uuid}}">
|
||||
{{queue_uuid}}</br>
|
||||
</a>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td>
|
||||
{% if dict_server['server_sync_mode']['api'] %}
|
||||
API
|
||||
{% endif %}
|
||||
{% if dict_server['server_sync_mode']['pull'] %}
|
||||
PULL
|
||||
{% endif %}
|
||||
{% if dict_server['server_sync_mode']['push'] %}
|
||||
PUSH
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if dict_server['server_sync_mode']['push'] %}
|
||||
<a href="{{ url_for('ail_2_ail_sync.ail_server_sync_client_kill') }}?uuid={{ dict_server['uuid'] }}">
|
||||
<button type="button" class="btn btn-danger px-1 py-0">
|
||||
<i class="fas fa-times"></i> kill
|
||||
</button>
|
||||
<a href="{{ url_for('ail_2_ail_sync.ail_server_sync_client_relaunch') }}?uuid={{ dict_server['uuid'] }}">
|
||||
<button type="button" class="btn btn-info px-1 py-0">
|
||||
<i class="fas fa-redo-alt"></i> reLaunch
|
||||
</button>
|
||||
</a>
|
||||
</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
<h1>Connected Clients:</h3>
|
||||
<h1>Connected - Remote Sync:</h3>
|
||||
|
||||
<table id="table_servers" class="table table-striped border-primary">
|
||||
<thead class="bg-dark text-white">
|
||||
|
@ -94,6 +121,7 @@
|
|||
<th>url</th>
|
||||
<th>description</th>
|
||||
<th>sync mode</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody style="font-size: 15px;">
|
||||
|
@ -109,14 +137,21 @@
|
|||
<td class="text-center">
|
||||
{% if dict_server['client_sync_mode']['api'] %}
|
||||
API
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if dict_server['client_sync_mode']['pull'] %}
|
||||
PULL
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if dict_server['client_sync_mode']['push'] %}
|
||||
PUSH
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ url_for('ail_2_ail_sync.ail_server_client_kill') }}?uuid={{ dict_server['uuid'] }}">
|
||||
<button type="button" class="btn btn-danger px-1 py-0">
|
||||
<i class="fas fa-times"></i> kill
|
||||
</button>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
|
|
@ -125,6 +125,61 @@
|
|||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-right"><b>AIL Sync</b></td>
|
||||
<td>
|
||||
{% if server_metadata['server_sync_mode']['api'] %}
|
||||
API
|
||||
{% endif %}
|
||||
{% if server_metadata['server_sync_mode']['pull'] %}
|
||||
PULL
|
||||
{% endif %}
|
||||
{% if server_metadata['server_sync_mode']['push'] %}
|
||||
PUSH
|
||||
|
||||
<a href="{{ url_for('ail_2_ail_sync.ail_server_sync_client_kill') }}?uuid={{ server_metadata['uuid'] }}">
|
||||
<button type="button" class="btn btn-danger px-1 py-0">
|
||||
<i class="fas fa-times"></i> Kill
|
||||
</button>
|
||||
</a>
|
||||
<a href="{{ url_for('ail_2_ail_sync.ail_server_sync_client_relaunch') }}?uuid={{ server_metadata['uuid'] }}">
|
||||
<button type="button" class="btn btn-info px-1 py-0">
|
||||
<i class="fas fa-redo-alt"></i> reLaunch
|
||||
</button>
|
||||
</a>
|
||||
{% else %}
|
||||
{% if (server_metadata['pull'] or server_metadata['push']) and server_metadata['sync_queues']%}
|
||||
<a href="{{ url_for('ail_2_ail_sync.ail_server_sync_client_launch') }}?uuid={{ server_metadata['uuid'] }}">
|
||||
<button type="button" class="btn btn-primary px-1 py-0">
|
||||
<i class="fas fa-play"></i> Launch
|
||||
</button>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-right"><b>Remote Sync</b></td>
|
||||
<td>
|
||||
{% if server_metadata['client_sync_mode']['api'] %}
|
||||
API
|
||||
{% endif %}
|
||||
{% if server_metadata['client_sync_mode']['pull'] %}
|
||||
PULL
|
||||
{% endif %}
|
||||
{% if server_metadata['client_sync_mode']['push'] %}
|
||||
PUSH
|
||||
{% endif %}
|
||||
|
||||
{% if server_metadata['client_sync_mode']['api'] or server_metadata['client_sync_mode']['pull'] or server_metadata['client_sync_mode']['push'] %}
|
||||
<a href="{{ url_for('ail_2_ail_sync.ail_server_client_kill') }}?uuid={{ server_metadata['uuid'] }}">
|
||||
<button type="button" class="btn btn-danger px-1 py-0">
|
||||
<i class="fas fa-times"></i> kill
|
||||
</button>
|
||||
</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
|
Loading…
Reference in New Issue