mirror of
https://gitlab.com/crafty-controller/crafty-4.git
synced 2024-08-30 18:23:09 +00:00
Merge branch 'dev' into 'subprocess'
# Conflicts: # app/classes/shared/helpers.py # app/classes/shared/server.py # app/classes/web/ajax_handler.py
This commit is contained in:
commit
1c9ffb2abc
@ -3,11 +3,11 @@ FROM python:alpine
|
||||
LABEL maintainer="Dockerfile created by Zedifus <https://gitlab.com/zedifus>"
|
||||
|
||||
# Install Packages, Build Dependencies & Garbage Collect & Harden
|
||||
# (Testing repo is needed because jre16 is new)
|
||||
# (Alpine Edge repo is needed because jre16 is new)
|
||||
COPY requirements.txt /commander/requirements.txt
|
||||
RUN apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing openssl-dev rust cargo gcc musl-dev libffi-dev make openjdk8-jre-base openjdk11-jre-headless openjdk16-jre-headless mariadb-dev \
|
||||
RUN apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/community llvm11-libs openssl-dev rust cargo gcc musl-dev libffi-dev make openjdk8-jre-base openjdk11-jre-headless openjdk16-jre-headless mariadb-dev \
|
||||
&& pip3 install --no-cache-dir -r /commander/requirements.txt \
|
||||
&& apk del --no-cache gcc musl-dev libffi-dev make rust cargo openssl-dev \
|
||||
&& apk del --no-cache gcc musl-dev libffi-dev make rust cargo openssl-dev llvm11-libs \
|
||||
&& rm -rf /sbin/apk \
|
||||
&& rm -rf /etc/apk \
|
||||
&& rm -rf /lib/apk \
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Crafty Controller 4.0.0-alpha.2
|
||||
# Crafty Controller 4.0.0-alpha.3
|
||||
> Python based Control Panel for your Minecraft Server
|
||||
|
||||
## What is Crafty Controller?
|
||||
|
72
app/classes/controllers/crafty_perms_controller.py
Normal file
72
app/classes/controllers/crafty_perms_controller.py
Normal file
@ -0,0 +1,72 @@
|
||||
import os
|
||||
import time
|
||||
import logging
|
||||
import sys
|
||||
import yaml
|
||||
import asyncio
|
||||
import shutil
|
||||
import tempfile
|
||||
import zipfile
|
||||
from distutils import dir_util
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
|
||||
from app.classes.models.crafty_permissions import crafty_permissions, Enum_Permissions_Crafty
|
||||
|
||||
from app.classes.shared.server import Server
|
||||
from app.classes.minecraft.server_props import ServerProps
|
||||
from app.classes.minecraft.serverjars import server_jar_obj
|
||||
from app.classes.minecraft.stats import Stats
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class Crafty_Perms_Controller:
|
||||
|
||||
@staticmethod
|
||||
def list_defined_crafty_permissions():
|
||||
permissions_list = crafty_permissions.get_permissions_list()
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def get_mask_crafty_permissions(user_id):
|
||||
permissions_mask = crafty_permissions.get_crafty_permissions_mask(user_id)
|
||||
return permissions_mask
|
||||
|
||||
@staticmethod
|
||||
def set_permission(permission_mask, permission_tested: Enum_Permissions_Crafty, value):
|
||||
return crafty_permissions.set_permission(permission_mask, permission_tested, value)
|
||||
|
||||
@staticmethod
|
||||
def can_create_server(user_id):
|
||||
return crafty_permissions.can_add_in_crafty(user_id, Enum_Permissions_Crafty.Server_Creation)
|
||||
|
||||
@staticmethod
|
||||
def can_add_user(user_id):
|
||||
#TODO: Complete if we need a User Addition limit
|
||||
#return crafty_permissions.can_add_in_crafty(user_id, Enum_Permissions_Crafty.User_Config)
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def can_add_role(user_id):
|
||||
#TODO: Complete if we need a Role Addition limit
|
||||
#return crafty_permissions.can_add_in_crafty(user_id, Enum_Permissions_Crafty.Roles_Config)
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def list_all_crafty_permissions_quantity_limits():
|
||||
return crafty_permissions.get_all_permission_quantity_list()
|
||||
|
||||
@staticmethod
|
||||
def list_crafty_permissions_quantity_limits(user_id):
|
||||
return crafty_permissions.get_permission_quantity_list(user_id)
|
||||
|
||||
@staticmethod
|
||||
def get_crafty_permissions_list(user_id):
|
||||
permissions_mask = crafty_permissions.get_crafty_permissions_mask(user_id)
|
||||
permissions_list = crafty_permissions.get_permissions(permissions_mask)
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def add_server_creation(user_id):
|
||||
return crafty_permissions.add_server_creation(user_id)
|
115
app/classes/controllers/management_controller.py
Normal file
115
app/classes/controllers/management_controller.py
Normal file
@ -0,0 +1,115 @@
|
||||
import os
|
||||
import time
|
||||
import logging
|
||||
import sys
|
||||
import yaml
|
||||
import asyncio
|
||||
import shutil
|
||||
import tempfile
|
||||
import zipfile
|
||||
from distutils import dir_util
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
|
||||
from app.classes.models.management import management_helper
|
||||
from app.classes.models.servers import servers_helper
|
||||
|
||||
from app.classes.shared.server import Server
|
||||
from app.classes.minecraft.server_props import ServerProps
|
||||
from app.classes.minecraft.serverjars import server_jar_obj
|
||||
from app.classes.minecraft.stats import Stats
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class Management_Controller:
|
||||
|
||||
#************************************************************************************************
|
||||
# Host_Stats Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_latest_hosts_stats():
|
||||
return management_helper.get_latest_hosts_stats()
|
||||
|
||||
@staticmethod
|
||||
def new_api_token():
|
||||
return management_helper.new_api_token()
|
||||
|
||||
#************************************************************************************************
|
||||
# Commands Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_unactioned_commands():
|
||||
return management_helper.get_unactioned_commands()
|
||||
|
||||
@staticmethod
|
||||
def send_command(user_id, server_id, remote_ip, command):
|
||||
|
||||
server_name = servers_helper.get_server_friendly_name(server_id)
|
||||
|
||||
# Example: Admin issued command start_server for server Survival
|
||||
management_helper.add_to_audit_log(user_id, "issued command {} for server {}".format(command, server_name),
|
||||
server_id, remote_ip)
|
||||
|
||||
management_helper.add_command(server_id, user_id, remote_ip, command)
|
||||
|
||||
@staticmethod
|
||||
def mark_command_complete(command_id=None):
|
||||
return management_helper.mark_command_complete(command_id)
|
||||
|
||||
#************************************************************************************************
|
||||
# Audit_Log Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_actity_log():
|
||||
return management_helper.get_actity_log()
|
||||
|
||||
@staticmethod
|
||||
def add_to_audit_log(user_id, log_msg, server_id=None, source_ip=None):
|
||||
return management_helper.add_to_audit_log(user_id, log_msg, server_id, source_ip)
|
||||
|
||||
@staticmethod
|
||||
def add_to_audit_log_raw(user_name, user_id, server_id, log_msg, source_ip):
|
||||
return management_helper.add_to_audit_log_raw(user_name, user_id, server_id, log_msg, source_ip)
|
||||
|
||||
#************************************************************************************************
|
||||
# Schedules Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def create_scheduled_task(server_id, action, interval, interval_type, start_time, command, comment=None, enabled=True):
|
||||
return management_helper.create_scheduled_task(server_id, action, interval, interval_type, start_time, command, comment, enabled)
|
||||
|
||||
@staticmethod
|
||||
def delete_scheduled_task(schedule_id):
|
||||
return management_helper.delete_scheduled_task(schedule_id)
|
||||
|
||||
@staticmethod
|
||||
def update_scheduled_task(schedule_id, updates):
|
||||
return management_helper.update_scheduled_task(schedule_id, updates)
|
||||
|
||||
@staticmethod
|
||||
def get_scheduled_task(schedule_id):
|
||||
return management_helper.get_scheduled_task(schedule_id)
|
||||
|
||||
@staticmethod
|
||||
def get_schedules_by_server(server_id):
|
||||
return management_helper.get_schedules_by_server(server_id)
|
||||
|
||||
@staticmethod
|
||||
def get_schedules_all():
|
||||
return management_helper.get_schedules_all()
|
||||
|
||||
@staticmethod
|
||||
def get_schedules_enabled():
|
||||
return management_helper.get_schedules_enabled()
|
||||
|
||||
#************************************************************************************************
|
||||
# Backups Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_backup_config(server_id):
|
||||
return management_helper.get_backup_config(server_id)
|
||||
|
||||
@staticmethod
|
||||
def set_backup_config(server_id: int, backup_path: str = None, max_backups: int = None, auto_enabled: bool = True):
|
||||
return management_helper.set_backup_config(server_id, backup_path, max_backups, auto_enabled)
|
97
app/classes/controllers/roles_controller.py
Normal file
97
app/classes/controllers/roles_controller.py
Normal file
@ -0,0 +1,97 @@
|
||||
import os
|
||||
import time
|
||||
import logging
|
||||
import sys
|
||||
import yaml
|
||||
import asyncio
|
||||
import shutil
|
||||
import tempfile
|
||||
import zipfile
|
||||
from distutils import dir_util
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
|
||||
from app.classes.models.roles import roles_helper
|
||||
from app.classes.models.server_permissions import server_permissions
|
||||
from app.classes.models.users import users_helper
|
||||
|
||||
from app.classes.shared.server import Server
|
||||
from app.classes.minecraft.server_props import ServerProps
|
||||
from app.classes.minecraft.serverjars import server_jar_obj
|
||||
from app.classes.minecraft.stats import Stats
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class Roles_Controller:
|
||||
|
||||
@staticmethod
|
||||
def get_all_roles():
|
||||
return roles_helper.get_all_roles()
|
||||
|
||||
@staticmethod
|
||||
def get_roleid_by_name(role_name):
|
||||
return roles_helper.get_roleid_by_name(role_name)
|
||||
|
||||
@staticmethod
|
||||
def get_role(role_id):
|
||||
return roles_helper.get_role(role_id)
|
||||
|
||||
|
||||
@staticmethod
|
||||
def update_role(role_id, role_data={}, permissions_mask="00000000"):
|
||||
base_data = Roles_Controller.get_role_with_servers(role_id)
|
||||
up_data = {}
|
||||
added_servers = set()
|
||||
edited_servers = set()
|
||||
removed_servers = set()
|
||||
for key in role_data:
|
||||
if key == "role_id":
|
||||
continue
|
||||
elif key == "servers":
|
||||
added_servers = role_data['servers'].difference(base_data['servers'])
|
||||
removed_servers = base_data['servers'].difference(role_data['servers'])
|
||||
elif base_data[key] != role_data[key]:
|
||||
up_data[key] = role_data[key]
|
||||
up_data['last_update'] = helper.get_time_as_string()
|
||||
logger.debug("role: {} +server:{} -server{}".format(role_data, added_servers, removed_servers))
|
||||
for server in added_servers:
|
||||
server_permissions.get_or_create(role_id, server, permissions_mask)
|
||||
for server in base_data['servers']:
|
||||
server_permissions.update_role_permission(role_id, server, permissions_mask)
|
||||
# TODO: This is horribly inefficient and we should be using bulk queries but im going for functionality at this point
|
||||
server_permissions.delete_roles_permissions(role_id, removed_servers)
|
||||
if up_data:
|
||||
roles_helper.update_role(role_id, up_data)
|
||||
|
||||
@staticmethod
|
||||
def add_role(role_name):
|
||||
return roles_helper.add_role(role_name)
|
||||
|
||||
@staticmethod
|
||||
def remove_role(role_id):
|
||||
role_data = Roles_Controller.get_role_with_servers(role_id)
|
||||
server_permissions.delete_roles_permissions(role_id, role_data['servers'])
|
||||
users_helper.remove_roles_from_role_id(role_id)
|
||||
return roles_helper.remove_role(role_id)
|
||||
|
||||
@staticmethod
|
||||
def role_id_exists(role_id):
|
||||
return roles_helper.role_id_exists(role_id)
|
||||
|
||||
@staticmethod
|
||||
def get_role_with_servers(role_id):
|
||||
role = roles_helper.get_role(role_id)
|
||||
|
||||
if role:
|
||||
servers_query = server_permissions.get_servers_from_role(role_id)
|
||||
# TODO: this query needs to be narrower
|
||||
servers = set()
|
||||
for s in servers_query:
|
||||
servers.add(s.server_id.server_id)
|
||||
role['servers'] = servers
|
||||
#logger.debug("role: ({}) {}".format(role_id, role))
|
||||
return role
|
||||
else:
|
||||
#logger.debug("role: ({}) {}".format(role_id, {}))
|
||||
return {}
|
95
app/classes/controllers/server_perms_controller.py
Normal file
95
app/classes/controllers/server_perms_controller.py
Normal file
@ -0,0 +1,95 @@
|
||||
import os
|
||||
import time
|
||||
import logging
|
||||
import sys
|
||||
import yaml
|
||||
import asyncio
|
||||
import shutil
|
||||
import tempfile
|
||||
import zipfile
|
||||
from distutils import dir_util
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
|
||||
from app.classes.shared.main_models import db_helper
|
||||
from app.classes.models.server_permissions import server_permissions, Enum_Permissions_Server
|
||||
from app.classes.models.users import users_helper
|
||||
from app.classes.models.roles import roles_helper
|
||||
from app.classes.models.servers import servers_helper
|
||||
|
||||
from app.classes.shared.server import Server
|
||||
from app.classes.minecraft.server_props import ServerProps
|
||||
from app.classes.minecraft.serverjars import server_jar_obj
|
||||
from app.classes.minecraft.stats import Stats
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class Server_Perms_Controller:
|
||||
|
||||
@staticmethod
|
||||
def list_defined_permissions():
|
||||
permissions_list = server_permissions.get_permissions_list()
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def get_mask_permissions(role_id, server_id):
|
||||
permissions_mask = server_permissions.get_permissions_mask(role_id, server_id)
|
||||
return permissions_mask
|
||||
|
||||
@staticmethod
|
||||
def get_role_permissions(role_id):
|
||||
permissions_list = server_permissions.get_role_permissions_list(role_id)
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def get_server_permissions_foruser(user_id, server_id):
|
||||
permissions_list = server_permissions.get_user_permissions_list(user_id, server_id)
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def add_role_server(server_id, role_id, rs_permissions="00000000"):
|
||||
return server_permissions.add_role_server(server_id, role_id, rs_permissions)
|
||||
|
||||
#************************************************************************************************
|
||||
# Servers Permissions Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_permissions_mask(role_id, server_id):
|
||||
return server_permissions.get_permissions_mask(role_id, server_id)
|
||||
|
||||
@staticmethod
|
||||
def set_permission(permission_mask, permission_tested: Enum_Permissions_Server, value):
|
||||
return server_permissions.set_permission(permission_mask, permission_tested, value)
|
||||
|
||||
@staticmethod
|
||||
def get_role_permissions_list(role_id):
|
||||
return server_permissions.get_role_permissions_list(role_id)
|
||||
|
||||
@staticmethod
|
||||
def get_user_permissions_list(user_id, server_id):
|
||||
return server_permissions.get_user_permissions_list(user_id, server_id)
|
||||
|
||||
@staticmethod
|
||||
def get_authorized_servers_stats_from_roles(user_id):
|
||||
user_roles = users_helper.get_user_roles_id(user_id)
|
||||
roles_list = []
|
||||
role_server = []
|
||||
authorized_servers = []
|
||||
server_data = []
|
||||
|
||||
for u in user_roles:
|
||||
roles_list.append(roles_helper.get_role(u.role_id))
|
||||
|
||||
for r in roles_list:
|
||||
role_test = server_permissions.get_role_servers_from_role_id(r.get('role_id'))
|
||||
for t in role_test:
|
||||
role_server.append(t)
|
||||
|
||||
for s in role_server:
|
||||
authorized_servers.append(servers_helper.get_server_data_by_id(s.server_id))
|
||||
|
||||
for s in authorized_servers:
|
||||
latest = servers_helper.get_latest_server_stats(s.get('server_id'))
|
||||
server_data.append({'server_data': s, "stats": db_helper.return_rows(latest)[0]})
|
||||
return server_data
|
176
app/classes/controllers/servers_controller.py
Normal file
176
app/classes/controllers/servers_controller.py
Normal file
@ -0,0 +1,176 @@
|
||||
from app.classes.controllers.roles_controller import Roles_Controller
|
||||
import os
|
||||
import time
|
||||
import logging
|
||||
import json
|
||||
import sys
|
||||
import yaml
|
||||
import asyncio
|
||||
import shutil
|
||||
import tempfile
|
||||
import zipfile
|
||||
from distutils import dir_util
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
|
||||
from app.classes.shared.main_models import db_helper
|
||||
from app.classes.models.servers import servers_helper
|
||||
from app.classes.models.roles import roles_helper
|
||||
from app.classes.models.users import users_helper
|
||||
from app.classes.models.server_permissions import server_permissions, Enum_Permissions_Server
|
||||
|
||||
from app.classes.shared.server import Server
|
||||
from app.classes.minecraft.server_props import ServerProps
|
||||
from app.classes.minecraft.serverjars import server_jar_obj
|
||||
from app.classes.minecraft.stats import Stats
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class Servers_Controller:
|
||||
|
||||
#************************************************************************************************
|
||||
# Generic Servers Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def create_server(name: str, server_uuid: str, server_dir: str, backup_path: str, server_command: str, server_file: str, server_log_file: str, server_stop: str, server_port=25565):
|
||||
return servers_helper.create_server(name, server_uuid, server_dir, backup_path, server_command, server_file, server_log_file, server_stop, server_port)
|
||||
|
||||
@staticmethod
|
||||
def remove_server(server_id):
|
||||
roles_list = server_permissions.get_roles_from_server(server_id)
|
||||
for role in roles_list:
|
||||
role_id = role.role_id
|
||||
role_data = Roles_Controller.get_role_with_servers(role_id)
|
||||
role_data['servers'] = {server_id}
|
||||
server_permissions.delete_roles_permissions(role_id, role_data['servers'])
|
||||
server_permissions.remove_roles_of_server(server_id)
|
||||
servers_helper.remove_server(server_id)
|
||||
|
||||
@staticmethod
|
||||
def get_server_data_by_id(server_id):
|
||||
return servers_helper.get_server_data_by_id(server_id)
|
||||
|
||||
#************************************************************************************************
|
||||
# Servers Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_all_defined_servers():
|
||||
return servers_helper.get_all_defined_servers()
|
||||
|
||||
@staticmethod
|
||||
def get_authorized_servers(user_id):
|
||||
server_data = []
|
||||
user_roles = users_helper.user_role_query(user_id)
|
||||
for us in user_roles:
|
||||
role_servers = server_permissions.get_role_servers_from_role_id(us.role_id)
|
||||
for role in role_servers:
|
||||
server_data.append(servers_helper.get_server_data_by_id(role.server_id))
|
||||
|
||||
return server_data
|
||||
|
||||
@staticmethod
|
||||
def get_all_servers_stats():
|
||||
return servers_helper.get_all_servers_stats()
|
||||
|
||||
@staticmethod
|
||||
def get_authorized_servers_stats(user_id):
|
||||
server_data = []
|
||||
authorized_servers = Servers_Controller.get_authorized_servers(user_id)
|
||||
|
||||
for s in authorized_servers:
|
||||
latest = servers_helper.get_latest_server_stats(s.get('server_id'))
|
||||
user_permissions = server_permissions.get_user_permissions_list(user_id, s.get('server_id'))
|
||||
if Enum_Permissions_Server.Commands in user_permissions:
|
||||
user_command_permission = True
|
||||
else:
|
||||
user_command_permission = False
|
||||
server_data.append({'server_data': s, "stats": db_helper.return_rows(latest)[0], "user_command_permission":user_command_permission})
|
||||
return server_data
|
||||
|
||||
@staticmethod
|
||||
def get_server_friendly_name(server_id):
|
||||
return servers_helper.get_server_friendly_name(server_id)
|
||||
|
||||
#************************************************************************************************
|
||||
# Servers_Stats Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_server_stats_by_id(server_id):
|
||||
return servers_helper.get_server_stats_by_id(server_id)
|
||||
|
||||
@staticmethod
|
||||
def server_id_exists(server_id):
|
||||
return servers_helper.server_id_exists(server_id)
|
||||
|
||||
@staticmethod
|
||||
def server_id_authorized(serverId, user_id):
|
||||
authorized = 0
|
||||
user_roles = users_helper.user_role_query(user_id)
|
||||
for role in user_roles:
|
||||
authorized = server_permissions.get_role_servers_from_role_id(role.role_id)
|
||||
|
||||
#authorized = db_helper.return_rows(authorized)
|
||||
|
||||
if authorized.count() == 0:
|
||||
return False
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def set_update(server_id, value):
|
||||
return servers_helper.set_update(server_id, value)
|
||||
|
||||
@staticmethod
|
||||
def get_TTL_without_player(server_id):
|
||||
return servers_helper.get_TTL_without_player(server_id)
|
||||
|
||||
@staticmethod
|
||||
def can_stop_no_players(server_id, time_limit):
|
||||
return servers_helper.can_stop_no_players(server_id, time_limit)
|
||||
|
||||
@staticmethod
|
||||
def set_waiting_start(server_id, value):
|
||||
servers_helper.set_waiting_start(server_id, value)
|
||||
|
||||
@staticmethod
|
||||
def get_waiting_start(server_id):
|
||||
return servers_helper.get_waiting_start(server_id)
|
||||
|
||||
#************************************************************************************************
|
||||
# Servers Helpers Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_banned_players(server_id):
|
||||
stats = servers_helper.get_server_stats_by_id(server_id)
|
||||
server_path = stats['server_id']['path']
|
||||
path = os.path.join(server_path, 'banned-players.json')
|
||||
|
||||
try:
|
||||
with open(path) as file:
|
||||
content = file.read()
|
||||
file.close()
|
||||
except Exception as ex:
|
||||
print (ex)
|
||||
return None
|
||||
|
||||
return json.loads(content)
|
||||
|
||||
def check_for_old_logs(self):
|
||||
servers = servers_helper.get_all_defined_servers()
|
||||
for server in servers:
|
||||
logs_path = os.path.split(server['log_path'])[0]
|
||||
latest_log_file = os.path.split(server['log_path'])[1]
|
||||
logs_delete_after = int(server['logs_delete_after'])
|
||||
if logs_delete_after == 0:
|
||||
continue
|
||||
|
||||
log_files = list(filter(
|
||||
lambda val: val != latest_log_file,
|
||||
os.listdir(logs_path)
|
||||
))
|
||||
for log_file in log_files:
|
||||
log_file_path = os.path.join(logs_path, log_file)
|
||||
if self.check_file_exists(log_file_path) and \
|
||||
self.is_file_older_than_x_days(log_file_path, logs_delete_after):
|
||||
os.remove(log_file_path)
|
||||
|
130
app/classes/controllers/users_controller.py
Normal file
130
app/classes/controllers/users_controller.py
Normal file
@ -0,0 +1,130 @@
|
||||
import os
|
||||
import time
|
||||
import logging
|
||||
import sys
|
||||
import yaml
|
||||
import asyncio
|
||||
import shutil
|
||||
import tempfile
|
||||
import zipfile
|
||||
from distutils import dir_util
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
|
||||
from app.classes.models.users import Users, users_helper
|
||||
from app.classes.models.crafty_permissions import crafty_permissions, Enum_Permissions_Crafty
|
||||
from app.classes.models.management import management_helper
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class Users_Controller:
|
||||
|
||||
#************************************************************************************************
|
||||
# Users Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_all_users():
|
||||
return users_helper.get_all_users()
|
||||
|
||||
@staticmethod
|
||||
def get_id_by_name(username):
|
||||
return users_helper.get_user_id_by_name(username)
|
||||
|
||||
@staticmethod
|
||||
def get_user_by_api_token(token: str):
|
||||
return users_helper.get_user_by_api_token(token)
|
||||
|
||||
@staticmethod
|
||||
def get_user_lang_by_id(user_id):
|
||||
return users_helper.get_user_lang_by_id(user_id)
|
||||
|
||||
@staticmethod
|
||||
def get_user_by_id(user_id):
|
||||
return users_helper.get_user(user_id)
|
||||
|
||||
@staticmethod
|
||||
def user_query(user_id):
|
||||
return users_helper.user_query(user_id)
|
||||
|
||||
@staticmethod
|
||||
def update_user(user_id, user_data={}, user_crafty_data={}):
|
||||
base_data = users_helper.get_user(user_id)
|
||||
up_data = {}
|
||||
added_roles = set()
|
||||
removed_roles = set()
|
||||
removed_servers = set()
|
||||
for key in user_data:
|
||||
if key == "user_id":
|
||||
continue
|
||||
elif key == "roles":
|
||||
added_roles = user_data['roles'].difference(base_data['roles'])
|
||||
removed_roles = base_data['roles'].difference(user_data['roles'])
|
||||
elif key == "regen_api":
|
||||
if user_data['regen_api']:
|
||||
up_data['api_token'] = management_helper.new_api_token()
|
||||
elif key == "password":
|
||||
if user_data['password'] is not None and user_data['password'] != "":
|
||||
up_data['password'] = helper.encode_pass(user_data['password'])
|
||||
elif base_data[key] != user_data[key]:
|
||||
up_data[key] = user_data[key]
|
||||
up_data['last_update'] = helper.get_time_as_string()
|
||||
up_data['lang'] = user_data['lang']
|
||||
logger.debug("user: {} +role:{} -role:{}".format(user_data, added_roles, removed_roles))
|
||||
for role in added_roles:
|
||||
users_helper.get_or_create(user_id=user_id, role_id=role)
|
||||
# TODO: This is horribly inefficient and we should be using bulk queries but im going for functionality at this point
|
||||
|
||||
for key in user_crafty_data:
|
||||
if key == "permissions_mask":
|
||||
permissions_mask = user_crafty_data['permissions_mask']
|
||||
if key == "server_quantity":
|
||||
limit_server_creation = user_crafty_data['server_quantity'][Enum_Permissions_Crafty.Server_Creation.name]
|
||||
limit_user_creation = user_crafty_data['server_quantity'][Enum_Permissions_Crafty.User_Config.name]
|
||||
limit_role_creation = user_crafty_data['server_quantity'][Enum_Permissions_Crafty.Roles_Config.name]
|
||||
else:
|
||||
limit_server_creation = 0
|
||||
limit_user_creation = 0
|
||||
limit_role_creation = 0
|
||||
|
||||
crafty_permissions.add_or_update_user(user_id, permissions_mask, limit_server_creation, limit_user_creation, limit_role_creation)
|
||||
|
||||
users_helper.delete_user_roles(user_id, removed_roles)
|
||||
|
||||
users_helper.update_user(user_id, up_data)
|
||||
|
||||
@staticmethod
|
||||
def add_user(username, password=None, api_token=None, enabled=True, superuser=False):
|
||||
return users_helper.add_user(username, password=password, api_token=api_token, enabled=enabled, superuser=superuser)
|
||||
|
||||
@staticmethod
|
||||
def remove_user(user_id):
|
||||
return users_helper.remove_user(user_id)
|
||||
|
||||
@staticmethod
|
||||
def user_id_exists(user_id):
|
||||
return users_helper.user_id_exists(user_id)
|
||||
|
||||
#************************************************************************************************
|
||||
# User Roles Methods
|
||||
#************************************************************************************************
|
||||
|
||||
@staticmethod
|
||||
def get_user_roles_id(user_id):
|
||||
return users_helper.get_user_roles_id(user_id)
|
||||
|
||||
@staticmethod
|
||||
def get_user_roles_names(user_id):
|
||||
return users_helper.get_user_roles_names(user_id)
|
||||
|
||||
@staticmethod
|
||||
def add_role_to_user(user_id, role_id):
|
||||
return users_helper.add_role_to_user(user_id, role_id)
|
||||
|
||||
@staticmethod
|
||||
def add_user_roles(user):
|
||||
return users_helper.add_user_roles(user)
|
||||
|
||||
@staticmethod
|
||||
def user_role_query(user_id):
|
||||
return users_helper.user_role_query(user_id)
|
@ -9,7 +9,7 @@ from datetime import datetime
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
from app.classes.shared.models import Servers
|
||||
from app.classes.models.servers import Servers
|
||||
from app.classes.minecraft.server_props import ServerProps
|
||||
from app.classes.web.websocket_helper import websocket_helper
|
||||
|
||||
|
@ -9,8 +9,8 @@ import base64
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.minecraft.mc_ping import ping
|
||||
from app.classes.shared.models import db_helper
|
||||
from app.classes.shared.models import Host_Stats, Server_Stats
|
||||
from app.classes.models.management import Host_Stats
|
||||
from app.classes.models.servers import Server_Stats, servers_helper
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@ -166,7 +166,7 @@ class Stats:
|
||||
|
||||
def get_server_players(self, server_id):
|
||||
|
||||
server = db_helper.get_server_data_by_id(server_id)
|
||||
server = servers_helper.get_server_data_by_id(server_id)
|
||||
|
||||
logger.info("Getting players for server {}".format(server))
|
||||
|
||||
@ -202,7 +202,7 @@ class Stats:
|
||||
for s in servers:
|
||||
|
||||
server_id = s.get('server_id', None)
|
||||
server = db_helper.get_server_data_by_id(server_id)
|
||||
server = servers_helper.get_server_data_by_id(server_id)
|
||||
|
||||
|
||||
logger.debug('Getting stats for server: {}'.format(server_id))
|
||||
@ -279,8 +279,11 @@ class Stats:
|
||||
p_stats = self._get_process_stats(server_obj.process)
|
||||
|
||||
# TODO: search server properties file for possible override of 127.0.0.1
|
||||
internal_ip = server['server_ip']
|
||||
server_port = server['server_port']
|
||||
#internal_ip = server['server_ip']
|
||||
#server_port = server['server_port']
|
||||
internal_ip = server_data.get('server_ip', "127.0.0.1")
|
||||
server_port = server_settings.get('server-port', "25565")
|
||||
|
||||
|
||||
logger.debug("Pinging server '{}' on {}:{}".format(server.name, internal_ip, server_port))
|
||||
int_mc_ping = ping(internal_ip, int(server_port))
|
||||
|
194
app/classes/models/crafty_permissions.py
Normal file
194
app/classes/models/crafty_permissions.py
Normal file
@ -0,0 +1,194 @@
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
import datetime
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
from app.classes.models.users import Users
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
peewee_logger = logging.getLogger('peewee')
|
||||
peewee_logger.setLevel(logging.INFO)
|
||||
|
||||
try:
|
||||
from peewee import *
|
||||
from playhouse.shortcuts import model_to_dict
|
||||
from enum import Enum
|
||||
import yaml
|
||||
|
||||
except ModuleNotFoundError as e:
|
||||
logger.critical("Import Error: Unable to load {} module".format(e.name), exc_info=True)
|
||||
console.critical("Import Error: Unable to load {} module".format(e.name))
|
||||
sys.exit(1)
|
||||
|
||||
database = SqliteDatabase(helper.db_path, pragmas={
|
||||
'journal_mode': 'wal',
|
||||
'cache_size': -1024 * 10})
|
||||
|
||||
|
||||
#************************************************************************************************
|
||||
# User_Crafty Class
|
||||
#************************************************************************************************
|
||||
class User_Crafty(Model):
|
||||
user_id = ForeignKeyField(Users, backref='users_crafty')
|
||||
permissions = CharField(default="00000000")
|
||||
limit_server_creation = IntegerField(default=-1)
|
||||
limit_user_creation = IntegerField(default=0)
|
||||
limit_role_creation = IntegerField(default=0)
|
||||
created_server = IntegerField(default=0)
|
||||
created_user = IntegerField(default=0)
|
||||
created_role = IntegerField(default=0)
|
||||
|
||||
class Meta:
|
||||
table_name = 'user_crafty'
|
||||
database = database
|
||||
|
||||
#************************************************************************************************
|
||||
# Crafty Permissions Class
|
||||
#************************************************************************************************
|
||||
class Enum_Permissions_Crafty(Enum):
|
||||
Server_Creation = 0
|
||||
User_Config = 1
|
||||
Roles_Config = 2
|
||||
|
||||
class Permissions_Crafty:
|
||||
|
||||
#************************************************************************************************
|
||||
# Crafty Permissions Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_permissions_list():
|
||||
permissions_list = []
|
||||
for member in Enum_Permissions_Crafty.__members__.items():
|
||||
permissions_list.append(member[1])
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def get_permissions(permissions_mask):
|
||||
permissions_list = []
|
||||
for member in Enum_Permissions_Crafty.__members__.items():
|
||||
if crafty_permissions.has_permission(permissions_mask, member[1]):
|
||||
permissions_list.append(member[1])
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def has_permission(permission_mask, permission_tested: Enum_Permissions_Crafty):
|
||||
result = False
|
||||
if permission_mask[permission_tested.value] == '1':
|
||||
result = True
|
||||
return result
|
||||
|
||||
@staticmethod
|
||||
def set_permission(permission_mask, permission_tested: Enum_Permissions_Crafty, value):
|
||||
l = list(permission_mask)
|
||||
l[permission_tested.value] = str(value)
|
||||
permission_mask = ''.join(l)
|
||||
return permission_mask
|
||||
|
||||
@staticmethod
|
||||
def get_permission(permission_mask, permission_tested: Enum_Permissions_Crafty):
|
||||
return permission_mask[permission_tested.value]
|
||||
|
||||
@staticmethod
|
||||
def get_crafty_permissions_mask(user_id):
|
||||
permissions_mask = ''
|
||||
user_crafty = crafty_permissions.get_User_Crafty(user_id)
|
||||
permissions_mask = user_crafty.permissions
|
||||
return permissions_mask
|
||||
|
||||
@staticmethod
|
||||
def get_all_permission_quantity_list():
|
||||
quantity_list = {
|
||||
Enum_Permissions_Crafty.Server_Creation.name: -1,
|
||||
Enum_Permissions_Crafty.User_Config.name: -1,
|
||||
Enum_Permissions_Crafty.Roles_Config.name: -1,
|
||||
}
|
||||
return quantity_list
|
||||
|
||||
@staticmethod
|
||||
def get_permission_quantity_list(user_id):
|
||||
user_crafty = crafty_permissions.get_User_Crafty(user_id)
|
||||
quantity_list = {
|
||||
Enum_Permissions_Crafty.Server_Creation.name: user_crafty.limit_server_creation,
|
||||
Enum_Permissions_Crafty.User_Config.name: user_crafty.limit_user_creation,
|
||||
Enum_Permissions_Crafty.Roles_Config.name: user_crafty.limit_role_creation,
|
||||
}
|
||||
return quantity_list
|
||||
|
||||
#************************************************************************************************
|
||||
# User_Crafty Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_User_Crafty(user_id):
|
||||
try:
|
||||
user_crafty = User_Crafty.select().where(User_Crafty.user_id == user_id).get()
|
||||
except User_Crafty.DoesNotExist:
|
||||
user_crafty = User_Crafty.insert({
|
||||
User_Crafty.user_id: user_id,
|
||||
User_Crafty.permissions: "000",
|
||||
User_Crafty.limit_server_creation: 0,
|
||||
User_Crafty.limit_user_creation: 0,
|
||||
User_Crafty.limit_role_creation: 0,
|
||||
User_Crafty.created_server: 0,
|
||||
User_Crafty.created_user: 0,
|
||||
User_Crafty.created_role: 0,
|
||||
}).execute()
|
||||
user_crafty = crafty_permissions.get_User_Crafty(user_id)
|
||||
return user_crafty
|
||||
|
||||
@staticmethod
|
||||
def add_user_crafty(user_id, uc_permissions):
|
||||
user_crafty = User_Crafty.insert({User_Crafty.user_id: user_id, User_Crafty.permissions: uc_permissions}).execute()
|
||||
return user_crafty
|
||||
|
||||
@staticmethod
|
||||
def add_or_update_user(user_id, permissions_mask, limit_server_creation, limit_user_creation, limit_role_creation):
|
||||
try:
|
||||
user_crafty = User_Crafty.select().where(User_Crafty.user_id == user_id).get()
|
||||
user_crafty.permissions = permissions_mask
|
||||
user_crafty.limit_server_creation = limit_server_creation
|
||||
user_crafty.limit_user_creation = limit_user_creation
|
||||
user_crafty.limit_role_creation = limit_role_creation
|
||||
User_Crafty.save(user_crafty)
|
||||
except:
|
||||
User_Crafty.insert({
|
||||
User_Crafty.user_id: user_id,
|
||||
User_Crafty.permissions: permissions_mask,
|
||||
User_Crafty.limit_server_creation: limit_server_creation,
|
||||
User_Crafty.limit_user_creation: limit_user_creation,
|
||||
User_Crafty.limit_role_creation: limit_role_creation
|
||||
}).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_created_quantity_list(user_id):
|
||||
user_crafty = crafty_permissions.get_User_Crafty(user_id)
|
||||
quantity_list = {
|
||||
Enum_Permissions_Crafty.Server_Creation.name: user_crafty.created_server,
|
||||
Enum_Permissions_Crafty.User_Config.name: user_crafty.created_user,
|
||||
Enum_Permissions_Crafty.Roles_Config.name: user_crafty.created_role,
|
||||
}
|
||||
return quantity_list
|
||||
|
||||
@staticmethod
|
||||
def get_crafty_limit_value(user_id, permission):
|
||||
user_crafty = crafty_permissions.get_User_Crafty(user_id)
|
||||
quantity_list = crafty_permissions.get_permission_quantity_list(user_id)
|
||||
return quantity_list[permission]
|
||||
|
||||
@staticmethod
|
||||
def can_add_in_crafty(user_id, permission):
|
||||
user_crafty = crafty_permissions.get_User_Crafty(user_id)
|
||||
can = crafty_permissions.has_permission(user_crafty.permissions, permission)
|
||||
limit_list = crafty_permissions.get_permission_quantity_list(user_id)
|
||||
quantity_list = crafty_permissions.get_created_quantity_list(user_id)
|
||||
return can and ((quantity_list[permission.name] < limit_list[permission.name]) or limit_list[permission.name] == -1 )
|
||||
|
||||
@staticmethod
|
||||
def add_server_creation(user_id):
|
||||
user_crafty = crafty_permissions.get_User_Crafty(user_id)
|
||||
user_crafty.created_server += 1
|
||||
User_Crafty.save(user_crafty)
|
||||
return user_crafty.created_server
|
||||
|
||||
crafty_permissions = Permissions_Crafty()
|
317
app/classes/models/management.py
Normal file
317
app/classes/models/management.py
Normal file
@ -0,0 +1,317 @@
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
import datetime
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
from app.classes.shared.main_models import db_helper
|
||||
from app.classes.models.users import Users, users_helper
|
||||
from app.classes.models.servers import Servers, servers_helper
|
||||
from app.classes.web.websocket_helper import websocket_helper
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
peewee_logger = logging.getLogger('peewee')
|
||||
peewee_logger.setLevel(logging.INFO)
|
||||
|
||||
try:
|
||||
from peewee import *
|
||||
from playhouse.shortcuts import model_to_dict
|
||||
from enum import Enum
|
||||
import yaml
|
||||
|
||||
except ModuleNotFoundError as e:
|
||||
logger.critical("Import Error: Unable to load {} module".format(e.name), exc_info=True)
|
||||
console.critical("Import Error: Unable to load {} module".format(e.name))
|
||||
sys.exit(1)
|
||||
|
||||
database = SqliteDatabase(helper.db_path, pragmas={
|
||||
'journal_mode': 'wal',
|
||||
'cache_size': -1024 * 10})
|
||||
|
||||
#************************************************************************************************
|
||||
# Audit_Log Class
|
||||
#************************************************************************************************
|
||||
class Audit_Log(Model):
|
||||
audit_id = AutoField()
|
||||
created = DateTimeField(default=datetime.datetime.now)
|
||||
user_name = CharField(default="")
|
||||
user_id = IntegerField(default=0, index=True)
|
||||
source_ip = CharField(default='127.0.0.1')
|
||||
server_id = IntegerField(default=None, index=True) # When auditing global events, use server ID 0
|
||||
log_msg = TextField(default='')
|
||||
|
||||
class Meta:
|
||||
database = database
|
||||
|
||||
|
||||
#************************************************************************************************
|
||||
# Host_Stats Class
|
||||
#************************************************************************************************
|
||||
class Host_Stats(Model):
|
||||
time = DateTimeField(default=datetime.datetime.now, index=True)
|
||||
boot_time = CharField(default="")
|
||||
cpu_usage = FloatField(default=0)
|
||||
cpu_cores = IntegerField(default=0)
|
||||
cpu_cur_freq = FloatField(default=0)
|
||||
cpu_max_freq = FloatField(default=0)
|
||||
mem_percent = FloatField(default=0)
|
||||
mem_usage = CharField(default="")
|
||||
mem_total = CharField(default="")
|
||||
disk_json = TextField(default="")
|
||||
|
||||
class Meta:
|
||||
table_name = "host_stats"
|
||||
database = database
|
||||
|
||||
|
||||
#************************************************************************************************
|
||||
# Commands Class
|
||||
#************************************************************************************************
|
||||
class Commands(Model):
|
||||
command_id = AutoField()
|
||||
created = DateTimeField(default=datetime.datetime.now)
|
||||
server_id = ForeignKeyField(Servers, backref='server', index=True)
|
||||
user = ForeignKeyField(Users, backref='user', index=True)
|
||||
source_ip = CharField(default='127.0.0.1')
|
||||
command = CharField(default='')
|
||||
executed = BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
table_name = "commands"
|
||||
database = database
|
||||
|
||||
|
||||
#************************************************************************************************
|
||||
# Webhooks Class
|
||||
#************************************************************************************************
|
||||
class Webhooks(Model):
|
||||
id = AutoField()
|
||||
name = CharField(max_length=64, unique=True, index=True)
|
||||
method = CharField(default="POST")
|
||||
url = CharField(unique=True)
|
||||
event = CharField(default="")
|
||||
send_data = BooleanField(default=True)
|
||||
|
||||
class Meta:
|
||||
table_name = "webhooks"
|
||||
database = database
|
||||
|
||||
|
||||
#************************************************************************************************
|
||||
# Schedules Class
|
||||
#************************************************************************************************
|
||||
class Schedules(Model):
|
||||
schedule_id = IntegerField(unique=True, primary_key=True)
|
||||
server_id = ForeignKeyField(Servers, backref='schedule_server')
|
||||
enabled = BooleanField()
|
||||
action = CharField()
|
||||
interval = IntegerField()
|
||||
interval_type = CharField()
|
||||
start_time = CharField(null=True)
|
||||
command = CharField(null=True)
|
||||
comment = CharField()
|
||||
|
||||
class Meta:
|
||||
table_name = 'schedules'
|
||||
database = database
|
||||
|
||||
|
||||
#************************************************************************************************
|
||||
# Backups Class
|
||||
#************************************************************************************************
|
||||
class Backups(Model):
|
||||
directories = CharField(null=True)
|
||||
max_backups = IntegerField()
|
||||
server_id = ForeignKeyField(Servers, backref='backups_server')
|
||||
schedule_id = ForeignKeyField(Schedules, backref='backups_schedule')
|
||||
|
||||
class Meta:
|
||||
table_name = 'backups'
|
||||
database = database
|
||||
|
||||
class helpers_management:
|
||||
|
||||
#************************************************************************************************
|
||||
# Host_Stats Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_latest_hosts_stats():
|
||||
query = Host_Stats.select().order_by(Host_Stats.id.desc()).get()
|
||||
return model_to_dict(query)
|
||||
|
||||
#************************************************************************************************
|
||||
# Commands Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def add_command(server_id, user_id, remote_ip, command):
|
||||
Commands.insert({
|
||||
Commands.server_id: server_id,
|
||||
Commands.user: user_id,
|
||||
Commands.source_ip: remote_ip,
|
||||
Commands.command: command
|
||||
}).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_unactioned_commands():
|
||||
query = Commands.select().where(Commands.executed == 0)
|
||||
return db_helper.return_rows(query)
|
||||
|
||||
@staticmethod
|
||||
def mark_command_complete(command_id=None):
|
||||
if command_id is not None:
|
||||
logger.debug("Marking Command {} completed".format(command_id))
|
||||
Commands.update({
|
||||
Commands.executed: True
|
||||
}).where(Commands.command_id == command_id).execute()
|
||||
|
||||
#************************************************************************************************
|
||||
# Audit_Log Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_actity_log():
|
||||
q = Audit_Log.select()
|
||||
return db_helper.return_db_rows(q)
|
||||
|
||||
@staticmethod
|
||||
def add_to_audit_log(user_id, log_msg, server_id=None, source_ip=None):
|
||||
logger.debug("Adding to audit log User:{} - Message: {} ".format(user_id, log_msg))
|
||||
user_data = users_helper.get_user(user_id)
|
||||
|
||||
audit_msg = "{} {}".format(str(user_data['username']).capitalize(), log_msg)
|
||||
|
||||
websocket_helper.broadcast('notification', audit_msg)
|
||||
|
||||
Audit_Log.insert({
|
||||
Audit_Log.user_name: user_data['username'],
|
||||
Audit_Log.user_id: user_id,
|
||||
Audit_Log.server_id: server_id,
|
||||
Audit_Log.log_msg: audit_msg,
|
||||
Audit_Log.source_ip: source_ip
|
||||
}).execute()
|
||||
|
||||
@staticmethod
|
||||
def add_to_audit_log_raw(user_name, user_id, server_id, log_msg, source_ip):
|
||||
Audit_Log.insert({
|
||||
Audit_Log.user_name: user_name,
|
||||
Audit_Log.user_id: user_id,
|
||||
Audit_Log.server_id: server_id,
|
||||
Audit_Log.log_msg: log_msg,
|
||||
Audit_Log.source_ip: source_ip
|
||||
}).execute()
|
||||
|
||||
#************************************************************************************************
|
||||
# Schedules Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def create_scheduled_task(server_id, action, interval, interval_type, start_time, command, comment=None, enabled=True):
|
||||
sch_id = Schedules.insert({
|
||||
Schedules.server_id: server_id,
|
||||
Schedules.action: action,
|
||||
Schedules.enabled: enabled,
|
||||
Schedules.interval: interval,
|
||||
Schedules.interval_type: interval_type,
|
||||
Schedules.start_time: start_time,
|
||||
Schedules.command: command,
|
||||
Schedules.comment: comment
|
||||
}).execute()
|
||||
return sch_id
|
||||
|
||||
@staticmethod
|
||||
def delete_scheduled_task(schedule_id):
|
||||
sch = Schedules.get(Schedules.schedule_id == schedule_id)
|
||||
return Schedules.delete_instance(sch)
|
||||
|
||||
@staticmethod
|
||||
def update_scheduled_task(schedule_id, updates):
|
||||
Schedules.update(updates).where(Schedules.schedule_id == schedule_id).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_scheduled_task(schedule_id):
|
||||
return model_to_dict(Schedules.get(Schedules.schedule_id == schedule_id)).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_schedules_by_server(server_id):
|
||||
return Schedules.select().where(Schedules.server_id == server_id).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_schedules_all():
|
||||
return Schedules.select().execute()
|
||||
|
||||
@staticmethod
|
||||
def get_schedules_enabled():
|
||||
return Schedules.select().where(Schedules.enabled == True).execute()
|
||||
|
||||
#************************************************************************************************
|
||||
# Backups Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_backup_config(server_id):
|
||||
try:
|
||||
row = Backups.select().where(Backups.server_id == server_id).join(Schedules).join(Servers)[0]
|
||||
conf = {
|
||||
"backup_path": row.server_id.backup_path,
|
||||
"directories": row.directories,
|
||||
"max_backups": row.max_backups,
|
||||
"auto_enabled": row.schedule_id.enabled,
|
||||
"server_id": row.server_id.server_id
|
||||
}
|
||||
except IndexError:
|
||||
conf = {
|
||||
"backup_path": None,
|
||||
"directories": None,
|
||||
"max_backups": 0,
|
||||
"auto_enabled": True,
|
||||
"server_id": server_id
|
||||
}
|
||||
return conf
|
||||
|
||||
@staticmethod
|
||||
def set_backup_config(server_id: int, backup_path: str = None, max_backups: int = None, auto_enabled: bool = True):
|
||||
logger.debug("Updating server {} backup config with {}".format(server_id, locals()))
|
||||
try:
|
||||
row = Backups.select().where(Backups.server_id == server_id).join(Schedules).join(Servers)[0]
|
||||
new_row = False
|
||||
conf = {}
|
||||
schd = {}
|
||||
except IndexError:
|
||||
conf = {
|
||||
"directories": None,
|
||||
"max_backups": 0,
|
||||
"server_id": server_id
|
||||
}
|
||||
schd = {
|
||||
"enabled": True,
|
||||
"action": "backup_server",
|
||||
"interval_type": "days",
|
||||
"interval": 1,
|
||||
"start_time": "00:00",
|
||||
"server_id": server_id,
|
||||
"comment": "Default backup job"
|
||||
}
|
||||
new_row = True
|
||||
if max_backups is not None:
|
||||
conf['max_backups'] = max_backups
|
||||
schd['enabled'] = bool(auto_enabled)
|
||||
if not new_row:
|
||||
with database.atomic():
|
||||
if backup_path is not None:
|
||||
u1 = Servers.update(backup_path=backup_path).where(Servers.server_id == server_id).execute()
|
||||
else:
|
||||
u1 = 0
|
||||
u2 = Backups.update(conf).where(Backups.server_id == server_id).execute()
|
||||
u3 = Schedules.update(schd).where(Schedules.schedule_id == row.schedule_id).execute()
|
||||
logger.debug("Updating existing backup record. {}+{}+{} rows affected".format(u1, u2, u3))
|
||||
else:
|
||||
with database.atomic():
|
||||
conf["server_id"] = server_id
|
||||
if backup_path is not None:
|
||||
u = Servers.update(backup_path=backup_path).where(Servers.server_id == server_id)
|
||||
s = Schedules.create(**schd)
|
||||
conf['schedule_id'] = s.schedule_id
|
||||
b = Backups.create(**conf)
|
||||
logger.debug("Creating new backup record.")
|
||||
|
||||
|
||||
management_helper = helpers_management()
|
85
app/classes/models/roles.py
Normal file
85
app/classes/models/roles.py
Normal file
@ -0,0 +1,85 @@
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
import datetime
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
peewee_logger = logging.getLogger('peewee')
|
||||
peewee_logger.setLevel(logging.INFO)
|
||||
|
||||
try:
|
||||
from peewee import *
|
||||
from playhouse.shortcuts import model_to_dict
|
||||
from enum import Enum
|
||||
import yaml
|
||||
|
||||
except ModuleNotFoundError as e:
|
||||
logger.critical("Import Error: Unable to load {} module".format(e.name), exc_info=True)
|
||||
console.critical("Import Error: Unable to load {} module".format(e.name))
|
||||
sys.exit(1)
|
||||
|
||||
database = SqliteDatabase(helper.db_path, pragmas={
|
||||
'journal_mode': 'wal',
|
||||
'cache_size': -1024 * 10})
|
||||
|
||||
#************************************************************************************************
|
||||
# Roles Class
|
||||
#************************************************************************************************
|
||||
class Roles(Model):
|
||||
role_id = AutoField()
|
||||
created = DateTimeField(default=datetime.datetime.now)
|
||||
last_update = DateTimeField(default=datetime.datetime.now)
|
||||
role_name = CharField(default="", unique=True, index=True)
|
||||
|
||||
class Meta:
|
||||
table_name = "roles"
|
||||
database = database
|
||||
|
||||
#************************************************************************************************
|
||||
# Roles Helpers
|
||||
#************************************************************************************************
|
||||
class helper_roles:
|
||||
@staticmethod
|
||||
def get_all_roles():
|
||||
query = Roles.select()
|
||||
return query
|
||||
|
||||
@staticmethod
|
||||
def get_roleid_by_name(role_name):
|
||||
try:
|
||||
return (Roles.get(Roles.role_name == role_name)).role_id
|
||||
except DoesNotExist:
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_role(role_id):
|
||||
return model_to_dict(Roles.get(Roles.role_id == role_id))
|
||||
|
||||
@staticmethod
|
||||
def add_role(role_name):
|
||||
role_id = Roles.insert({
|
||||
Roles.role_name: role_name.lower(),
|
||||
Roles.created: helper.get_time_as_string()
|
||||
}).execute()
|
||||
return role_id
|
||||
|
||||
@staticmethod
|
||||
def update_role(role_id, up_data):
|
||||
return Roles.update(up_data).where(Roles.role_id == role_id).execute()
|
||||
|
||||
@staticmethod
|
||||
def remove_role(role_id):
|
||||
with database.atomic():
|
||||
role = Roles.get(Roles.role_id == role_id)
|
||||
return role.delete_instance()
|
||||
|
||||
@staticmethod
|
||||
def role_id_exists(role_id):
|
||||
if not roles_helper.get_role(role_id):
|
||||
return False
|
||||
return True
|
||||
|
||||
roles_helper = helper_roles()
|
164
app/classes/models/server_permissions.py
Normal file
164
app/classes/models/server_permissions.py
Normal file
@ -0,0 +1,164 @@
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
import datetime
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
from app.classes.models.servers import Servers
|
||||
from app.classes.models.roles import Roles
|
||||
from app.classes.models.users import users_helper
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
peewee_logger = logging.getLogger('peewee')
|
||||
peewee_logger.setLevel(logging.INFO)
|
||||
|
||||
try:
|
||||
from peewee import *
|
||||
from playhouse.shortcuts import model_to_dict
|
||||
from enum import Enum
|
||||
import yaml
|
||||
|
||||
except ModuleNotFoundError as e:
|
||||
logger.critical("Import Error: Unable to load {} module".format(e.name), exc_info=True)
|
||||
console.critical("Import Error: Unable to load {} module".format(e.name))
|
||||
sys.exit(1)
|
||||
|
||||
database = SqliteDatabase(helper.db_path, pragmas={
|
||||
'journal_mode': 'wal',
|
||||
'cache_size': -1024 * 10})
|
||||
|
||||
|
||||
#************************************************************************************************
|
||||
# Role Servers Class
|
||||
#************************************************************************************************
|
||||
class Role_Servers(Model):
|
||||
role_id = ForeignKeyField(Roles, backref='role_server')
|
||||
server_id = ForeignKeyField(Servers, backref='role_server')
|
||||
permissions = CharField(default="00000000")
|
||||
|
||||
class Meta:
|
||||
table_name = 'role_servers'
|
||||
primary_key = CompositeKey('role_id', 'server_id')
|
||||
database = database
|
||||
|
||||
#************************************************************************************************
|
||||
# Servers Permissions Class
|
||||
#************************************************************************************************
|
||||
class Enum_Permissions_Server(Enum):
|
||||
Commands = 0
|
||||
Terminal = 1
|
||||
Logs = 2
|
||||
Schedule = 3
|
||||
Backup = 4
|
||||
Files = 5
|
||||
Config = 6
|
||||
Players = 7
|
||||
|
||||
class Permissions_Servers:
|
||||
|
||||
@staticmethod
|
||||
def get_or_create(role_id, server, permissions_mask):
|
||||
return Role_Servers.get_or_create(role_id=role_id, server_id=server, permissions=permissions_mask)
|
||||
|
||||
@staticmethod
|
||||
def get_permissions_list():
|
||||
permissions_list = []
|
||||
for member in Enum_Permissions_Server.__members__.items():
|
||||
permissions_list.append(member[1])
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def get_permissions(permissions_mask):
|
||||
permissions_list = []
|
||||
for member in Enum_Permissions_Server.__members__.items():
|
||||
if server_permissions.has_permission(permissions_mask, member[1]):
|
||||
permissions_list.append(member[1])
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def has_permission(permission_mask, permission_tested: Enum_Permissions_Server):
|
||||
result = False
|
||||
if permission_mask[permission_tested.value] == '1':
|
||||
result = True
|
||||
return result
|
||||
|
||||
@staticmethod
|
||||
def set_permission(permission_mask, permission_tested: Enum_Permissions_Server, value):
|
||||
list_perms = list(permission_mask)
|
||||
list_perms[permission_tested.value] = str(value)
|
||||
permission_mask = ''.join(list_perms)
|
||||
return permission_mask
|
||||
|
||||
@staticmethod
|
||||
def get_permission(permission_mask, permission_tested: Enum_Permissions_Server):
|
||||
return permission_mask[permission_tested.value]
|
||||
|
||||
|
||||
#************************************************************************************************
|
||||
# Role_Servers Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_role_servers_from_role_id(roleid):
|
||||
return Role_Servers.select().where(Role_Servers.role_id == roleid)
|
||||
|
||||
@staticmethod
|
||||
def get_servers_from_role(role_id):
|
||||
return Role_Servers.select().join(Servers, JOIN.INNER).where(Role_Servers.role_id == role_id)
|
||||
|
||||
@staticmethod
|
||||
def get_roles_from_server(server_id):
|
||||
return Role_Servers.select().join(Roles, JOIN.INNER).where(Role_Servers.server_id == server_id)
|
||||
|
||||
@staticmethod
|
||||
def add_role_server(server_id, role_id, rs_permissions="00000000"):
|
||||
servers = Role_Servers.insert({Role_Servers.server_id: server_id, Role_Servers.role_id: role_id, Role_Servers.permissions: rs_permissions}).execute()
|
||||
return servers
|
||||
|
||||
@staticmethod
|
||||
def get_permissions_mask(role_id, server_id):
|
||||
permissions_mask = ''
|
||||
role_server = Role_Servers.select().where(Role_Servers.role_id == role_id).where(Role_Servers.server_id == server_id).execute()
|
||||
permissions_mask = role_server.permissions
|
||||
return permissions_mask
|
||||
|
||||
@staticmethod
|
||||
def get_role_permissions_list(role_id):
|
||||
permissions_mask = '00000000'
|
||||
role_server = Role_Servers.get_or_none(role_id)
|
||||
if role_server is not None:
|
||||
permissions_mask = role_server.permissions
|
||||
permissions_list = server_permissions.get_permissions(permissions_mask)
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def update_role_permission(role_id, server_id, permissions_mask):
|
||||
role_server = Role_Servers.select().where(Role_Servers.role_id == role_id).where(Role_Servers.server_id == server_id).get()
|
||||
role_server.permissions = permissions_mask
|
||||
Role_Servers.save(role_server)
|
||||
|
||||
@staticmethod
|
||||
def delete_roles_permissions(role_id, removed_servers={}):
|
||||
return Role_Servers.delete().where(Role_Servers.role_id == role_id).where(Role_Servers.server_id.in_(removed_servers)).execute()
|
||||
|
||||
@staticmethod
|
||||
def remove_roles_of_server(server_id):
|
||||
with database.atomic():
|
||||
return Role_Servers.delete().where(Role_Servers.server_id == server_id).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_user_permissions_list(user_id, server_id):
|
||||
permissions_mask = ''
|
||||
permissions_list = []
|
||||
|
||||
user = users_helper.get_user(user_id)
|
||||
if user['superuser'] == True:
|
||||
permissions_list = server_permissions.get_permissions_list()
|
||||
else:
|
||||
roles_list = users_helper.get_user_roles_id(user_id)
|
||||
role_server = Role_Servers.select().where(Role_Servers.role_id.in_(roles_list)).where(Role_Servers.server_id == int(server_id)).execute()
|
||||
permissions_mask = role_server[0].permissions
|
||||
permissions_list = server_permissions.get_permissions(permissions_mask)
|
||||
return permissions_list
|
||||
|
||||
server_permissions = Permissions_Servers()
|
205
app/classes/models/servers.py
Normal file
205
app/classes/models/servers.py
Normal file
@ -0,0 +1,205 @@
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
import datetime
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
|
||||
from app.classes.shared.main_models import db_helper
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
peewee_logger = logging.getLogger('peewee')
|
||||
peewee_logger.setLevel(logging.INFO)
|
||||
|
||||
try:
|
||||
from peewee import *
|
||||
from playhouse.shortcuts import model_to_dict
|
||||
from enum import Enum
|
||||
import yaml
|
||||
|
||||
except ModuleNotFoundError as e:
|
||||
logger.critical("Import Error: Unable to load {} module".format(e.name), exc_info=True)
|
||||
console.critical("Import Error: Unable to load {} module".format(e.name))
|
||||
sys.exit(1)
|
||||
|
||||
database = SqliteDatabase(helper.db_path, pragmas={
|
||||
'journal_mode': 'wal',
|
||||
'cache_size': -1024 * 10})
|
||||
|
||||
#************************************************************************************************
|
||||
# Servers Class
|
||||
#************************************************************************************************
|
||||
class Servers(Model):
|
||||
server_id = AutoField()
|
||||
created = DateTimeField(default=datetime.datetime.now)
|
||||
server_uuid = CharField(default="", index=True)
|
||||
server_name = CharField(default="Server", index=True)
|
||||
path = CharField(default="")
|
||||
backup_path = CharField(default="")
|
||||
executable = CharField(default="")
|
||||
log_path = CharField(default="")
|
||||
execution_command = CharField(default="")
|
||||
auto_start = BooleanField(default=0)
|
||||
auto_start_delay = IntegerField(default=10)
|
||||
crash_detection = BooleanField(default=0)
|
||||
stop_command = CharField(default="stop")
|
||||
executable_update_url = CharField(default="")
|
||||
server_ip = CharField(default="127.0.0.1")
|
||||
server_port = IntegerField(default=25565)
|
||||
logs_delete_after = IntegerField(default=0)
|
||||
|
||||
class Meta:
|
||||
table_name = "servers"
|
||||
database = database
|
||||
|
||||
|
||||
#************************************************************************************************
|
||||
# Servers Stats Class
|
||||
#************************************************************************************************
|
||||
class Server_Stats(Model):
|
||||
stats_id = AutoField()
|
||||
created = DateTimeField(default=datetime.datetime.now)
|
||||
server_id = ForeignKeyField(Servers, backref='server', index=True)
|
||||
started = CharField(default="")
|
||||
running = BooleanField(default=False)
|
||||
cpu = FloatField(default=0)
|
||||
mem = FloatField(default=0)
|
||||
mem_percent = FloatField(default=0)
|
||||
world_name = CharField(default="")
|
||||
world_size = CharField(default="")
|
||||
server_port = IntegerField(default=25565)
|
||||
int_ping_results = CharField(default="")
|
||||
online = IntegerField(default=0)
|
||||
max = IntegerField(default=0)
|
||||
players = CharField(default="")
|
||||
desc = CharField(default="Unable to Connect")
|
||||
version = CharField(default="")
|
||||
updating = BooleanField(default=False)
|
||||
waiting_start = BooleanField(default=False)
|
||||
|
||||
|
||||
class Meta:
|
||||
table_name = "server_stats"
|
||||
database = database
|
||||
|
||||
|
||||
#************************************************************************************************
|
||||
# Servers Class
|
||||
#************************************************************************************************
|
||||
class helper_servers:
|
||||
|
||||
#************************************************************************************************
|
||||
# Generic Servers Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def create_server(name: str, server_uuid: str, server_dir: str, backup_path: str, server_command: str, server_file: str, server_log_file: str, server_stop: str, server_port=25565):
|
||||
return Servers.insert({
|
||||
Servers.server_name: name,
|
||||
Servers.server_uuid: server_uuid,
|
||||
Servers.path: server_dir,
|
||||
Servers.executable: server_file,
|
||||
Servers.execution_command: server_command,
|
||||
Servers.auto_start: False,
|
||||
Servers.auto_start_delay: 10,
|
||||
Servers.crash_detection: False,
|
||||
Servers.log_path: server_log_file,
|
||||
Servers.server_port: server_port,
|
||||
Servers.stop_command: server_stop,
|
||||
Servers.backup_path: backup_path
|
||||
}).execute()
|
||||
|
||||
@staticmethod
|
||||
def remove_server(server_id):
|
||||
with database.atomic():
|
||||
Servers.delete().where(Servers.server_id == server_id).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_server_data_by_id(server_id):
|
||||
query = Servers.select().where(Servers.server_id == server_id).limit(1)
|
||||
try:
|
||||
return db_helper.return_rows(query)[0]
|
||||
except IndexError:
|
||||
return {}
|
||||
|
||||
#************************************************************************************************
|
||||
# Servers Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_all_defined_servers():
|
||||
query = Servers.select()
|
||||
return db_helper.return_rows(query)
|
||||
|
||||
@staticmethod
|
||||
def get_all_servers_stats():
|
||||
servers = servers_helper.get_all_defined_servers()
|
||||
server_data = []
|
||||
|
||||
for s in servers:
|
||||
latest = Server_Stats.select().where(Server_Stats.server_id == s.get('server_id')).order_by(Server_Stats.created.desc()).limit(1)
|
||||
server_data.append({'server_data': s, "stats": db_helper.return_rows(latest)[0], "user_command_permission":True})
|
||||
return server_data
|
||||
|
||||
@staticmethod
|
||||
def get_server_friendly_name(server_id):
|
||||
server_data = servers_helper.get_server_data_by_id(server_id)
|
||||
friendly_name = "{} with ID: {}".format(server_data.get('server_name', None), server_data.get('server_id', 0))
|
||||
return friendly_name
|
||||
|
||||
#************************************************************************************************
|
||||
# Servers_Stats Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def get_latest_server_stats(server_id):
|
||||
return Server_Stats.select().where(Server_Stats.server_id == server_id).order_by(Server_Stats.created.desc()).limit(1)
|
||||
|
||||
@staticmethod
|
||||
def get_server_stats_by_id(server_id):
|
||||
stats = Server_Stats.select().where(Server_Stats.server_id == server_id).order_by(Server_Stats.created.desc()).limit(1)
|
||||
return db_helper.return_rows(stats)[0]
|
||||
|
||||
@staticmethod
|
||||
def server_id_exists(server_id):
|
||||
if not servers_helper.get_server_data_by_id(server_id):
|
||||
return False
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def set_update(server_id, value):
|
||||
try:
|
||||
row = Server_Stats.select().where(Server_Stats.server_id == server_id)
|
||||
except Exception as ex:
|
||||
logger.error("Database entry not found. ".format(ex))
|
||||
with database.atomic():
|
||||
Server_Stats.update(updating=value).where(Server_Stats.server_id == server_id).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_TTL_without_player(server_id):
|
||||
last_stat = Server_Stats.select().where(Server_Stats.server_id == server_id).order_by(Server_Stats.created.desc()).first()
|
||||
last_stat_with_player = Server_Stats.select().where(Server_Stats.server_id == server_id).where(Server_Stats.online > 0).order_by(Server_Stats.created.desc()).first()
|
||||
return last_stat.created - last_stat_with_player.created
|
||||
|
||||
@staticmethod
|
||||
def can_stop_no_players(server_id, time_limit):
|
||||
can = False
|
||||
ttl_no_players = servers_helper.get_TTL_without_player(server_id)
|
||||
if (time_limit == -1) or (ttl_no_players > time_limit):
|
||||
can = True
|
||||
return can
|
||||
|
||||
@staticmethod
|
||||
def set_waiting_start(server_id, value):
|
||||
try:
|
||||
row = Server_Stats.select().where(Server_Stats.server_id == server_id)
|
||||
except Exception as ex:
|
||||
logger.error("Database entry not found. ".format(ex))
|
||||
with database.atomic():
|
||||
Server_Stats.update(waiting_start=value).where(Server_Stats.server_id == server_id).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_waiting_start(server_id):
|
||||
waiting_start = Server_Stats.select().where(Server_Stats.server_id == server_id).get()
|
||||
return waiting_start.waiting_start
|
||||
|
||||
|
||||
servers_helper = helper_servers()
|
247
app/classes/models/users.py
Normal file
247
app/classes/models/users.py
Normal file
@ -0,0 +1,247 @@
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
import datetime
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
|
||||
from app.classes.models.roles import Roles, roles_helper
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
peewee_logger = logging.getLogger('peewee')
|
||||
peewee_logger.setLevel(logging.INFO)
|
||||
|
||||
try:
|
||||
from peewee import *
|
||||
from playhouse.shortcuts import model_to_dict
|
||||
from enum import Enum
|
||||
import yaml
|
||||
|
||||
except ModuleNotFoundError as e:
|
||||
logger.critical("Import Error: Unable to load {} module".format(e.name), exc_info=True)
|
||||
console.critical("Import Error: Unable to load {} module".format(e.name))
|
||||
sys.exit(1)
|
||||
|
||||
database = SqliteDatabase(helper.db_path, pragmas={
|
||||
'journal_mode': 'wal',
|
||||
'cache_size': -1024 * 10})
|
||||
|
||||
#************************************************************************************************
|
||||
# Users Class
|
||||
#************************************************************************************************
|
||||
class Users(Model):
|
||||
user_id = AutoField()
|
||||
created = DateTimeField(default=datetime.datetime.now)
|
||||
last_login = DateTimeField(default=datetime.datetime.now)
|
||||
last_update = DateTimeField(default=datetime.datetime.now)
|
||||
last_ip = CharField(default="")
|
||||
username = CharField(default="", unique=True, index=True)
|
||||
password = CharField(default="")
|
||||
enabled = BooleanField(default=True)
|
||||
superuser = BooleanField(default=False)
|
||||
api_token = CharField(default="", unique=True, index=True) # we may need to revisit this
|
||||
lang = CharField(default="en_EN")
|
||||
|
||||
class Meta:
|
||||
table_name = "users"
|
||||
database = database
|
||||
|
||||
#************************************************************************************************
|
||||
# User Roles Class
|
||||
#************************************************************************************************
|
||||
class User_Roles(Model):
|
||||
user_id = ForeignKeyField(Users, backref='user_role')
|
||||
role_id = ForeignKeyField(Roles, backref='user_role')
|
||||
|
||||
class Meta:
|
||||
table_name = 'user_roles'
|
||||
primary_key = CompositeKey('user_id', 'role_id')
|
||||
database = database
|
||||
|
||||
#************************************************************************************************
|
||||
# Users Helpers
|
||||
#************************************************************************************************
|
||||
class helper_users:
|
||||
|
||||
@staticmethod
|
||||
def get_by_id(user_id):
|
||||
return Users.get_by_id(user_id)
|
||||
|
||||
@staticmethod
|
||||
def get_all_users():
|
||||
query = Users.select()
|
||||
return query
|
||||
|
||||
@staticmethod
|
||||
def get_user_lang_by_id(user_id):
|
||||
return Users.get(Users.user_id == user_id).lang
|
||||
|
||||
@staticmethod
|
||||
def get_user_id_by_name(username):
|
||||
if username == "SYSTEM":
|
||||
return 0
|
||||
try:
|
||||
return (Users.get(Users.username == username)).user_id
|
||||
except DoesNotExist:
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_user_by_api_token(token: str):
|
||||
query = Users.select().where(Users.api_token == token)
|
||||
|
||||
if query.exists():
|
||||
user = model_to_dict(Users.get(Users.api_token == token))
|
||||
# I know it should apply it without setting it but I'm just making sure
|
||||
user = users_helper.add_user_roles(user)
|
||||
return user
|
||||
else:
|
||||
return {}
|
||||
|
||||
@staticmethod
|
||||
def user_query(user_id):
|
||||
user_query = Users.select().where(Users.user_id == user_id)
|
||||
return user_query
|
||||
|
||||
@staticmethod
|
||||
def get_user(user_id):
|
||||
if user_id == 0:
|
||||
return {
|
||||
'user_id': 0,
|
||||
'created': None,
|
||||
'last_login': None,
|
||||
'last_update': None,
|
||||
'last_ip': "127.27.23.89",
|
||||
'username': "SYSTEM",
|
||||
'password': None,
|
||||
'enabled': True,
|
||||
'superuser': False,
|
||||
'api_token': None,
|
||||
'roles': [],
|
||||
'servers': [],
|
||||
}
|
||||
user = model_to_dict(Users.get(Users.user_id == user_id))
|
||||
|
||||
if user:
|
||||
# I know it should apply it without setting it but I'm just making sure
|
||||
user = users_helper.add_user_roles(user)
|
||||
return user
|
||||
else:
|
||||
#logger.debug("user: ({}) {}".format(user_id, {}))
|
||||
return {}
|
||||
|
||||
@staticmethod
|
||||
def add_user(username, password=None, api_token=None, enabled=True, superuser=False):
|
||||
if password is not None:
|
||||
pw_enc = helper.encode_pass(password)
|
||||
else:
|
||||
pw_enc = None
|
||||
if api_token is None:
|
||||
api_token = users_helper.new_api_token()
|
||||
else:
|
||||
if type(api_token) is not str and len(api_token) != 32:
|
||||
raise ValueError("API token must be a 32 character string")
|
||||
user_id = Users.insert({
|
||||
Users.username: username.lower(),
|
||||
Users.password: pw_enc,
|
||||
Users.api_token: api_token,
|
||||
Users.enabled: enabled,
|
||||
Users.superuser: superuser,
|
||||
Users.created: helper.get_time_as_string()
|
||||
}).execute()
|
||||
return user_id
|
||||
|
||||
@staticmethod
|
||||
def update_user(user_id, up_data={}):
|
||||
if up_data:
|
||||
Users.update(up_data).where(Users.user_id == user_id).execute()
|
||||
|
||||
@staticmethod
|
||||
def remove_user(user_id):
|
||||
with database.atomic():
|
||||
User_Roles.delete().where(User_Roles.user_id == user_id).execute()
|
||||
user = Users.get(Users.user_id == user_id)
|
||||
return user.delete_instance()
|
||||
|
||||
@staticmethod
|
||||
def user_id_exists(user_id):
|
||||
if not users_helper.get_user(user_id):
|
||||
return False
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def new_api_token():
|
||||
while True:
|
||||
token = helper.random_string_generator(32)
|
||||
test = list(Users.select(Users.user_id).where(Users.api_token == token))
|
||||
if len(test) == 0:
|
||||
return token
|
||||
|
||||
#************************************************************************************************
|
||||
# User_Roles Methods
|
||||
#************************************************************************************************
|
||||
|
||||
@staticmethod
|
||||
def get_or_create(user_id, role_id):
|
||||
return User_Roles.get_or_create(user_id=user_id, role_id=role_id)
|
||||
|
||||
@staticmethod
|
||||
def get_user_roles_id(user_id):
|
||||
roles_list = []
|
||||
roles = User_Roles.select().where(User_Roles.user_id == user_id)
|
||||
for r in roles:
|
||||
roles_list.append(roles_helper.get_role(r.role_id)['role_id'])
|
||||
return roles_list
|
||||
|
||||
@staticmethod
|
||||
def get_user_roles_names(user_id):
|
||||
roles_list = []
|
||||
roles = User_Roles.select().where(User_Roles.user_id == user_id)
|
||||
for r in roles:
|
||||
roles_list.append(roles_helper.get_role(r.role_id)['role_name'])
|
||||
return roles_list
|
||||
|
||||
@staticmethod
|
||||
def add_role_to_user(user_id, role_id):
|
||||
User_Roles.insert({
|
||||
User_Roles.user_id: user_id,
|
||||
User_Roles.role_id: role_id
|
||||
}).execute()
|
||||
|
||||
@staticmethod
|
||||
def add_user_roles(user):
|
||||
if type(user) == dict:
|
||||
user_id = user['user_id']
|
||||
else:
|
||||
user_id = user.user_id
|
||||
|
||||
# I just copied this code from get_user, it had those TODOs & comments made by mac - Lukas
|
||||
|
||||
roles_query = User_Roles.select().join(Roles, JOIN.INNER).where(User_Roles.user_id == user_id)
|
||||
# TODO: this query needs to be narrower
|
||||
roles = set()
|
||||
for r in roles_query:
|
||||
roles.add(r.role_id.role_id)
|
||||
|
||||
user['roles'] = roles
|
||||
#logger.debug("user: ({}) {}".format(user_id, user))
|
||||
return user
|
||||
|
||||
@staticmethod
|
||||
def user_role_query(user_id):
|
||||
user_query = User_Roles.select().where(User_Roles.user_id == user_id)
|
||||
query = Roles.select().where(Roles.role_id == -1)
|
||||
for u in user_query:
|
||||
query = query + Roles.select().where(Roles.role_id == u.role_id)
|
||||
return query
|
||||
|
||||
@staticmethod
|
||||
def delete_user_roles(user_id, removed_roles):
|
||||
User_Roles.delete().where(User_Roles.user_id == user_id).where(User_Roles.role_id.in_(removed_roles)).execute()
|
||||
|
||||
@staticmethod
|
||||
def remove_roles_from_role_id(role_id):
|
||||
User_Roles.delete().where(User_Roles.role_id == role_id).execute()
|
||||
|
||||
|
||||
users_helper = helper_users()
|
@ -19,7 +19,6 @@ from requests import get
|
||||
from datetime import datetime
|
||||
from socket import gethostname
|
||||
|
||||
|
||||
from app.classes.shared.console import console
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@ -341,11 +340,12 @@ class Helpers:
|
||||
break
|
||||
path_list = test.split('/')
|
||||
root_path = path_list[0]
|
||||
'''
|
||||
if len(path_list) > 1:
|
||||
for i in range(len(path_list) - 2):
|
||||
root_path = os.path.join(root_path, path_list[i + 1])
|
||||
|
||||
full_root_path = os.path.join(tempDir, root_path)
|
||||
'''
|
||||
full_root_path = tempDir
|
||||
|
||||
for item in os.listdir(full_root_path):
|
||||
try:
|
||||
@ -651,22 +651,6 @@ class Helpers:
|
||||
def in_path_old(x, y):
|
||||
return os.path.abspath(y).__contains__(os.path.abspath(x))
|
||||
|
||||
@staticmethod
|
||||
def get_banned_players(server_id, db_helper):
|
||||
stats = db_helper.get_server_stats_by_id(server_id)
|
||||
server_path = stats['server_id']['path']
|
||||
path = os.path.join(server_path, 'banned-players.json')
|
||||
|
||||
try:
|
||||
with open(path) as file:
|
||||
content = file.read()
|
||||
file.close()
|
||||
except Exception as ex:
|
||||
print (ex)
|
||||
return None
|
||||
|
||||
return json.loads(content)
|
||||
|
||||
@staticmethod
|
||||
def copy_files(source, dest):
|
||||
if os.path.isfile(source):
|
||||
|
@ -12,7 +12,16 @@ from distutils import dir_util
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
|
||||
from app.classes.shared.models import db_helper, server_permissions, Enum_Permissions_Server, crafty_permissions, Enum_Permissions_Crafty
|
||||
#Importing Models
|
||||
from app.classes.models.crafty_permissions import crafty_permissions, Enum_Permissions_Crafty
|
||||
from app.classes.models.servers import servers_helper
|
||||
#Importing Controllers
|
||||
from app.classes.controllers.crafty_perms_controller import Crafty_Perms_Controller
|
||||
from app.classes.controllers.management_controller import Management_Controller
|
||||
from app.classes.controllers.users_controller import Users_Controller
|
||||
from app.classes.controllers.roles_controller import Roles_Controller
|
||||
from app.classes.controllers.server_perms_controller import Server_Perms_Controller
|
||||
from app.classes.controllers.servers_controller import Servers_Controller
|
||||
|
||||
from app.classes.shared.server import Server
|
||||
from app.classes.minecraft.server_props import ServerProps
|
||||
@ -21,12 +30,17 @@ from app.classes.minecraft.stats import Stats
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Controller:
|
||||
|
||||
def __init__(self):
|
||||
self.servers_list = []
|
||||
self.stats = Stats(self)
|
||||
self.crafty_perms = Crafty_Perms_Controller()
|
||||
self.management = Management_Controller()
|
||||
self.roles = Roles_Controller()
|
||||
self.server_perms = Server_Perms_Controller()
|
||||
self.servers = Servers_Controller()
|
||||
self.users = Users_Controller()
|
||||
|
||||
def check_server_loaded(self, server_id_to_check: int):
|
||||
|
||||
@ -45,7 +59,7 @@ class Controller:
|
||||
|
||||
def init_all_servers(self):
|
||||
|
||||
servers = db_helper.get_all_defined_servers()
|
||||
servers = self.servers.get_all_defined_servers()
|
||||
|
||||
for s in servers:
|
||||
server_id = s.get('server_id')
|
||||
@ -87,11 +101,8 @@ class Controller:
|
||||
self.servers_list.append(temp_server_dict)
|
||||
|
||||
if s['auto_start']:
|
||||
db_helper.set_waiting_start(s['server_id'], True)
|
||||
self.servers.set_waiting_start(s['server_id'], True)
|
||||
|
||||
db_helper.get_waiting_start(s['server_id'])
|
||||
|
||||
server_stats = db_helper.get_all_servers_stats()
|
||||
self.refresh_server_settings(s['server_id'])
|
||||
|
||||
console.info("Loaded Server: ID {} | Name: {} | Autostart: {} | Delay: {} ".format(
|
||||
@ -131,82 +142,8 @@ class Controller:
|
||||
|
||||
@staticmethod
|
||||
def list_defined_servers():
|
||||
servers = db_helper.get_all_defined_servers()
|
||||
servers = servers_helper.get_all_defined_servers()
|
||||
return servers
|
||||
|
||||
@staticmethod
|
||||
def list_defined_permissions():
|
||||
permissions_list = server_permissions.get_permissions_list()
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def list_defined_crafty_permissions():
|
||||
permissions_list = crafty_permissions.get_permissions_list()
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def get_mask_permissions(role_id, server_id):
|
||||
permissions_mask = db_helper.get_permissions_mask(role_id, server_id)
|
||||
return permissions_mask
|
||||
|
||||
@staticmethod
|
||||
def get_role_permissions(role_id):
|
||||
permissions_list = db_helper.get_role_permissions_list(role_id)
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def get_server_permissions_foruser(user_id, server_id):
|
||||
permissions_list = db_helper.get_user_permissions_list(user_id, server_id)
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def get_mask_crafty_permissions(user_id):
|
||||
permissions_mask = db_helper.get_crafty_permissions_mask(user_id)
|
||||
return permissions_mask
|
||||
|
||||
@staticmethod
|
||||
def get_crafty_permissions(user_id):
|
||||
permissions_list = db_helper.get_crafty_permissions_list(user_id)
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def can_create_server(user_id):
|
||||
return db_helper.can_add_in_crafty(user_id, Enum_Permissions_Crafty.Server_Creation)
|
||||
|
||||
@staticmethod
|
||||
def can_add_user(user_id):
|
||||
#TODO: Complete if we need a User Addition limit
|
||||
#return db_helper.can_add_in_crafty(user_id, Enum_Permissions_Crafty.User_Config)
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def can_add_role(user_id):
|
||||
#TODO: Complete if we need a Role Addition limit
|
||||
#return db_helper.can_add_in_crafty(user_id, Enum_Permissions_Crafty.Roles_Config)
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def list_all_crafty_permissions_quantity_limits():
|
||||
return db_helper.get_all_permission_quantity_list()
|
||||
|
||||
@staticmethod
|
||||
def list_crafty_permissions_quantity_limits(user_id):
|
||||
return db_helper.get_permission_quantity_list(user_id)
|
||||
|
||||
@staticmethod
|
||||
def get_crafty_permissions(user_id):
|
||||
permissions_list = db_helper.get_crafty_permissions_list(user_id)
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def get_crafty_permissions(user_id):
|
||||
permissions_list = db_helper.get_crafty_permissions_list(user_id)
|
||||
return permissions_list
|
||||
|
||||
@staticmethod
|
||||
def list_authorized_servers(userId):
|
||||
server_list = db_helper.get_authorized_servers(userId)
|
||||
return server_list
|
||||
|
||||
def list_running_servers(self):
|
||||
running_servers = []
|
||||
@ -378,7 +315,7 @@ class Controller:
|
||||
|
||||
def register_server(self, name: str, server_uuid: str, server_dir: str, backup_path: str, server_command: str, server_file: str, server_log_file: str, server_stop: str, server_port=25565):
|
||||
# put data in the db
|
||||
new_id = db_helper.create_server(name, server_uuid, server_dir, backup_path, server_command, server_file, server_log_file, server_stop, server_port)
|
||||
new_id = self.servers.create_server(name, server_uuid, server_dir, backup_path, server_command, server_file, server_log_file, server_stop, server_port)
|
||||
|
||||
try:
|
||||
# place a file in the dir saying it's owned by crafty
|
||||
@ -414,9 +351,9 @@ class Controller:
|
||||
if running:
|
||||
self.stop_server(server_id)
|
||||
if files:
|
||||
shutil.rmtree(db_helper.get_server_data_by_id(server_id)['path'])
|
||||
shutil.rmtree(self.servers.get_server_data_by_id(server_id)['path'])
|
||||
# remove the server from the DB
|
||||
db_helper.remove_server(server_id)
|
||||
self.servers.remove_server(server_id)
|
||||
|
||||
# remove the server from servers list
|
||||
self.servers_list.pop(counter)
|
94
app/classes/shared/main_models.py
Normal file
94
app/classes/shared/main_models.py
Normal file
@ -0,0 +1,94 @@
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
import datetime
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
from app.classes.models.users import Users, users_helper
|
||||
from app.classes.minecraft.server_props import ServerProps
|
||||
from app.classes.web.websocket_helper import websocket_helper
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
peewee_logger = logging.getLogger('peewee')
|
||||
peewee_logger.setLevel(logging.INFO)
|
||||
|
||||
try:
|
||||
from peewee import *
|
||||
from playhouse.shortcuts import model_to_dict
|
||||
from enum import Enum
|
||||
import yaml
|
||||
|
||||
except ModuleNotFoundError as e:
|
||||
logger.critical("Import Error: Unable to load {} module".format(e.name), exc_info=True)
|
||||
console.critical("Import Error: Unable to load {} module".format(e.name))
|
||||
sys.exit(1)
|
||||
|
||||
database = SqliteDatabase(helper.db_path, pragmas={
|
||||
'journal_mode': 'wal',
|
||||
'cache_size': -1024 * 10})
|
||||
|
||||
class db_builder:
|
||||
|
||||
@staticmethod
|
||||
def default_settings():
|
||||
logger.info("Fresh Install Detected - Creating Default Settings")
|
||||
console.info("Fresh Install Detected - Creating Default Settings")
|
||||
default_data = helper.find_default_password()
|
||||
|
||||
username = default_data.get("username", 'admin')
|
||||
password = default_data.get("password", 'crafty')
|
||||
#api_token = helper.random_string_generator(32)
|
||||
#
|
||||
#Users.insert({
|
||||
# Users.username: username.lower(),
|
||||
# Users.password: helper.encode_pass(password),
|
||||
# Users.api_token: api_token,
|
||||
# Users.enabled: True,
|
||||
# Users.superuser: True
|
||||
#}).execute()
|
||||
user_id = users_helper.add_user(username=username, password=password, superuser=True)
|
||||
#users_helper.update_user(user_id, user_crafty_data={"permissions_mask":"111", "server_quantity":[-1,-1,-1]} )
|
||||
|
||||
#console.info("API token is {}".format(api_token))
|
||||
|
||||
@staticmethod
|
||||
def is_fresh_install():
|
||||
try:
|
||||
user = users_helper.get_by_id(1)
|
||||
return False
|
||||
except:
|
||||
return True
|
||||
pass
|
||||
|
||||
class db_shortcuts:
|
||||
|
||||
#************************************************************************************************
|
||||
# Generic Databse Methods
|
||||
#************************************************************************************************
|
||||
@staticmethod
|
||||
def return_rows(query):
|
||||
rows = []
|
||||
|
||||
try:
|
||||
if query.count() > 0:
|
||||
for s in query:
|
||||
rows.append(model_to_dict(s))
|
||||
except Exception as e:
|
||||
logger.warning("Database Error: {}".format(e))
|
||||
pass
|
||||
|
||||
return rows
|
||||
|
||||
@staticmethod
|
||||
def return_db_rows(model):
|
||||
data = [model_to_dict(row) for row in model]
|
||||
return data
|
||||
|
||||
|
||||
#************************************************************************************************
|
||||
# Static Accessors
|
||||
#************************************************************************************************
|
||||
installer = db_builder()
|
||||
db_helper = db_shortcuts()
|
File diff suppressed because it is too large
Load Diff
@ -16,7 +16,8 @@ import html
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
from app.classes.shared.models import db_helper, Servers
|
||||
from app.classes.models.servers import Servers, servers_helper
|
||||
from app.classes.models.management import management_helper
|
||||
from app.classes.web.websocket_helper import websocket_helper
|
||||
from app.classes.shared.translation import translation
|
||||
|
||||
@ -103,7 +104,7 @@ class Server:
|
||||
self.is_backingup = False
|
||||
|
||||
def reload_server_settings(self):
|
||||
server_data = db_helper.get_server_data_by_id(self.server_id)
|
||||
server_data = servers_helper.get_server_data_by_id(self.server_id)
|
||||
self.settings = server_data
|
||||
|
||||
def do_server_setup(self, server_data_obj):
|
||||
@ -134,9 +135,9 @@ class Server:
|
||||
# remove the scheduled job since it's ran
|
||||
return schedule.CancelJob
|
||||
|
||||
def run_threaded_server(self):
|
||||
def run_threaded_server(self, lang):
|
||||
# start the server
|
||||
self.server_thread = threading.Thread(target=self.start_server, daemon=True, name='{}_server_thread'.format(self.server_id))
|
||||
self.server_thread = threading.Thread(target=self.start_server, daemon=True, args=(lang,), name='{}_server_thread'.format(self.server_id))
|
||||
self.server_thread.start()
|
||||
|
||||
def setup_server_run_command(self):
|
||||
@ -161,7 +162,7 @@ class Server:
|
||||
console.warning("Unable to write/access {}".format(self.server_path))
|
||||
helper.do_exit()
|
||||
|
||||
def start_server(self):
|
||||
def start_server(self, user_lang):
|
||||
|
||||
logger.info("Start command detected. Reloading settings from DB for server {}".format(self.name))
|
||||
self.setup_server_run_command()
|
||||
@ -186,27 +187,29 @@ class Server:
|
||||
creationflags=None
|
||||
|
||||
logger.info("Starting server in {p} with command: {c}".format(p=self.server_path, c=self.server_command))
|
||||
|
||||
servers_helper.set_waiting_start(self.server_id, False)
|
||||
try:
|
||||
self.process = subprocess.Popen(self.server_command, cwd=self.server_path, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||
except Exception as ex:
|
||||
msg = "Server {} failed to start with error code: {}".format(self.name, ex)
|
||||
logger.error(msg)
|
||||
websocket_helper.broadcast('send_start_error', {
|
||||
'error': translation.translate('error', 'start-error').format(self.name, ex)
|
||||
'error': translation.translate('error', 'start-error', user_lang).format(self.name, ex)
|
||||
})
|
||||
return False
|
||||
if helper.check_internet():
|
||||
loc_server_port = db_helper.get_server_stats_by_id(self.server_id)['server_port']
|
||||
loc_server_port = servers_helper.get_server_stats_by_id(self.server_id)['server_port']
|
||||
if helper.check_port(loc_server_port):
|
||||
websocket_helper.broadcast('send_start_reload', {
|
||||
})
|
||||
else:
|
||||
websocket_helper.broadcast('send_start_error', {
|
||||
'error': translation.translate('error', 'closedPort').format(loc_server_port)
|
||||
'error': translation.translate('error', 'closedPort', user_lang).format(loc_server_port)
|
||||
})
|
||||
else:
|
||||
websocket_helper.broadcast('send_start_error', {
|
||||
'error': translation.translate('error', 'internet')
|
||||
'error': translation.translate('error', 'internet', user_lang)
|
||||
})
|
||||
db_helper.set_waiting_start(self.server_id, False)
|
||||
out_buf = ServerOutBuf(self.process, self.server_id)
|
||||
@ -278,15 +281,15 @@ class Server:
|
||||
|
||||
self.stats.record_stats()
|
||||
|
||||
def restart_threaded_server(self):
|
||||
def restart_threaded_server(self, lang):
|
||||
|
||||
# if not already running, let's just start
|
||||
if not self.check_running():
|
||||
self.run_threaded_server()
|
||||
self.run_threaded_server(lang)
|
||||
else:
|
||||
self.stop_threaded_server()
|
||||
time.sleep(2)
|
||||
self.run_threaded_server()
|
||||
self.run_threaded_server(lang)
|
||||
|
||||
def cleanup_server_object(self):
|
||||
self.start_time = None
|
||||
@ -427,7 +430,7 @@ class Server:
|
||||
def a_backup_server(self):
|
||||
logger.info("Starting server {} (ID {}) backup".format(self.name, self.server_id))
|
||||
self.is_backingup = True
|
||||
conf = db_helper.get_backup_config(self.server_id)
|
||||
conf = management_helper.get_backup_config(self.server_id)
|
||||
try:
|
||||
backup_filename = "{}/{}".format(self.settings['backup_path'], datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
|
||||
logger.info("Creating backup of server '{}' (ID#{}) at '{}'".format(self.settings['server_name'], self.server_id, backup_filename))
|
||||
@ -447,7 +450,7 @@ class Server:
|
||||
return
|
||||
|
||||
def list_backups(self):
|
||||
conf = db_helper.get_backup_config(self.server_id)
|
||||
conf = management_helper.get_backup_config(self.server_id)
|
||||
if helper.check_path_exists(self.settings['backup_path']):
|
||||
files = helper.get_human_readable_files_sizes(helper.list_dir_by_date(self.settings['backup_path']))
|
||||
return [{"path": os.path.relpath(f['path'], start=conf['backup_path']), "size": f["size"]} for f in files]
|
||||
@ -455,12 +458,12 @@ class Server:
|
||||
return []
|
||||
|
||||
def jar_update(self):
|
||||
db_helper.set_update(self.server_id, True)
|
||||
servers_helper.set_update(self.server_id, True)
|
||||
update_thread = threading.Thread(target=self.a_jar_update, daemon=True, name="exe_update")
|
||||
update_thread.start()
|
||||
|
||||
def check_update(self):
|
||||
server_stats = db_helper.get_server_stats_by_id(self.server_id)
|
||||
server_stats = servers_helper.get_server_stats_by_id(self.server_id)
|
||||
if server_stats['updating']:
|
||||
return True
|
||||
else:
|
||||
@ -512,12 +515,12 @@ class Server:
|
||||
#boolean returns true for false for success
|
||||
downloaded = helper.download_file(self.settings['executable_update_url'], current_executable)
|
||||
|
||||
while db_helper.get_server_stats_by_id(self.server_id)['updating']:
|
||||
while servers_helper.get_server_stats_by_id(self.server_id)['updating']:
|
||||
if downloaded and not self.is_backingup:
|
||||
print("Backup Status: " + str(self.is_backingup))
|
||||
logger.info("Executable updated successfully. Starting Server")
|
||||
|
||||
db_helper.set_update(self.server_id, False)
|
||||
servers_helper.set_update(self.server_id, False)
|
||||
if len(websocket_helper.clients) > 0:
|
||||
# There are clients
|
||||
self.check_update()
|
||||
@ -530,12 +533,12 @@ class Server:
|
||||
})
|
||||
websocket_helper.broadcast('notification', "Executable update finished for "+self.name)
|
||||
|
||||
db_helper.add_to_audit_log_raw('Alert', '-1', self.server_id, "Executable update finished for "+self.name, self.settings['server_ip'])
|
||||
management_helper.add_to_audit_log_raw('Alert', '-1', self.server_id, "Executable update finished for "+self.name, self.settings['server_ip'])
|
||||
if wasStarted:
|
||||
self.start_server()
|
||||
elif not downloaded and not self.is_backingup:
|
||||
time.sleep(5)
|
||||
db_helper.set_update(self.server_id, False)
|
||||
servers_helper.set_update(self.server_id, False)
|
||||
websocket_helper.broadcast('notification',
|
||||
"Executable update failed for " + self.name + ". Check log file for details.")
|
||||
logger.error("Executable download failed.")
|
||||
|
@ -13,7 +13,8 @@ from app.classes.web.tornado import Webserver
|
||||
from app.classes.web.websocket_helper import websocket_helper
|
||||
|
||||
from app.classes.minecraft.serverjars import server_jar_obj
|
||||
from app.classes.shared.models import db_helper
|
||||
from app.classes.models.servers import servers_helper
|
||||
from app.classes.models.management import management_helper
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@ -75,7 +76,7 @@ class TasksManager:
|
||||
time.sleep(5)
|
||||
|
||||
def reload_schedule_from_db(self):
|
||||
jobs = db_helper.get_schedules_enabled()
|
||||
jobs = management_helper.get_schedules_enabled()
|
||||
schedule.clear(tag='backup')
|
||||
schedule.clear(tag='db')
|
||||
for j in jobs:
|
||||
@ -84,7 +85,7 @@ class TasksManager:
|
||||
i=j.schedule_id, a=j.action, n=j.interval, t=j.interval_type, s=j.start_time))
|
||||
try:
|
||||
getattr(schedule.every(j.interval), j.interval_type).at(j.start_time).do(
|
||||
db_helper.send_command, 0, j.server_id, "127.27.23.89", j.action)
|
||||
management_helper.send_command, 0, j.server_id, "127.27.23.89", j.action)
|
||||
except schedule.ScheduleValueError as e:
|
||||
logger.critical("Scheduler value error occurred: {} on ID#{}".format(e, j.schedule_id))
|
||||
else:
|
||||
@ -93,27 +94,28 @@ class TasksManager:
|
||||
def command_watcher(self):
|
||||
while True:
|
||||
# select any commands waiting to be processed
|
||||
commands = db_helper.get_unactioned_commands()
|
||||
commands = management_helper.get_unactioned_commands()
|
||||
for c in commands:
|
||||
|
||||
svr = self.controller.get_server_obj(c['server_id']['server_id'])
|
||||
user_lang = c.get('user')['lang']
|
||||
command = c.get('command', None)
|
||||
|
||||
if command == 'start_server':
|
||||
svr.run_threaded_server()
|
||||
svr.run_threaded_server(user_lang)
|
||||
|
||||
elif command == 'stop_server':
|
||||
svr.stop_threaded_server()
|
||||
|
||||
elif command == "restart_server":
|
||||
svr.restart_threaded_server()
|
||||
svr.restart_threaded_server(user_lang)
|
||||
|
||||
elif command == "backup_server":
|
||||
svr.backup_server()
|
||||
|
||||
elif command == "update_executable":
|
||||
svr.jar_update()
|
||||
db_helper.mark_command_complete(c.get('command_id', None))
|
||||
svr.jar_update(user_lang)
|
||||
management_helper.mark_command_complete(c.get('command_id', None))
|
||||
|
||||
time.sleep(1)
|
||||
|
||||
@ -187,17 +189,17 @@ class TasksManager:
|
||||
loop = asyncio.new_event_loop()
|
||||
asyncio.set_event_loop(loop)
|
||||
|
||||
host_stats = db_helper.get_latest_hosts_stats()
|
||||
host_stats = management_helper.get_latest_hosts_stats()
|
||||
|
||||
while True:
|
||||
|
||||
if host_stats.get('cpu_usage') != \
|
||||
db_helper.get_latest_hosts_stats().get('cpu_usage') or \
|
||||
management_helper.get_latest_hosts_stats().get('cpu_usage') or \
|
||||
host_stats.get('mem_percent') != \
|
||||
db_helper.get_latest_hosts_stats().get('mem_percent'):
|
||||
management_helper.get_latest_hosts_stats().get('mem_percent'):
|
||||
# Stats are different
|
||||
|
||||
host_stats = db_helper.get_latest_hosts_stats()
|
||||
host_stats = management_helper.get_latest_hosts_stats()
|
||||
if len(websocket_helper.clients) > 0:
|
||||
# There are clients
|
||||
websocket_helper.broadcast_page('/panel/dashboard', 'update_host_stats', {
|
||||
@ -211,6 +213,6 @@ class TasksManager:
|
||||
time.sleep(4)
|
||||
|
||||
def log_watcher(self):
|
||||
helper.check_for_old_logs(db_helper)
|
||||
schedule.every(6).hours.do(lambda: helper.check_for_old_logs(db_helper)).tag('log-mgmt')
|
||||
self.controller.servers.check_for_old_logs()
|
||||
schedule.every(6).hours.do(lambda: self.controller.servers.check_for_old_logs()).tag('log-mgmt')
|
||||
|
||||
|
@ -1,73 +1,71 @@
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
|
||||
import os
|
||||
import json
|
||||
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class Translation():
|
||||
def __init__(self):
|
||||
self.translations_path = os.path.join(helper.root_dir, 'app', 'translations')
|
||||
self.cached_translation = None
|
||||
self.cached_translation_lang = None
|
||||
self.lang_file_exists = []
|
||||
def translate(self, page, word):
|
||||
translated_word = None
|
||||
lang = helper.get_setting('language')
|
||||
fallback_lang = 'en_EN'
|
||||
|
||||
if lang not in self.lang_file_exists and \
|
||||
helper.check_file_exists(os.path.join(self.translations_path, lang + '.json')):
|
||||
self.lang_file_exists.append(lang)
|
||||
|
||||
|
||||
translated_word = self.translate_inner(page, word, lang) \
|
||||
if lang in self.lang_file_exists else self.translate_inner(page, word, fallback_lang)
|
||||
|
||||
if translated_word:
|
||||
if isinstance(translated_word, dict): return json.dumps(translated_word)
|
||||
elif iter(translated_word) and not isinstance(translated_word, str): return '\n'.join(translated_word)
|
||||
return translated_word
|
||||
return 'Error while getting translation'
|
||||
def translate_inner(self, page, word, lang):
|
||||
lang_file = os.path.join(
|
||||
self.translations_path,
|
||||
lang + '.json'
|
||||
)
|
||||
try:
|
||||
if not self.cached_translation:
|
||||
with open(lang_file, 'r') as f:
|
||||
data = json.load(f)
|
||||
self.cached_translation = data
|
||||
elif self.cached_translation_lang != lang:
|
||||
with open(lang_file, 'r') as f:
|
||||
data = json.load(f)
|
||||
self.cached_translation = data
|
||||
self.cached_translation_lang = lang
|
||||
else:
|
||||
data = self.cached_translation
|
||||
|
||||
try:
|
||||
translated_page = data[page]
|
||||
except KeyError:
|
||||
logger.error('Translation File Error: page {} does not exist for lang {}'.format(page, lang))
|
||||
console.error('Translation File Error: page {} does not exist for lang {}'.format(page, lang))
|
||||
return None
|
||||
|
||||
try:
|
||||
translated_word = translated_page[word]
|
||||
return translated_word
|
||||
except KeyError:
|
||||
logger.error('Translation File Error: word {} does not exist on page {} for lang {}'.format(word, page, lang))
|
||||
console.error('Translation File Error: word {} does not exist on page {} for lang {}'.format(word, page, lang))
|
||||
return None
|
||||
|
||||
except Exception as e:
|
||||
logger.critical('Translation File Error: Unable to read {} due to {}'.format(lang_file, e))
|
||||
console.critical('Translation File Error: Unable to read {} due to {}'.format(lang_file, e))
|
||||
return None
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.console import console
|
||||
|
||||
import os
|
||||
import json
|
||||
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class Translation():
|
||||
def __init__(self):
|
||||
self.translations_path = os.path.join(helper.root_dir, 'app', 'translations')
|
||||
self.cached_translation = None
|
||||
self.cached_translation_lang = None
|
||||
self.lang_file_exists = []
|
||||
def translate(self, page, word, lang):
|
||||
translated_word = None
|
||||
fallback_lang = 'en_EN'
|
||||
|
||||
if lang not in self.lang_file_exists and \
|
||||
helper.check_file_exists(os.path.join(self.translations_path, str(lang) + '.json')):
|
||||
self.lang_file_exists.append(lang)
|
||||
|
||||
translated_word = self.translate_inner(page, word, lang) \
|
||||
if lang in self.lang_file_exists else self.translate_inner(page, word, fallback_lang)
|
||||
|
||||
if translated_word:
|
||||
if isinstance(translated_word, dict): return json.dumps(translated_word)
|
||||
elif iter(translated_word) and not isinstance(translated_word, str): return '\n'.join(translated_word)
|
||||
return translated_word
|
||||
return 'Error while getting translation'
|
||||
def translate_inner(self, page, word, lang):
|
||||
lang_file = os.path.join(
|
||||
self.translations_path,
|
||||
lang + '.json'
|
||||
)
|
||||
try:
|
||||
if not self.cached_translation:
|
||||
with open(lang_file, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
self.cached_translation = data
|
||||
elif self.cached_translation_lang != lang:
|
||||
with open(lang_file, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
self.cached_translation = data
|
||||
self.cached_translation_lang = lang
|
||||
else:
|
||||
data = self.cached_translation
|
||||
|
||||
try:
|
||||
translated_page = data[page]
|
||||
except KeyError:
|
||||
logger.error('Translation File Error: page {} does not exist for lang {}'.format(page, lang))
|
||||
console.error('Translation File Error: page {} does not exist for lang {}'.format(page, lang))
|
||||
return None
|
||||
|
||||
try:
|
||||
translated_word = translated_page[word]
|
||||
return translated_word
|
||||
except KeyError:
|
||||
logger.error('Translation File Error: word {} does not exist on page {} for lang {}'.format(word, page, lang))
|
||||
console.error('Translation File Error: word {} does not exist on page {} for lang {}'.format(word, page, lang))
|
||||
return None
|
||||
|
||||
except Exception as e:
|
||||
logger.critical('Translation File Error: Unable to read {} due to {}'.format(lang_file, e))
|
||||
console.critical('Translation File Error: Unable to read {} due to {}'.format(lang_file, e))
|
||||
return None
|
||||
|
||||
translation = Translation()
|
@ -14,9 +14,8 @@ import html
|
||||
import re
|
||||
|
||||
from app.classes.shared.console import console
|
||||
from app.classes.shared.models import Users, installer
|
||||
from app.classes.shared.main_models import Users, installer
|
||||
from app.classes.web.base_handler import BaseHandler
|
||||
from app.classes.shared.models import db_helper
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.server import ServerOutBuf
|
||||
|
||||
@ -59,7 +58,7 @@ class AjaxHandler(BaseHandler):
|
||||
|
||||
server_id = bleach.clean(server_id)
|
||||
|
||||
server_data = db_helper.get_server_data_by_id(server_id)
|
||||
server_data = self.controller.servers.get_server_data_by_id(server_id)
|
||||
if not server_data:
|
||||
logger.warning("Server Data not found in server_log ajax call")
|
||||
self.redirect("/panel/error?error=Server ID Not Found")
|
||||
@ -99,7 +98,7 @@ class AjaxHandler(BaseHandler):
|
||||
if not self.check_server_id(server_id, 'get_file'): return
|
||||
else: server_id = bleach.clean(server_id)
|
||||
|
||||
if not helper.in_path(db_helper.get_server_data_by_id(server_id)['path'], file_path)\
|
||||
if not helper.in_path(self.controller.servers.get_server_data_by_id(server_id)['path'], file_path)\
|
||||
or not helper.check_file_exists(os.path.abspath(file_path)):
|
||||
logger.warning("Invalid path in get_file ajax call ({})".format(file_path))
|
||||
console.warning("Invalid path in get_file ajax call ({})".format(file_path))
|
||||
@ -127,8 +126,8 @@ class AjaxHandler(BaseHandler):
|
||||
if not self.check_server_id(server_id, 'get_tree'): return
|
||||
else: server_id = bleach.clean(server_id)
|
||||
|
||||
self.write(db_helper.get_server_data_by_id(server_id)['path'] + '\n' +
|
||||
helper.generate_tree(db_helper.get_server_data_by_id(server_id)['path']))
|
||||
self.write(self.controller.servers.get_server_data_by_id(server_id)['path'] + '\n' +
|
||||
helper.generate_tree(self.controller.servers.get_server_data_by_id(server_id)['path']))
|
||||
self.finish()
|
||||
|
||||
@tornado.web.authenticated
|
||||
@ -155,7 +154,7 @@ class AjaxHandler(BaseHandler):
|
||||
if srv_obj.check_running():
|
||||
srv_obj.send_command(command)
|
||||
|
||||
db_helper.add_to_audit_log(user_data['user_id'], "Sent command to {} terminal: {}".format(db_helper.get_server_friendly_name(server_id), command), server_id, self.get_remote_ip())
|
||||
self.controller.management.add_to_audit_log(user_data['user_id'], "Sent command to {} terminal: {}".format(self.controller.servers.get_server_friendly_name(server_id), command), server_id, self.get_remote_ip())
|
||||
|
||||
elif page == "create_file":
|
||||
file_parent = self.get_body_argument('file_parent', default=None, strip=True)
|
||||
@ -166,7 +165,7 @@ class AjaxHandler(BaseHandler):
|
||||
if not self.check_server_id(server_id, 'create_file'): return
|
||||
else: server_id = bleach.clean(server_id)
|
||||
|
||||
if not helper.in_path(db_helper.get_server_data_by_id(server_id)['path'], file_path) \
|
||||
if not helper.in_path(self.controller.servers.get_server_data_by_id(server_id)['path'], file_path) \
|
||||
or helper.check_file_exists(os.path.abspath(file_path)):
|
||||
logger.warning("Invalid path in create_file ajax call ({})".format(file_path))
|
||||
console.warning("Invalid path in create_file ajax call ({})".format(file_path))
|
||||
@ -185,7 +184,7 @@ class AjaxHandler(BaseHandler):
|
||||
if not self.check_server_id(server_id, 'create_dir'): return
|
||||
else: server_id = bleach.clean(server_id)
|
||||
|
||||
if not helper.in_path(db_helper.get_server_data_by_id(server_id)['path'], dir_path) \
|
||||
if not helper.in_path(self.controller.servers.get_server_data_by_id(server_id)['path'], dir_path) \
|
||||
or helper.check_path_exists(os.path.abspath(dir_path)):
|
||||
logger.warning("Invalid path in create_dir ajax call ({})".format(dir_path))
|
||||
console.warning("Invalid path in create_dir ajax call ({})".format(dir_path))
|
||||
@ -220,7 +219,7 @@ class AjaxHandler(BaseHandler):
|
||||
if not self.check_server_id(server_id, 'del_file'): return
|
||||
else: server_id = bleach.clean(server_id)
|
||||
|
||||
server_info = db_helper.get_server_data_by_id(server_id)
|
||||
server_info = self.controller.servers.get_server_data_by_id(server_id)
|
||||
if not (helper.in_path(server_info['path'], file_path) \
|
||||
or helper.in_path(server_info['backup_path'], file_path)) \
|
||||
or not helper.check_file_exists(os.path.abspath(file_path)):
|
||||
@ -240,7 +239,7 @@ class AjaxHandler(BaseHandler):
|
||||
if not self.check_server_id(server_id, 'del_dir'): return
|
||||
else: server_id = bleach.clean(server_id)
|
||||
|
||||
server_info = db_helper.get_server_data_by_id(server_id)
|
||||
server_info = self.controller.servers.get_server_data_by_id(server_id)
|
||||
if not helper.in_path(server_info['path'], dir_path) \
|
||||
or not helper.check_path_exists(os.path.abspath(dir_path)):
|
||||
logger.warning("Invalid path in del_file ajax call ({})".format(dir_path))
|
||||
@ -254,13 +253,13 @@ class AjaxHandler(BaseHandler):
|
||||
elif page == "delete_server":
|
||||
server_id = self.get_argument('id', None)
|
||||
logger.info(
|
||||
"Removing server from panel for server: {}".format(db_helper.get_server_friendly_name(server_id)))
|
||||
"Removing server from panel for server: {}".format(self.controller.servers.get_server_friendly_name(server_id)))
|
||||
self.controller.remove_server(server_id, False)
|
||||
|
||||
elif page == "delete_server_files":
|
||||
server_id = self.get_argument('id', None)
|
||||
logger.info(
|
||||
"Removing server and all associated files for server: {}".format(db_helper.get_server_friendly_name(server_id)))
|
||||
"Removing server and all associated files for server: {}".format(self.controller.servers.get_server_friendly_name(server_id)))
|
||||
self.controller.remove_server(server_id, True)
|
||||
|
||||
@tornado.web.authenticated
|
||||
@ -273,7 +272,7 @@ class AjaxHandler(BaseHandler):
|
||||
if not self.check_server_id(server_id, 'save_file'): return
|
||||
else: server_id = bleach.clean(server_id)
|
||||
|
||||
if not helper.in_path(db_helper.get_server_data_by_id(server_id)['path'], file_path)\
|
||||
if not helper.in_path(self.controller.servers.get_server_data_by_id(server_id)['path'], file_path)\
|
||||
or not helper.check_file_exists(os.path.abspath(file_path)):
|
||||
logger.warning("Invalid path in save_file ajax call ({})".format(file_path))
|
||||
console.warning("Invalid path in save_file ajax call ({})".format(file_path))
|
||||
@ -296,7 +295,7 @@ class AjaxHandler(BaseHandler):
|
||||
console.warning("Invalid path(s) in rename_item ajax call")
|
||||
return
|
||||
|
||||
if not helper.in_path(db_helper.get_server_data_by_id(server_id)['path'], item_path) \
|
||||
if not helper.in_path(self.controller.servers.get_server_data_by_id(server_id)['path'], item_path) \
|
||||
or not helper.check_path_exists(os.path.abspath(item_path)):
|
||||
logger.warning("Invalid old name path in rename_item ajax call ({})".format(server_id))
|
||||
console.warning("Invalid old name path in rename_item ajax call ({})".format(server_id))
|
||||
@ -304,7 +303,7 @@ class AjaxHandler(BaseHandler):
|
||||
|
||||
new_item_path = os.path.join(os.path.split(item_path)[0], new_item_name)
|
||||
|
||||
if not helper.in_path(db_helper.get_server_data_by_id(server_id)['path'], new_item_path) \
|
||||
if not helper.in_path(self.controller.servers.get_server_data_by_id(server_id)['path'], new_item_path) \
|
||||
or helper.check_path_exists(os.path.abspath(new_item_path)):
|
||||
logger.warning("Invalid new name path in rename_item ajax call ({})".format(server_id))
|
||||
console.warning("Invalid new name path in rename_item ajax call ({})".format(server_id))
|
||||
@ -321,7 +320,7 @@ class AjaxHandler(BaseHandler):
|
||||
server_id = bleach.clean(server_id)
|
||||
|
||||
# does this server id exist?
|
||||
if not db_helper.server_id_exists(server_id):
|
||||
if not self.controller.servers.server_id_exists(server_id):
|
||||
logger.warning("Server ID not found in {} ajax call ({})".format(page_name, server_id))
|
||||
console.warning("Server ID not found in {} ajax call ({})".format(page_name, server_id))
|
||||
return
|
||||
|
@ -6,7 +6,6 @@ import tornado.escape
|
||||
import logging
|
||||
|
||||
from app.classes.web.base_handler import BaseHandler
|
||||
from app.classes.shared.models import db_shortcuts
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@ -30,7 +29,7 @@ class ApiHandler(BaseHandler):
|
||||
try:
|
||||
log.debug("Searching for specified token")
|
||||
# TODO: YEET THIS
|
||||
user_data = db_shortcuts.get_user_by_api_token(self.get_argument('token'))
|
||||
user_data = self.controller.users.get_user_by_api_token(self.get_argument('token'))
|
||||
log.debug("Checking results")
|
||||
if user_data:
|
||||
# Login successful! Check perms
|
||||
|
@ -7,6 +7,8 @@ from typing import (
|
||||
Optional
|
||||
)
|
||||
|
||||
from app.classes.shared.main_controller import Controller
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@ -15,7 +17,7 @@ class BaseHandler(tornado.web.RequestHandler):
|
||||
nobleach = {bool, type(None)}
|
||||
redactables = ("pass", "api")
|
||||
|
||||
def initialize(self, controller=None, tasks_manager=None, translator=None):
|
||||
def initialize(self, controller : Controller = None, tasks_manager=None, translator=None):
|
||||
self.controller = controller
|
||||
self.tasks_manager = tasks_manager
|
||||
self.translator = translator
|
||||
|
@ -8,7 +8,7 @@ import requests
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.web.base_handler import BaseHandler
|
||||
from app.classes.shared.console import console
|
||||
from app.classes.shared.models import Users, fn, db_helper
|
||||
from app.classes.shared.main_models import Users, fn
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -8,7 +8,7 @@ import requests
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.web.base_handler import BaseHandler
|
||||
from app.classes.shared.console import console
|
||||
from app.classes.shared.models import Users, fn, db_helper
|
||||
from app.classes.shared.main_models import Users, fn
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
from app.classes.shared.translation import Translation
|
||||
import json
|
||||
import logging
|
||||
import tornado.web
|
||||
@ -10,9 +11,14 @@ import os
|
||||
from tornado import iostream
|
||||
|
||||
from app.classes.shared.console import console
|
||||
from app.classes.shared.models import Users, installer
|
||||
from app.classes.shared.main_models import Users, installer
|
||||
|
||||
from app.classes.web.base_handler import BaseHandler
|
||||
from app.classes.shared.models import db_helper, server_permissions, Servers, Enum_Permissions_Server, crafty_permissions, Enum_Permissions_Crafty, Server_Stats
|
||||
|
||||
from app.classes.models.servers import Servers
|
||||
from app.classes.models.server_permissions import Enum_Permissions_Server
|
||||
from app.classes.models.crafty_permissions import Enum_Permissions_Crafty
|
||||
|
||||
from app.classes.shared.helpers import helper
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@ -31,20 +37,20 @@ class PanelHandler(BaseHandler):
|
||||
|
||||
exec_user_data = json.loads(self.get_secure_cookie("user_data"))
|
||||
exec_user_id = exec_user_data['user_id']
|
||||
exec_user = db_helper.get_user(exec_user_id)
|
||||
|
||||
exec_user = self.controller.users.get_user_by_id(exec_user_id)
|
||||
|
||||
exec_user_role = set()
|
||||
if exec_user['superuser'] == 1:
|
||||
defined_servers = self.controller.list_defined_servers()
|
||||
exec_user_role.add("Super User")
|
||||
exec_user_crafty_permissions = self.controller.list_defined_crafty_permissions()
|
||||
exec_user_crafty_permissions = self.controller.crafty_perms.list_defined_crafty_permissions()
|
||||
else:
|
||||
exec_user_crafty_permissions = self.controller.get_crafty_permissions(exec_user_id)
|
||||
exec_user_crafty_permissions = self.controller.crafty_perms.get_crafty_permissions_list(exec_user_id)
|
||||
logger.debug(exec_user['roles'])
|
||||
for r in exec_user['roles']:
|
||||
role = db_helper.get_role(r)
|
||||
role = self.controller.roles.get_role(r)
|
||||
exec_user_role.add(role['role_name'])
|
||||
defined_servers = self.controller.list_authorized_servers(exec_user_id)
|
||||
defined_servers = self.controller.servers.get_authorized_servers(exec_user_id)
|
||||
|
||||
page_data = {
|
||||
# todo: make this actually pull and compare version data
|
||||
@ -64,23 +70,14 @@ class PanelHandler(BaseHandler):
|
||||
'stopped': (len(self.controller.list_defined_servers()) - len(self.controller.list_running_servers()))
|
||||
},
|
||||
'menu_servers': defined_servers,
|
||||
'hosts_data': db_helper.get_latest_hosts_stats(),
|
||||
'hosts_data': self.controller.management.get_latest_hosts_stats(),
|
||||
'show_contribute': helper.get_setting("show_contribute_link", True),
|
||||
'error': error,
|
||||
'time': formatted_time
|
||||
}
|
||||
page_data['lang'] = self.controller.users.get_user_lang_by_id(exec_user_id)
|
||||
page_data['super_user'] = exec_user['superuser']
|
||||
|
||||
# if no servers defined, let's go to the build server area
|
||||
if page_data['server_stats']['total'] == 0 and page != "error" and page != "credits" and page != "contribute":
|
||||
|
||||
if Enum_Permissions_Crafty.Server_Creation not in exec_user_crafty_permissions and len(defined_servers) == 0:
|
||||
logger.warning("User '" + exec_user['username'] + "#" + str(exec_user_id) + "' has access to 0 servers and is not a server creator")
|
||||
else:
|
||||
self.set_status(301)
|
||||
self.redirect("/server/step1")
|
||||
return
|
||||
|
||||
if page == 'unauthorized':
|
||||
template = "panel/denied.html"
|
||||
|
||||
@ -111,7 +108,7 @@ class PanelHandler(BaseHandler):
|
||||
server_data = self.controller.get_server_data(server_id)
|
||||
server_name = server_data['server_name']
|
||||
|
||||
db_helper.add_to_audit_log(exec_user_data['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user_data['user_id'],
|
||||
"Deleted server {} named {}".format(server_id, server_name),
|
||||
server_id,
|
||||
self.get_remote_ip())
|
||||
@ -122,27 +119,33 @@ class PanelHandler(BaseHandler):
|
||||
|
||||
elif page == 'dashboard':
|
||||
if exec_user['superuser'] == 1:
|
||||
page_data['servers'] = db_helper.get_all_servers_stats()
|
||||
page_data['servers'] = self.controller.servers.get_all_servers_stats()
|
||||
for data in page_data['servers']:
|
||||
try:
|
||||
data['stats']['waiting_start'] = db_helper.get_waiting_start(int(data['stats']['server_id']['server_id']))
|
||||
data['stats']['waiting_start'] = self.controller.servers.get_waiting_start(int(data['stats']['server_id']['server_id']))
|
||||
except:
|
||||
data['stats']['waiting_start'] = False
|
||||
else:
|
||||
user_auth = db_helper.get_authorized_servers_stats(exec_user_id)
|
||||
user_auth = self.controller.servers.get_authorized_servers_stats(exec_user_id)
|
||||
logger.debug("ASFR: {}".format(user_auth))
|
||||
page_data['servers'] = user_auth
|
||||
page_data['server_stats']['running'] = 0
|
||||
page_data['server_stats']['stopped'] = 0
|
||||
for data in page_data['servers']:
|
||||
if data['stats']['running']:
|
||||
page_data['server_stats']['running'] += 1
|
||||
else:
|
||||
page_data['server_stats']['stopped'] += 1
|
||||
try:
|
||||
data['stats']['waiting_start'] = db_helper.get_waiting_start(int(data['stats']['server_id']['server_id']))
|
||||
page_data['stats']['waiting_start'] = self.controller.servers.get_waiting_start(int(data['stats']['server_id']['server_id']))
|
||||
except:
|
||||
data['stats']['waiting_start'] = False
|
||||
|
||||
|
||||
total_players = 0
|
||||
for server in db_helper.get_all_defined_servers():
|
||||
total_players += len(self.controller.stats.get_server_players(server['server_id']))
|
||||
for server in page_data['servers']:
|
||||
total_players += len(self.controller.stats.get_server_players(server['server_data']['server_id']))
|
||||
page_data['num_players'] = total_players
|
||||
|
||||
|
||||
for s in page_data['servers']:
|
||||
try:
|
||||
data = json.loads(s['int_ping_results'])
|
||||
@ -161,13 +164,13 @@ class PanelHandler(BaseHandler):
|
||||
return
|
||||
else:
|
||||
# does this server id exist?
|
||||
if not db_helper.server_id_exists(server_id):
|
||||
if not self.controller.servers.server_id_exists(server_id):
|
||||
self.redirect("/panel/error?error=Invalid Server ID")
|
||||
return
|
||||
|
||||
if exec_user['superuser'] != 1:
|
||||
if not db_helper.server_id_authorized(server_id, exec_user_id):
|
||||
if not db_helper.server_id_authorized(int(server_id), exec_user_id):
|
||||
if not self.controller.servers.server_id_authorized(server_id, exec_user_id):
|
||||
if not self.controller.servers.server_id_authorized(int(server_id), exec_user_id):
|
||||
self.redirect("/panel/error?error=Invalid Server ID")
|
||||
return False
|
||||
|
||||
@ -180,10 +183,10 @@ class PanelHandler(BaseHandler):
|
||||
|
||||
server = self.controller.get_server_obj(server_id)
|
||||
# server_data isn't needed since the server_stats also pulls server data
|
||||
page_data['server_data'] = db_helper.get_server_data_by_id(server_id)
|
||||
page_data['server_stats'] = db_helper.get_server_stats_by_id(server_id)
|
||||
page_data['server_data'] = self.controller.servers.get_server_data_by_id(server_id)
|
||||
page_data['server_stats'] = self.controller.servers.get_server_stats_by_id(server_id)
|
||||
try:
|
||||
page_data['waiting_start'] = db_helper.get_waiting_start(server_id)
|
||||
page_data['waiting_start'] = self.controller.servers.get_waiting_start(server_id)
|
||||
except:
|
||||
page_data['waiting_start'] = False
|
||||
page_data['get_players'] = lambda: self.controller.stats.get_server_players(server_id)
|
||||
@ -198,14 +201,14 @@ class PanelHandler(BaseHandler):
|
||||
'Config': Enum_Permissions_Server.Config,
|
||||
'Players': Enum_Permissions_Server.Players,
|
||||
}
|
||||
page_data['user_permissions'] = self.controller.get_server_permissions_foruser(exec_user_id, server_id)
|
||||
page_data['user_permissions'] = self.controller.server_perms.get_server_permissions_foruser(exec_user_id, server_id)
|
||||
|
||||
if subpage == "backup":
|
||||
page_data['backup_config'] = db_helper.get_backup_config(server_id)
|
||||
page_data['backup_config'] = self.controller.management.get_backup_config(server_id)
|
||||
page_data['backup_list'] = server.list_backups()
|
||||
|
||||
def get_banned_players_html():
|
||||
banned_players = helper.get_banned_players(server_id, db_helper)
|
||||
banned_players = self.controller.servers.get_banned_players(server_id)
|
||||
if banned_players is None:
|
||||
return """
|
||||
<li class="playerItem banned">
|
||||
@ -221,7 +224,7 @@ class PanelHandler(BaseHandler):
|
||||
<button onclick="send_command_to_server('pardon {}')" type="button" class="btn btn-danger">Unban</button>
|
||||
</li>
|
||||
""".format(player['name'], player['source'], player['reason'], player['name'])
|
||||
|
||||
|
||||
return html
|
||||
if subpage == "admin_controls":
|
||||
page_data['banned_players'] = get_banned_players_html()
|
||||
@ -238,17 +241,17 @@ class PanelHandler(BaseHandler):
|
||||
return
|
||||
else:
|
||||
# does this server id exist?
|
||||
if not db_helper.server_id_exists(server_id):
|
||||
if not self.controller.servers.server_id_exists(server_id):
|
||||
self.redirect("/panel/error?error=Invalid Server ID")
|
||||
return
|
||||
|
||||
if exec_user['superuser'] != 1:
|
||||
#if not db_helper.server_id_authorized(server_id, exec_user_id):
|
||||
if not db_helper.server_id_authorized(int(server_id), exec_user_id):
|
||||
#if not self.controller.servers.server_id_authorized(server_id, exec_user_id):
|
||||
if not self.controller.servers.server_id_authorized(int(server_id), exec_user_id):
|
||||
self.redirect("/panel/error?error=Invalid Server ID")
|
||||
return
|
||||
|
||||
server_info = db_helper.get_server_data_by_id(server_id)
|
||||
server_info = self.controller.servers.get_server_data_by_id(server_id)
|
||||
backup_file = os.path.abspath(os.path.join(server_info["backup_path"], file))
|
||||
if not helper.in_path(server_info["backup_path"], backup_file) \
|
||||
or not os.path.isfile(backup_file):
|
||||
@ -272,9 +275,9 @@ class PanelHandler(BaseHandler):
|
||||
# so break the loop
|
||||
break
|
||||
finally:
|
||||
# deleting the chunk is very important because
|
||||
# if many clients are downloading files at the
|
||||
# same time, the chunks in memory will keep
|
||||
# deleting the chunk is very important because
|
||||
# if many clients are downloading files at the
|
||||
# same time, the chunks in memory will keep
|
||||
# increasing and will eat up the RAM
|
||||
del chunk
|
||||
self.redirect("/panel/server_detail?id={}&subpage=backup".format(server_id))
|
||||
@ -287,13 +290,13 @@ class PanelHandler(BaseHandler):
|
||||
return
|
||||
else:
|
||||
# does this server id exist?
|
||||
if not db_helper.server_id_exists(server_id):
|
||||
if not self.controller.servers.server_id_exists(server_id):
|
||||
self.redirect("/panel/error?error=Invalid Server ID")
|
||||
return
|
||||
|
||||
if exec_user['superuser'] != 1:
|
||||
#if not db_helper.server_id_authorized(server_id, exec_user_id):
|
||||
if not db_helper.server_id_authorized(int(server_id), exec_user_id):
|
||||
#if not self.controller.servers.server_id_authorized(server_id, exec_user_id):
|
||||
if not self.controller.servers.server_id_authorized(int(server_id), exec_user_id):
|
||||
self.redirect("/panel/error?error=Invalid Server ID")
|
||||
return
|
||||
|
||||
@ -305,12 +308,11 @@ class PanelHandler(BaseHandler):
|
||||
auth_role_servers = {}
|
||||
users_list = []
|
||||
role_users = {}
|
||||
roles = db_helper.get_all_roles()
|
||||
role_servers = []
|
||||
roles = self.controller.roles.get_all_roles()
|
||||
user_roles = {}
|
||||
for user in db_helper.get_all_users():
|
||||
user_roles_list = db_helper.get_user_roles_names(user.user_id)
|
||||
user_servers = db_helper.get_authorized_servers(user.user_id)
|
||||
for user in self.controller.users.get_all_users():
|
||||
user_roles_list = self.controller.users.get_user_roles_names(user.user_id)
|
||||
user_servers = self.controller.servers.get_authorized_servers(user.user_id)
|
||||
servers = []
|
||||
for server in user_servers:
|
||||
servers.append(server['server_name'])
|
||||
@ -320,9 +322,9 @@ class PanelHandler(BaseHandler):
|
||||
user_roles.update(data)
|
||||
for role in roles:
|
||||
role_servers = []
|
||||
role = db_helper.get_role(role.role_id)
|
||||
role = self.controller.roles.get_role_with_servers(role.role_id)
|
||||
for serv_id in role['servers']:
|
||||
role_servers.append(db_helper.get_server_data_by_id(serv_id)['server_name'])
|
||||
role_servers.append(self.controller.servers.get_server_data_by_id(serv_id)['server_name'])
|
||||
data = {role['role_id']: role_servers}
|
||||
auth_role_servers.update(data)
|
||||
|
||||
@ -332,11 +334,11 @@ class PanelHandler(BaseHandler):
|
||||
page_data['user-roles'] = user_roles
|
||||
|
||||
if exec_user['superuser'] == 1:
|
||||
page_data['users'] = db_helper.get_all_users()
|
||||
page_data['roles'] = db_helper.get_all_roles()
|
||||
page_data['users'] = self.controller.users.get_all_users()
|
||||
page_data['roles'] = self.controller.roles.get_all_roles()
|
||||
else:
|
||||
page_data['users'] = db_helper.user_query(exec_user['user_id'])
|
||||
page_data['roles'] = db_helper.user_role_query(exec_user['user_id'])
|
||||
page_data['users'] = self.controller.users.user_query(exec_user['user_id'])
|
||||
page_data['roles'] = self.controller.users.user_role_query(exec_user['user_id'])
|
||||
|
||||
for user in page_data['users']:
|
||||
if user.user_id != exec_user['user_id']:
|
||||
@ -361,38 +363,52 @@ class PanelHandler(BaseHandler):
|
||||
self.redirect("/panel/error?error=Unauthorized access: not a user editor")
|
||||
return
|
||||
|
||||
page_data['roles_all'] = db_helper.get_all_roles()
|
||||
page_data['roles_all'] = self.controller.roles.get_all_roles()
|
||||
page_data['servers'] = []
|
||||
page_data['servers_all'] = self.controller.list_defined_servers()
|
||||
page_data['role-servers'] = []
|
||||
page_data['permissions_all'] = self.controller.list_defined_crafty_permissions()
|
||||
page_data['permissions_all'] = self.controller.crafty_perms.list_defined_crafty_permissions()
|
||||
page_data['permissions_list'] = set()
|
||||
page_data['quantity_server'] = self.controller.list_all_crafty_permissions_quantity_limits()
|
||||
page_data['quantity_server'] = self.controller.crafty_perms.list_all_crafty_permissions_quantity_limits()
|
||||
page_data['languages'] = []
|
||||
page_data['languages'].append(self.controller.users.get_user_lang_by_id(exec_user_id))
|
||||
for file in os.listdir(os.path.join(helper.root_dir, 'app', 'translations')):
|
||||
if file.endswith('.json'):
|
||||
if file != str(page_data['languages'][0] + '.json'):
|
||||
page_data['languages'].append(file.split('.')[0])
|
||||
|
||||
template = "panel/panel_edit_user.html"
|
||||
|
||||
elif page == "edit_user":
|
||||
user_id = self.get_argument('id', None)
|
||||
role_servers = db_helper.get_authorized_servers(user_id)
|
||||
role_servers = self.controller.servers.get_authorized_servers(user_id)
|
||||
page_role_servers = []
|
||||
servers = set()
|
||||
for server in role_servers:
|
||||
page_role_servers.append(server['server_id'])
|
||||
page_data['new_user'] = False
|
||||
page_data['user'] = db_helper.get_user(user_id)
|
||||
page_data['user'] = self.controller.users.get_user_by_id(user_id)
|
||||
page_data['servers'] = servers
|
||||
page_data['role-servers'] = page_role_servers
|
||||
page_data['roles_all'] = db_helper.get_all_roles()
|
||||
page_data['roles_all'] = self.controller.roles.get_all_roles()
|
||||
page_data['servers_all'] = self.controller.list_defined_servers()
|
||||
page_data['permissions_all'] = self.controller.list_defined_crafty_permissions()
|
||||
page_data['permissions_list'] = self.controller.get_crafty_permissions(user_id)
|
||||
page_data['quantity_server'] = self.controller.list_crafty_permissions_quantity_limits(user_id)
|
||||
page_data['permissions_all'] = self.controller.crafty_perms.list_defined_crafty_permissions()
|
||||
page_data['permissions_list'] = self.controller.crafty_perms.get_crafty_permissions_list(user_id)
|
||||
page_data['quantity_server'] = self.controller.crafty_perms.list_crafty_permissions_quantity_limits(user_id)
|
||||
page_data['languages'] = []
|
||||
page_data['languages'].append(self.controller.users.get_user_lang_by_id(user_id))
|
||||
for file in os.listdir(os.path.join(helper.root_dir, 'app', 'translations')):
|
||||
if file.endswith('.json'):
|
||||
if file != str(page_data['languages'][0] + '.json'):
|
||||
page_data['languages'].append(file.split('.')[0])
|
||||
|
||||
if user_id is None:
|
||||
self.redirect("/panel/error?error=Invalid User ID")
|
||||
return
|
||||
elif Enum_Permissions_Crafty.User_Config not in exec_user_crafty_permissions:
|
||||
if user_id != exec_user_id:
|
||||
if str(user_id) != str(exec_user_id):
|
||||
print("USER ID ", user_id)
|
||||
print("EXEC ID ", exec_user_id)
|
||||
self.redirect("/panel/error?error=Unauthorized access: not a user editor")
|
||||
return
|
||||
|
||||
@ -416,7 +432,7 @@ class PanelHandler(BaseHandler):
|
||||
return
|
||||
else:
|
||||
# does this user id exist?
|
||||
target_user = db_helper.get_user(user_id)
|
||||
target_user = self.controller.users.get_user_by_id(user_id)
|
||||
if not target_user:
|
||||
self.redirect("/panel/error?error=Invalid User ID")
|
||||
return
|
||||
@ -424,9 +440,9 @@ class PanelHandler(BaseHandler):
|
||||
self.redirect("/panel/error?error=Cannot remove a superuser")
|
||||
return
|
||||
|
||||
db_helper.remove_user(user_id)
|
||||
self.controller.users.remove_user(user_id)
|
||||
|
||||
db_helper.add_to_audit_log(exec_user['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user['user_id'],
|
||||
"Removed user {} (UID:{})".format(target_user['username'], user_id),
|
||||
server_id=0,
|
||||
source_ip=self.get_remote_ip())
|
||||
@ -434,9 +450,9 @@ class PanelHandler(BaseHandler):
|
||||
|
||||
elif page == "add_role":
|
||||
user_roles = {}
|
||||
for user in db_helper.get_all_users():
|
||||
user_roles_list = db_helper.get_user_roles_names(user.user_id)
|
||||
user_servers = db_helper.get_authorized_servers(user.user_id)
|
||||
for user in self.controller.users.get_all_users():
|
||||
user_roles_list = self.controller.users.get_user_roles_names(user.user_id)
|
||||
user_servers = self.controller.servers.get_authorized_servers(user.user_id)
|
||||
data = {user.user_id: user_roles_list}
|
||||
user_roles.update(data)
|
||||
page_data['new_role'] = True
|
||||
@ -447,14 +463,14 @@ class PanelHandler(BaseHandler):
|
||||
page_data['role']['last_update'] = "N/A"
|
||||
page_data['role']['servers'] = set()
|
||||
page_data['user-roles'] = user_roles
|
||||
page_data['users'] = db_helper.get_all_users()
|
||||
page_data['users'] = self.controller.users.get_all_users()
|
||||
|
||||
if Enum_Permissions_Crafty.Roles_Config not in exec_user_crafty_permissions:
|
||||
self.redirect("/panel/error?error=Unauthorized access: not a role editor")
|
||||
return
|
||||
|
||||
page_data['servers_all'] = self.controller.list_defined_servers()
|
||||
page_data['permissions_all'] = self.controller.list_defined_permissions()
|
||||
page_data['permissions_all'] = self.controller.server_perms.list_defined_permissions()
|
||||
page_data['permissions_list'] = set()
|
||||
template = "panel/panel_edit_role.html"
|
||||
|
||||
@ -462,19 +478,19 @@ class PanelHandler(BaseHandler):
|
||||
auth_servers = {}
|
||||
|
||||
user_roles = {}
|
||||
for user in db_helper.get_all_users():
|
||||
user_roles_list = db_helper.get_user_roles_names(user.user_id)
|
||||
user_servers = db_helper.get_authorized_servers(user.user_id)
|
||||
for user in self.controller.users.get_all_users():
|
||||
user_roles_list = self.controller.users.get_user_roles_names(user.user_id)
|
||||
user_servers = self.controller.servers.get_authorized_servers(user.user_id)
|
||||
data = {user.user_id: user_roles_list}
|
||||
user_roles.update(data)
|
||||
page_data['new_role'] = False
|
||||
role_id = self.get_argument('id', None)
|
||||
page_data['role'] = db_helper.get_role(role_id)
|
||||
page_data['role'] = self.controller.roles.get_role_with_servers(role_id)
|
||||
page_data['servers_all'] = self.controller.list_defined_servers()
|
||||
page_data['permissions_all'] = self.controller.list_defined_permissions()
|
||||
page_data['permissions_list'] = self.controller.get_role_permissions(role_id)
|
||||
page_data['permissions_all'] = self.controller.server_perms.list_defined_permissions()
|
||||
page_data['permissions_list'] = self.controller.server_perms.get_role_permissions(role_id)
|
||||
page_data['user-roles'] = user_roles
|
||||
page_data['users'] = db_helper.get_all_users()
|
||||
page_data['users'] = self.controller.users.get_all_users()
|
||||
|
||||
if Enum_Permissions_Crafty.Roles_Config not in exec_user_crafty_permissions:
|
||||
self.redirect("/panel/error?error=Unauthorized access: not a role editor")
|
||||
@ -496,21 +512,21 @@ class PanelHandler(BaseHandler):
|
||||
return
|
||||
else:
|
||||
# does this user id exist?
|
||||
target_role = db_helper.get_role(role_id)
|
||||
target_role = self.controller.roles.get_role(role_id)
|
||||
if not target_role:
|
||||
self.redirect("/panel/error?error=Invalid Role ID")
|
||||
return
|
||||
|
||||
db_helper.remove_role(role_id)
|
||||
self.controller.roles.remove_role(role_id)
|
||||
|
||||
db_helper.add_to_audit_log(exec_user['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user['user_id'],
|
||||
"Removed role {} (RID:{})".format(target_role['role_name'], role_id),
|
||||
server_id=0,
|
||||
source_ip=self.get_remote_ip())
|
||||
self.redirect("/panel/panel_config")
|
||||
|
||||
elif page == "activity_logs":
|
||||
page_data['audit_logs'] = db_helper.get_actity_log()
|
||||
page_data['audit_logs'] = self.controller.management.get_actity_log()
|
||||
|
||||
template = "panel/activity_logs.html"
|
||||
|
||||
@ -524,17 +540,16 @@ class PanelHandler(BaseHandler):
|
||||
return
|
||||
else:
|
||||
# does this server id exist?
|
||||
if not db_helper.server_id_exists(server_id):
|
||||
if not self.controller.servers.server_id_exists(server_id):
|
||||
self.redirect("/panel/error?error=Invalid Server ID")
|
||||
return
|
||||
|
||||
if exec_user['superuser'] != 1:
|
||||
#if not db_helper.server_id_authorized(server_id, exec_user_id):
|
||||
if not db_helper.server_id_authorized(int(server_id), exec_user_id):
|
||||
if not self.controller.servers.server_id_authorized(int(server_id), exec_user_id):
|
||||
self.redirect("/panel/error?error=Invalid Server ID")
|
||||
return
|
||||
|
||||
server_info = db_helper.get_server_data_by_id(server_id)
|
||||
server_info = self.controller.servers.get_server_data_by_id(server_id)
|
||||
|
||||
if not helper.in_path(server_info["path"], file) \
|
||||
or not os.path.isfile(file):
|
||||
@ -558,9 +573,9 @@ class PanelHandler(BaseHandler):
|
||||
# so break the loop
|
||||
break
|
||||
finally:
|
||||
# deleting the chunk is very important because
|
||||
# if many clients are downloading files at the
|
||||
# same time, the chunks in memory will keep
|
||||
# deleting the chunk is very important because
|
||||
# if many clients are downloading files at the
|
||||
# same time, the chunks in memory will keep
|
||||
# increasing and will eat up the RAM
|
||||
del chunk
|
||||
self.redirect("/panel/server_detail?id={}&subpage=files".format(server_id))
|
||||
@ -578,18 +593,18 @@ class PanelHandler(BaseHandler):
|
||||
def post(self, page):
|
||||
exec_user_data = json.loads(self.get_secure_cookie("user_data"))
|
||||
exec_user_id = exec_user_data['user_id']
|
||||
exec_user = db_helper.get_user(exec_user_id)
|
||||
exec_user = self.controller.users.get_user_by_id(exec_user_id)
|
||||
|
||||
exec_user_role = set()
|
||||
if exec_user['superuser'] == 1:
|
||||
defined_servers = self.controller.list_defined_servers()
|
||||
exec_user_role.add("Super User")
|
||||
exec_user_crafty_permissions = self.controller.list_defined_crafty_permissions()
|
||||
exec_user_crafty_permissions = self.controller.crafty_perms.list_defined_crafty_permissions()
|
||||
else:
|
||||
exec_user_crafty_permissions = self.controller.get_crafty_permissions(exec_user_id)
|
||||
defined_servers = self.controller.list_authorized_servers(exec_user_id)
|
||||
exec_user_crafty_permissions = self.controller.crafty_perms.get_crafty_permissions_list(exec_user_id)
|
||||
defined_servers = self.controller.servers.get_authorized_servers(exec_user_id)
|
||||
for r in exec_user['roles']:
|
||||
role = db_helper.get_role(r)
|
||||
role = self.controller.roles.get_role(r)
|
||||
exec_user_role.add(role['role_name'])
|
||||
|
||||
if page == 'server_detail':
|
||||
@ -610,7 +625,7 @@ class PanelHandler(BaseHandler):
|
||||
subpage = self.get_argument('subpage', None)
|
||||
|
||||
if not exec_user['superuser']:
|
||||
if not db_helper.server_id_authorized(server_id, exec_user_id):
|
||||
if not self.controller.servers.server_id_authorized(server_id, exec_user_id):
|
||||
self.redirect("/panel/error?error=Unauthorized access: invalid server id")
|
||||
return
|
||||
elif server_id is None:
|
||||
@ -618,10 +633,11 @@ class PanelHandler(BaseHandler):
|
||||
return
|
||||
else:
|
||||
# does this server id exist?
|
||||
if not db_helper.server_id_exists(server_id):
|
||||
if not self.controller.servers.server_id_exists(server_id):
|
||||
self.redirect("/panel/error?error=Invalid Server ID")
|
||||
return
|
||||
|
||||
#TODO use controller method
|
||||
Servers.update({
|
||||
Servers.server_name: server_name,
|
||||
Servers.path: server_path,
|
||||
@ -640,7 +656,7 @@ class PanelHandler(BaseHandler):
|
||||
|
||||
self.controller.refresh_server_settings(server_id)
|
||||
|
||||
db_helper.add_to_audit_log(exec_user['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user['user_id'],
|
||||
"Edited server {} named {}".format(server_id, server_name),
|
||||
server_id,
|
||||
self.get_remote_ip())
|
||||
@ -665,7 +681,7 @@ class PanelHandler(BaseHandler):
|
||||
return
|
||||
else:
|
||||
# does this server id exist?
|
||||
if not db_helper.server_id_exists(server_id):
|
||||
if not self.controller.servers.server_id_exists(server_id):
|
||||
self.redirect("/panel/error?error=Invalid Server ID")
|
||||
return
|
||||
|
||||
@ -674,14 +690,14 @@ class PanelHandler(BaseHandler):
|
||||
Servers.update({
|
||||
Servers.backup_path: backup_path
|
||||
}).where(Servers.server_id == server_id).execute()
|
||||
db_helper.set_backup_config(server_id, max_backups=max_backups, auto_enabled=False)
|
||||
self.controller.management.set_backup_config(server_id, max_backups=max_backups, auto_enabled=False)
|
||||
else:
|
||||
Servers.update({
|
||||
Servers.backup_path: backup_path
|
||||
}).where(Servers.server_id == server_id).execute()
|
||||
db_helper.set_backup_config(server_id, max_backups=max_backups, auto_enabled=True)
|
||||
self.controller.management.set_backup_config(server_id, max_backups=max_backups, auto_enabled=True)
|
||||
|
||||
db_helper.add_to_audit_log(exec_user['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user['user_id'],
|
||||
"Edited server {}: updated backups".format(server_id),
|
||||
server_id,
|
||||
self.get_remote_ip())
|
||||
@ -695,19 +711,21 @@ class PanelHandler(BaseHandler):
|
||||
password1 = bleach.clean(self.get_argument('password1', None))
|
||||
enabled = int(float(self.get_argument('enabled', '0')))
|
||||
regen_api = int(float(self.get_argument('regen_api', '0')))
|
||||
lang = bleach.clean(self.get_argument('language'), 'en_EN')
|
||||
|
||||
if Enum_Permissions_Crafty.User_Config not in exec_user_crafty_permissions:
|
||||
if user_id != exec_user_id:
|
||||
if str(user_id) != str(exec_user_id):
|
||||
self.redirect("/panel/error?error=Unauthorized access: not a user editor")
|
||||
return
|
||||
|
||||
user_data = {
|
||||
"username": username,
|
||||
"password": password0,
|
||||
"lang": lang,
|
||||
}
|
||||
db_helper.update_user(user_id, user_data=user_data)
|
||||
self.controller.users.update_user(user_id, user_data=user_data)
|
||||
|
||||
db_helper.add_to_audit_log(exec_user['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user['user_id'],
|
||||
"Edited user {} (UID:{}) password".format(username,
|
||||
user_id),
|
||||
server_id=0,
|
||||
@ -722,7 +740,7 @@ class PanelHandler(BaseHandler):
|
||||
return
|
||||
else:
|
||||
# does this user id exist?
|
||||
if not db_helper.user_id_exists(user_id):
|
||||
if not self.controller.users.user_id_exists(user_id):
|
||||
self.redirect("/panel/error?error=Invalid User ID")
|
||||
return
|
||||
|
||||
@ -731,7 +749,7 @@ class PanelHandler(BaseHandler):
|
||||
return
|
||||
|
||||
roles = set()
|
||||
for role in db_helper.get_all_roles():
|
||||
for role in self.controller.roles.get_all_roles():
|
||||
argument = int(float(
|
||||
bleach.clean(
|
||||
self.get_argument('role_{}_membership'.format(role.role_id), '0')
|
||||
@ -742,14 +760,14 @@ class PanelHandler(BaseHandler):
|
||||
|
||||
permissions_mask = "000"
|
||||
server_quantity = {}
|
||||
for permission in self.controller.list_defined_crafty_permissions():
|
||||
for permission in self.controller.crafty_perms.list_defined_crafty_permissions():
|
||||
argument = int(float(
|
||||
bleach.clean(
|
||||
self.get_argument('permission_{}'.format(permission.name), '0')
|
||||
)
|
||||
))
|
||||
if argument:
|
||||
permissions_mask = crafty_permissions.set_permission(permissions_mask, permission, argument)
|
||||
permissions_mask = self.controller.crafty_perms.set_permission(permissions_mask, permission, argument)
|
||||
|
||||
q_argument = int(float(
|
||||
bleach.clean(
|
||||
@ -767,14 +785,15 @@ class PanelHandler(BaseHandler):
|
||||
"enabled": enabled,
|
||||
"regen_api": regen_api,
|
||||
"roles": roles,
|
||||
"lang": lang,
|
||||
}
|
||||
user_crafty_data = {
|
||||
"permissions_mask": permissions_mask,
|
||||
"server_quantity": server_quantity
|
||||
}
|
||||
db_helper.update_user(user_id, user_data=user_data, user_crafty_data=user_crafty_data)
|
||||
self.controller.users.update_user(user_id, user_data=user_data, user_crafty_data=user_crafty_data)
|
||||
|
||||
db_helper.add_to_audit_log(exec_user['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user['user_id'],
|
||||
"Edited user {} (UID:{}) with roles {} and permissions {}".format(username, user_id, roles, permissions_mask),
|
||||
server_id=0,
|
||||
source_ip=self.get_remote_ip())
|
||||
@ -785,7 +804,8 @@ class PanelHandler(BaseHandler):
|
||||
username = bleach.clean(self.get_argument('username', None))
|
||||
password0 = bleach.clean(self.get_argument('password0', None))
|
||||
password1 = bleach.clean(self.get_argument('password1', None))
|
||||
enabled = int(float(self.get_argument('enabled', '0')))
|
||||
enabled = int(float(self.get_argument('enabled', '0'))),
|
||||
lang = bleach.clean(self.get_argument('lang', 'en_EN'))
|
||||
|
||||
if Enum_Permissions_Crafty.User_Config not in exec_user_crafty_permissions:
|
||||
self.redirect("/panel/error?error=Unauthorized access: not a user editor")
|
||||
@ -795,7 +815,7 @@ class PanelHandler(BaseHandler):
|
||||
return
|
||||
else:
|
||||
# does this user id exist?
|
||||
if db_helper.get_user_id_by_name(username) is not None:
|
||||
if self.controller.users.get_id_by_name(username) is not None:
|
||||
self.redirect("/panel/error?error=User exists")
|
||||
return
|
||||
|
||||
@ -804,7 +824,7 @@ class PanelHandler(BaseHandler):
|
||||
return
|
||||
|
||||
roles = set()
|
||||
for role in db_helper.get_all_roles():
|
||||
for role in self.controller.roles.get_all_roles():
|
||||
argument = int(float(
|
||||
bleach.clean(
|
||||
self.get_argument('role_{}_membership'.format(role.role_id), '0')
|
||||
@ -812,18 +832,18 @@ class PanelHandler(BaseHandler):
|
||||
))
|
||||
if argument:
|
||||
roles.add(role.role_id)
|
||||
|
||||
|
||||
permissions_mask = "000"
|
||||
server_quantity = {}
|
||||
for permission in self.controller.list_defined_crafty_permissions():
|
||||
for permission in self.controller.crafty_perms.list_defined_crafty_permissions():
|
||||
argument = int(float(
|
||||
bleach.clean(
|
||||
self.get_argument('permission_{}'.format(permission.name), '0')
|
||||
)
|
||||
))
|
||||
if argument:
|
||||
permissions_mask = crafty_permissions.set_permission(permissions_mask, permission, argument)
|
||||
|
||||
permissions_mask = self.controller.crafty_perms.set_permission(permissions_mask, permission, argument)
|
||||
|
||||
q_argument = int(float(
|
||||
bleach.clean(
|
||||
self.get_argument('quantity_{}'.format(permission.name), '0')
|
||||
@ -834,21 +854,22 @@ class PanelHandler(BaseHandler):
|
||||
else:
|
||||
server_quantity[permission.name] = 0
|
||||
|
||||
user_id = db_helper.add_user(username, password=password0, enabled=enabled)
|
||||
user_id = self.controller.users.add_user(username, password=password0, enabled=enabled)
|
||||
user_data = {
|
||||
"roles": roles,
|
||||
'lang': lang
|
||||
}
|
||||
user_crafty_data = {
|
||||
"permissions_mask": permissions_mask,
|
||||
"server_quantity": server_quantity
|
||||
}
|
||||
db_helper.update_user(user_id, user_data=user_data, user_crafty_data=user_crafty_data)
|
||||
self.controller.users.update_user(user_id, user_data=user_data, user_crafty_data=user_crafty_data)
|
||||
|
||||
db_helper.add_to_audit_log(exec_user['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user['user_id'],
|
||||
"Added user {} (UID:{})".format(username, user_id),
|
||||
server_id=0,
|
||||
source_ip=self.get_remote_ip())
|
||||
db_helper.add_to_audit_log(exec_user['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user['user_id'],
|
||||
"Edited user {} (UID:{}) with roles {}".format(username, user_id, roles),
|
||||
server_id=0,
|
||||
source_ip=self.get_remote_ip())
|
||||
@ -869,7 +890,7 @@ class PanelHandler(BaseHandler):
|
||||
return
|
||||
else:
|
||||
# does this user id exist?
|
||||
if not db_helper.role_id_exists(role_id):
|
||||
if not self.controller.roles.role_id_exists(role_id):
|
||||
self.redirect("/panel/error?error=Invalid Role ID")
|
||||
return
|
||||
|
||||
@ -882,24 +903,24 @@ class PanelHandler(BaseHandler):
|
||||
))
|
||||
if argument:
|
||||
servers.add(server['server_id'])
|
||||
|
||||
|
||||
permissions_mask = "00000000"
|
||||
for permission in self.controller.list_defined_permissions():
|
||||
for permission in self.controller.server_perms.list_defined_permissions():
|
||||
argument = int(float(
|
||||
bleach.clean(
|
||||
self.get_argument('permission_{}'.format(permission.name), '0')
|
||||
)
|
||||
))
|
||||
if argument:
|
||||
permissions_mask = server_permissions.set_permission(permissions_mask, permission, argument)
|
||||
permissions_mask = self.controller.server_perms.set_permission(permissions_mask, permission, argument)
|
||||
|
||||
role_data = {
|
||||
"role_name": role_name,
|
||||
"servers": servers
|
||||
}
|
||||
db_helper.update_role(role_id, role_data=role_data, permissions_mask=permissions_mask)
|
||||
self.controller.roles.update_role(role_id, role_data=role_data, permissions_mask=permissions_mask)
|
||||
|
||||
db_helper.add_to_audit_log(exec_user['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user['user_id'],
|
||||
"Edited role {} (RID:{}) with servers {}".format(role_name, role_id, servers),
|
||||
server_id=0,
|
||||
source_ip=self.get_remote_ip())
|
||||
@ -917,7 +938,7 @@ class PanelHandler(BaseHandler):
|
||||
return
|
||||
else:
|
||||
# does this user id exist?
|
||||
if db_helper.get_roleid_by_name(role_name) is not None:
|
||||
if self.controller.roles.get_roleid_by_name(role_name) is not None:
|
||||
self.redirect("/panel/error?error=Role exists")
|
||||
return
|
||||
|
||||
@ -930,25 +951,25 @@ class PanelHandler(BaseHandler):
|
||||
))
|
||||
if argument:
|
||||
servers.add(server['server_id'])
|
||||
|
||||
|
||||
permissions_mask = "00000000"
|
||||
for permission in self.controller.list_defined_permissions():
|
||||
for permission in self.controller.server_perms.list_defined_permissions():
|
||||
argument = int(float(
|
||||
bleach.clean(
|
||||
self.get_argument('permission_{}'.format(permission.name), '0')
|
||||
)
|
||||
))
|
||||
if argument:
|
||||
permissions_mask = server_permissions.set_permission(permissions_mask, permission, argument)
|
||||
permissions_mask = self.controller.server_perms.set_permission(permissions_mask, permission, argument)
|
||||
|
||||
role_id = db_helper.add_role(role_name)
|
||||
db_helper.update_role(role_id, {"servers": servers}, permissions_mask)
|
||||
role_id = self.controller.roles.add_role(role_name)
|
||||
self.controller.roles.update_role(role_id, {"servers": servers}, permissions_mask)
|
||||
|
||||
db_helper.add_to_audit_log(exec_user['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user['user_id'],
|
||||
"Added role {} (RID:{})".format(role_name, role_id),
|
||||
server_id=0,
|
||||
source_ip=self.get_remote_ip())
|
||||
db_helper.add_to_audit_log(exec_user['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user['user_id'],
|
||||
"Edited role {} (RID:{}) with servers {}".format(role_name, role_id, servers),
|
||||
server_id=0,
|
||||
source_ip=self.get_remote_ip())
|
||||
|
@ -7,7 +7,9 @@ import tornado.escape
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.web.base_handler import BaseHandler
|
||||
from app.classes.shared.console import console
|
||||
from app.classes.shared.models import Users, fn, db_helper
|
||||
from app.classes.shared.main_models import fn
|
||||
|
||||
from app.classes.models.users import Users
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@ -43,6 +45,8 @@ class PublicHandler(BaseHandler):
|
||||
'version': helper.get_version_string(),
|
||||
'error': error
|
||||
}
|
||||
|
||||
page_data['lang'] = tornado.locale.get("en_EN")
|
||||
|
||||
# sensible defaults
|
||||
template = "public/404.html"
|
||||
@ -113,7 +117,7 @@ class PublicHandler(BaseHandler):
|
||||
q.save()
|
||||
|
||||
# log this login
|
||||
db_helper.add_to_audit_log(user_data.user_id, "Logged in", 0, self.get_remote_ip())
|
||||
self.controller.management.add_to_audit_log(user_data.user_id, "Logged in", 0, self.get_remote_ip())
|
||||
|
||||
cookie_data = {
|
||||
"username": user_data.username,
|
||||
@ -129,7 +133,7 @@ class PublicHandler(BaseHandler):
|
||||
self.clear_cookie("user")
|
||||
self.clear_cookie("user_data")
|
||||
# log this failed login attempt
|
||||
db_helper.add_to_audit_log(user_data.user_id, "Tried to log in", 0, self.get_remote_ip())
|
||||
self.controller.management.add_to_audit_log(user_data.user_id, "Tried to log in", 0, self.get_remote_ip())
|
||||
self.redirect('/public/error?error=Login Failed')
|
||||
else:
|
||||
self.redirect("/public/login")
|
||||
|
@ -6,7 +6,7 @@ import shutil
|
||||
|
||||
from app.classes.shared.console import console
|
||||
from app.classes.web.base_handler import BaseHandler
|
||||
from app.classes.shared.models import db_helper, Enum_Permissions_Crafty
|
||||
from app.classes.models.crafty_permissions import Enum_Permissions_Crafty
|
||||
from app.classes.minecraft.serverjars import server_jar_obj
|
||||
from app.classes.shared.helpers import helper
|
||||
|
||||
@ -31,18 +31,18 @@ class ServerHandler(BaseHandler):
|
||||
# name = tornado.escape.json_decode(self.current_user)
|
||||
exec_user_data = json.loads(self.get_secure_cookie("user_data"))
|
||||
exec_user_id = exec_user_data['user_id']
|
||||
exec_user = db_helper.get_user(exec_user_id)
|
||||
|
||||
exec_user = self.controller.users.get_user_by_id(exec_user_id)
|
||||
|
||||
exec_user_role = set()
|
||||
if exec_user['superuser'] == 1:
|
||||
defined_servers = self.controller.list_defined_servers()
|
||||
exec_user_role.add("Super User")
|
||||
exec_user_crafty_permissions = self.controller.list_defined_crafty_permissions()
|
||||
exec_user_crafty_permissions = self.controller.crafty_perms.list_defined_crafty_permissions()
|
||||
else:
|
||||
exec_user_crafty_permissions = self.controller.get_crafty_permissions(exec_user_id)
|
||||
defined_servers = self.controller.list_authorized_servers(exec_user_id)
|
||||
exec_user_crafty_permissions = self.controller.crafty_perms.get_crafty_permissions_list(exec_user_id)
|
||||
defined_servers = self.controller.servers.get_authorized_servers(exec_user_id)
|
||||
for r in exec_user['roles']:
|
||||
role = db_helper.get_role(r)
|
||||
role = self.controller.roles.get_role(r)
|
||||
exec_user_role.add(role['role_name'])
|
||||
|
||||
template = "public/404.html"
|
||||
@ -62,14 +62,14 @@ class ServerHandler(BaseHandler):
|
||||
'running': len(self.controller.list_running_servers()),
|
||||
'stopped': (len(self.controller.list_defined_servers()) - len(self.controller.list_running_servers()))
|
||||
},
|
||||
'hosts_data': db_helper.get_latest_hosts_stats(),
|
||||
'hosts_data': self.controller.management.get_latest_hosts_stats(),
|
||||
'menu_servers': defined_servers,
|
||||
'show_contribute': helper.get_setting("show_contribute_link", True)
|
||||
'show_contribute': helper.get_setting("show_contribute_link", True),
|
||||
'lang': self.controller.users.get_user_lang_by_id(exec_user_id)
|
||||
}
|
||||
|
||||
if page == "step1":
|
||||
|
||||
if not exec_user['superuser'] and not self.controller.can_create_server(exec_user_id):
|
||||
if not exec_user['superuser'] and not self.controller.crafty_perms.can_create_server(exec_user_id):
|
||||
self.redirect("/panel/error?error=Unauthorized access: not a server creator or server limit reached")
|
||||
return
|
||||
|
||||
@ -88,13 +88,14 @@ class ServerHandler(BaseHandler):
|
||||
|
||||
exec_user_data = json.loads(self.get_secure_cookie("user_data"))
|
||||
exec_user_id = exec_user_data['user_id']
|
||||
exec_user = db_helper.get_user(exec_user_id)
|
||||
exec_user = self.controller.users.get_user_by_id(exec_user_id)
|
||||
|
||||
template = "public/404.html"
|
||||
page_data = {
|
||||
'version_data': "version_data_here",
|
||||
'user_data': exec_user_data,
|
||||
'show_contribute': helper.get_setting("show_contribute_link", True)
|
||||
'show_contribute': helper.get_setting("show_contribute_link", True),
|
||||
'lang': self.controller.users.get_user_lang_by_id(exec_user_id)
|
||||
}
|
||||
|
||||
if page == "command":
|
||||
@ -104,12 +105,12 @@ class ServerHandler(BaseHandler):
|
||||
if server_id is not None:
|
||||
if command == "clone_server":
|
||||
def is_name_used(name):
|
||||
for server in db_helper.get_all_defined_servers():
|
||||
for server in self.controller.servers.get_all_defined_servers():
|
||||
if server['server_name'] == name:
|
||||
return True
|
||||
return
|
||||
|
||||
server_data = db_helper.get_server_data_by_id(server_id)
|
||||
|
||||
server_data = self.controller.servers.get_server_data_by_id(server_id)
|
||||
server_uuid = server_data.get('server_uuid')
|
||||
new_server_name = server_data.get('server_name') + " (Copy)"
|
||||
|
||||
@ -136,13 +137,13 @@ class ServerHandler(BaseHandler):
|
||||
crash_detection = server_data.get('crash_detection')
|
||||
server_port = server_data.get('server_port')
|
||||
|
||||
db_helper.create_server(new_server_name, new_server_uuid, new_server_path, "", new_server_command, new_executable, new_server_log_file, stop_command, server_port)
|
||||
self.controller.servers.create_server(new_server_name, new_server_uuid, new_server_path, "", new_server_command, new_executable, new_server_log_file, stop_command, server_port)
|
||||
|
||||
self.controller.init_all_servers()
|
||||
|
||||
return
|
||||
|
||||
db_helper.send_command(exec_user_data['user_id'], server_id, self.get_remote_ip(), command)
|
||||
|
||||
self.controller.management.send_command(exec_user_data['user_id'], server_id, self.get_remote_ip(), command)
|
||||
|
||||
if page == "step1":
|
||||
|
||||
@ -168,7 +169,7 @@ class ServerHandler(BaseHandler):
|
||||
return
|
||||
|
||||
new_server_id = self.controller.import_jar_server(server_name, import_server_path,import_server_jar, min_mem, max_mem, port)
|
||||
db_helper.add_to_audit_log(exec_user_data['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user_data['user_id'],
|
||||
"imported a jar server named \"{}\"".format(server_name), # Example: Admin imported a server named "old creative"
|
||||
new_server_id,
|
||||
self.get_remote_ip())
|
||||
@ -183,7 +184,7 @@ class ServerHandler(BaseHandler):
|
||||
if new_server_id == "false":
|
||||
self.redirect("/panel/error?error=Zip file not accessible! You can fix this permissions issue with sudo chown -R crafty:crafty {} And sudo chmod 2775 -R {}".format(import_server_path, import_server_path))
|
||||
return
|
||||
db_helper.add_to_audit_log(exec_user_data['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user_data['user_id'],
|
||||
"imported a zip server named \"{}\"".format(server_name), # Example: Admin imported a server named "old creative"
|
||||
new_server_id,
|
||||
self.get_remote_ip())
|
||||
@ -193,19 +194,20 @@ class ServerHandler(BaseHandler):
|
||||
return
|
||||
server_type, server_version = server_parts
|
||||
# TODO: add server type check here and call the correct server add functions if not a jar
|
||||
role_ids = db_helper.get_user_roles_id(exec_user_id)
|
||||
role_ids = self.controller.users.get_user_roles_id(exec_user_id)
|
||||
new_server_id = self.controller.create_jar_server(server_type, server_version, server_name, min_mem, max_mem, port)
|
||||
db_helper.add_to_audit_log(exec_user_data['user_id'],
|
||||
self.controller.management.add_to_audit_log(exec_user_data['user_id'],
|
||||
"created a {} {} server named \"{}\"".format(server_version, str(server_type).capitalize(), server_name), # Example: Admin created a 1.16.5 Bukkit server named "survival"
|
||||
new_server_id,
|
||||
self.get_remote_ip())
|
||||
|
||||
#These lines create a new Role for the Server with full permissions and add the user to it
|
||||
role_id = db_helper.add_role("Creator of Server with id={}".format(new_server_id))
|
||||
db_helper.add_role_server(new_server_id, role_id, "11111111")
|
||||
db_helper.add_role_to_user(exec_user_id, role_id)
|
||||
# These lines create a new Role for the Server with full permissions and add the user to it if he's not a superuser
|
||||
if not exec_user['superuser']:
|
||||
db_helper.add_server_creation(exec_user_id)
|
||||
new_server_uuid = self.controller.servers.get_server_data_by_id(new_server_id).get("server_uuid")
|
||||
role_id = self.controller.roles.add_role("Creator of Server with uuid={}".format(new_server_uuid))
|
||||
self.controller.server_perms.add_role_server(new_server_id, role_id, "11111111")
|
||||
self.controller.users.add_role_to_user(exec_user_id, role_id)
|
||||
self.controller.crafty_perms.add_server_creation(exec_user_id)
|
||||
|
||||
self.controller.stats.record_stats()
|
||||
self.redirect("/panel/dashboard")
|
||||
|
@ -9,7 +9,7 @@ import requests
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.web.base_handler import BaseHandler
|
||||
from app.classes.shared.console import console
|
||||
from app.classes.shared.models import Users, fn, db_helper
|
||||
from app.classes.shared.main_models import fn
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@ -25,7 +25,8 @@ except ModuleNotFoundError as e:
|
||||
class StatusHandler(BaseHandler):
|
||||
def get(self):
|
||||
page_data = {}
|
||||
page_data['servers'] = db_helper.get_all_servers_stats()
|
||||
page_data['lang'] = tornado.locale.get("en_EN")
|
||||
page_data['servers'] = self.controller.servers.get_all_servers_stats()
|
||||
for srv in page_data['servers']:
|
||||
server_data = srv.get('server_data', False)
|
||||
server_id = server_data.get('server_id', False)
|
||||
@ -40,7 +41,7 @@ class StatusHandler(BaseHandler):
|
||||
)
|
||||
def post(self):
|
||||
page_data = {}
|
||||
page_data['servers'] = db_helper.get_all_servers_stats()
|
||||
page_data['servers'] = self.controller.servers.get_all_servers_stats()
|
||||
for srv in page_data['servers']:
|
||||
server_data = srv.get('server_data', False)
|
||||
server_id = server_data.get('server_id', False)
|
||||
|
@ -92,17 +92,13 @@ class Webserver:
|
||||
|
||||
http_port = helper.get_setting('http_port')
|
||||
https_port = helper.get_setting('https_port')
|
||||
|
||||
lang = helper.get_setting('language')
|
||||
|
||||
debug_errors = helper.get_setting('show_errors')
|
||||
cookie_secret = helper.get_setting('cookie_secret')
|
||||
|
||||
if cookie_secret is False:
|
||||
cookie_secret = helper.random_string_generator(32)
|
||||
|
||||
if not lang:
|
||||
lang = "en_EN"
|
||||
|
||||
if not http_port:
|
||||
http_port = 8000
|
||||
|
||||
@ -120,7 +116,7 @@ class Webserver:
|
||||
|
||||
tornado.template.Loader('.')
|
||||
|
||||
tornado.locale.set_default_locale(lang)
|
||||
tornado.locale.set_default_locale('en_EN')
|
||||
|
||||
handler_args = {"controller": self.controller, "tasks_manager": self.tasks_manager, "translator": translation}
|
||||
handlers = [
|
||||
@ -132,7 +128,7 @@ class Webserver:
|
||||
(r'/api/stats/servers', ServersStats, handler_args),
|
||||
(r'/api/stats/node', NodeStats, handler_args),
|
||||
(r'/ws', SocketHandler, handler_args),
|
||||
(r'/upload', UploadHandler),
|
||||
(r'/upload', UploadHandler, handler_args),
|
||||
(r'/status', StatusHandler, handler_args)
|
||||
]
|
||||
|
||||
|
@ -1,8 +1,9 @@
|
||||
from app.classes.shared.main_controller import Controller
|
||||
import tornado.options
|
||||
import tornado.web
|
||||
import tornado.httpserver
|
||||
from tornado.options import options
|
||||
from app.classes.shared.models import db_helper, Enum_Permissions_Server
|
||||
from app.classes.models.server_permissions import Enum_Permissions_Server
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.web.websocket_helper import websocket_helper
|
||||
from app.classes.shared.console import console
|
||||
@ -18,6 +19,12 @@ MAX_STREAMED_SIZE = 1024 * 1024 * 1024
|
||||
|
||||
@tornado.web.stream_request_body
|
||||
class UploadHandler(tornado.web.RequestHandler):
|
||||
|
||||
def initialize(self, controller: Controller=None, tasks_manager=None, translator=None):
|
||||
self.controller = controller
|
||||
self.tasks_manager = tasks_manager
|
||||
self.translator = translator
|
||||
|
||||
def prepare(self):
|
||||
self.do_upload = True
|
||||
user_data = json.loads(self.get_secure_cookie('user_data'))
|
||||
@ -29,13 +36,13 @@ class UploadHandler(tornado.web.RequestHandler):
|
||||
logger.warning('User ID not found in upload handler call')
|
||||
console.warning('User ID not found in upload handler call')
|
||||
self.do_upload = False
|
||||
|
||||
|
||||
if server_id is None:
|
||||
logger.warning('Server ID not found in upload handler call')
|
||||
console.warning('Server ID not found in upload handler call')
|
||||
self.do_upload = False
|
||||
|
||||
user_permissions = db_helper.get_user_permissions_list(user_id, server_id)
|
||||
user_permissions = self.controller.server_perms.get_user_permissions_list(user_id, server_id)
|
||||
if Enum_Permissions_Server.Files not in user_permissions:
|
||||
logger.warning(f'User {user_id} tried to upload a file to {server_id} without permissions!')
|
||||
console.warning(f'User {user_id} tried to upload a file to {server_id} without permissions!')
|
||||
@ -45,12 +52,12 @@ class UploadHandler(tornado.web.RequestHandler):
|
||||
filename = self.request.headers.get('X-FileName', None)
|
||||
full_path = os.path.join(path, filename)
|
||||
|
||||
if not helper.in_path(db_helper.get_server_data_by_id(server_id)['path'], full_path):
|
||||
print(user_id, server_id, db_helper.get_server_data_by_id(server_id)['path'], full_path)
|
||||
if not helper.in_path(self.controller.servers.get_server_data_by_id(server_id)['path'], full_path):
|
||||
print(user_id, server_id, self.controller.servers.get_server_data_by_id(server_id)['path'], full_path)
|
||||
logger.warning(f'User {user_id} tried to upload a file to {server_id} but the path is not inside of the server!')
|
||||
console.warning(f'User {user_id} tried to upload a file to {server_id} but the path is not inside of the server!')
|
||||
self.do_upload = False
|
||||
|
||||
|
||||
if self.do_upload:
|
||||
try:
|
||||
self.f = open(full_path, "wb")
|
||||
@ -63,7 +70,7 @@ class UploadHandler(tornado.web.RequestHandler):
|
||||
def post(self):
|
||||
logger.info("Upload completed")
|
||||
files_left = int(self.request.headers.get('X-Files-Left', None))
|
||||
|
||||
|
||||
if self.do_upload:
|
||||
time.sleep(5)
|
||||
if files_left == 0:
|
||||
|
@ -3,7 +3,7 @@ import logging
|
||||
import asyncio
|
||||
|
||||
from urllib.parse import parse_qsl
|
||||
from app.classes.shared.models import Users, db_helper
|
||||
from app.classes.models.users import Users
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.web.websocket_helper import websocket_helper
|
||||
|
||||
@ -50,7 +50,7 @@ class SocketHandler(tornado.websocket.WebSocketHandler):
|
||||
else:
|
||||
websocket_helper.send_message(self, 'notification', 'Not authenticated for WebSocket connection')
|
||||
self.close()
|
||||
db_helper.add_to_audit_log_raw('unknown', 0, 0, 'Someone tried to connect via WebSocket without proper authentication', self.get_remote_ip())
|
||||
self.controller.management.add_to_audit_log_raw('unknown', 0, 0, 'Someone tried to connect via WebSocket without proper authentication', self.get_remote_ip())
|
||||
websocket_helper.broadcast('notification', 'Someone tried to connect via WebSocket without proper authentication')
|
||||
logger.warning('Someone tried to connect via WebSocket without proper authentication')
|
||||
|
||||
|
@ -2,5 +2,5 @@
|
||||
"major": 4,
|
||||
"minor": 0,
|
||||
"sub": 0,
|
||||
"meta": "alpha.2"
|
||||
"meta": "alpha.3"
|
||||
}
|
||||
|
@ -60,7 +60,7 @@
|
||||
|
||||
<div class="warnings">
|
||||
<noscript class="noscript-warning" style="padding: 20px; background-color: rgb(247, 151, 15);">
|
||||
<div>{% raw translate('base', 'doesNotWorkWithoutJavascript') %}</div>
|
||||
<div>{% raw translate('base', 'doesNotWorkWithoutJavascript', data['lang']) %}</div>
|
||||
</noscript>
|
||||
</div>
|
||||
|
||||
@ -134,12 +134,12 @@
|
||||
<script src="/static/assets/js/shared/hoverable-collapse.js"></script>
|
||||
<script src="/static/assets/js/shared/misc.js"></script>
|
||||
<script type="text/javascript" src="https://cdn.datatables.net/v/bs4/dt-1.10.22/fh-3.1.7/r-2.2.6/sc-2.0.3/sp-1.2.2/datatables.min.js"></script>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/bootbox.js/5.4.0/bootbox.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootbox.js/5.4.0/bootbox.min.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
$.extend($.fn.dataTable.defaults, {
|
||||
language: {% raw translate('datatables', 'i18n') %}
|
||||
language: {% raw translate('datatables', 'i18n', data['lang']) %}
|
||||
})
|
||||
|
||||
//used to get cookies from browser - this is part of tornados xsrf protection - it's for extra security
|
||||
|
@ -2,8 +2,8 @@
|
||||
<footer class="footer">
|
||||
<div class="container-fluid ">
|
||||
|
||||
<span class="text-muted d-block text-center text-sm-left d-sm-inline-block">{{ translate('footer', 'copyright') }} © 2021 <a href="http://www.craftycontrol.com/" target="_blank">Crafty Controller</a>. {{ translate('footer', 'allRightsReserved') }}.</span>
|
||||
<span class="float-none float-sm-right d-block mt-1 mt-sm-0 text-center">{{ translate('footer', 'version') }}: {{ data['version_data'] }}
|
||||
<span class="text-muted d-block text-center text-sm-left d-sm-inline-block">{{ translate('footer', 'copyright', data['lang']) }} © 2021 <a href="http://www.craftycontrol.com/" target="_blank">Crafty Controller</a>. {{ translate('footer', 'allRightsReserved', data['lang']) }}.</span>
|
||||
<span class="float-none float-sm-right d-block mt-1 mt-sm-0 text-center">{{ translate('footer', 'version', data['lang']) }}: {{ data['version_data'] }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
|
@ -4,26 +4,26 @@
|
||||
<nav class="sidebar sidebar-offcanvas" id="sidebar">
|
||||
<ul class="nav">
|
||||
|
||||
<li class="nav-item nav-category" style="margin-top:10px;">{{ translate('sidebar', 'navigation') }}</li>
|
||||
<li class="nav-item nav-category" style="margin-top:10px;">{{ translate('sidebar', 'navigation', data['lang']) }}</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/panel/dashboard">
|
||||
<i class="fas fa-chart-network"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'dashboard') }}</span>
|
||||
<span class="menu-title">{{ translate('sidebar', 'dashboard', data['lang']) }}</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" data-toggle="collapse" href="#page-layouts" aria-expanded="false" aria-controls="page-layouts">
|
||||
<i class="fas fa-server"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'servers') }}</span>
|
||||
<span class="menu-title">{{ translate('sidebar', 'servers', data['lang']) }}</span>
|
||||
<i class="menu-arrow"></i>
|
||||
</a>
|
||||
<div class="collapse" id="page-layouts">
|
||||
<ul class="nav flex-column sub-menu">
|
||||
{% if data['crafty_permissions']['Server_Creation'] in data['user_crafty_permissions'] %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/server/step1"><i class="fas fa-plus-circle"></i> {{ translate('sidebar', 'newServer') }}</a>
|
||||
<a class="nav-link" href="/server/step1"><i class="fas fa-plus-circle"></i> {{ translate('sidebar', 'newServer', data['lang']) }}</a>
|
||||
</li>
|
||||
{% end %}
|
||||
{% for s in data['menu_servers'] %}
|
||||
@ -39,7 +39,7 @@
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="https://gitlab.com/crafty-controller/crafty-web/-/wikis/home" target="_blank">
|
||||
<i class="fas fa-book"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'documentation') }}</span>
|
||||
<span class="menu-title">{{ translate('sidebar', 'documentation', data['lang']) }}</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
@ -53,7 +53,7 @@
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/panel/credits">
|
||||
<i class="fas fa-heart"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'credits') }}</span>
|
||||
<span class="menu-title">{{ translate('sidebar', 'credits', data['lang']) }}</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
@ -61,7 +61,7 @@
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/panel/contribute">
|
||||
<i class="fas fa-donate"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'contribute') }}</span>
|
||||
<span class="menu-title">{{ translate('sidebar', 'contribute', data['lang']) }}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% end %}
|
||||
|
@ -4,7 +4,7 @@
|
||||
<meta http-equiv="refresh" content="60">
|
||||
{% end %}
|
||||
|
||||
{% block title %}Crafty Controller - {{ translate('dashboard', 'dashboard') }}{% end %}
|
||||
{% block title %}Crafty Controller - {{ translate('dashboard', 'dashboard', data['lang']) }}{% end %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
<div class="row page-title-header">
|
||||
<div class="col-12">
|
||||
<div class="page-header">
|
||||
<h4 class="page-title">{{ translate('dashboard', 'dashboard') }}</h4>
|
||||
<h4 class="page-title">{{ translate('dashboard', 'dashboard', data['lang']) }}</h4>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -26,59 +26,46 @@
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-lg-3 col-md-6">
|
||||
<div class="col-lg-4 col-md-6">
|
||||
<div class="d-flex">
|
||||
<div class="wrapper">
|
||||
<h5 class="mb-1 font-weight-medium text-primary"> {{ translate('dashboard', 'host') }}</h5>
|
||||
<h5 class="mb-1 font-weight-medium text-primary"> {{ translate('dashboard', 'host', data['lang']) }}</h5>
|
||||
<h3 class="mb-0 font-weight-semibold"> <i class="fas fa-chart-line"></i></h3>
|
||||
|
||||
</div>
|
||||
<div class="wrapper my-auto ml-auto ml-lg-4">
|
||||
<p id="cpu_data" class="mb-0 text-success" data-toggle="tooltip" data-placement="top" data-html="true" title="{% raw translate('dashboard', 'cpuCores') %}: {{ data.get('hosts_data').get('cpu_cores') }} <br /> {% raw translate('dashboard', 'cpuCurFreq') %}: {{ data.get('hosts_data').get('cpu_cur_freq') }} <br /> {% raw translate('dashboard', 'cpuMaxFreq') %}: {{ data.get('hosts_data').get('cpu_max_freq') }}" >
|
||||
{{ translate('dashboard', 'cpuUsage') }}: <span id="cpu_usage">{{ data.get('hosts_data').get('cpu_usage') }}</span>
|
||||
<p id="cpu_data" class="mb-0 text-success" data-toggle="tooltip" data-placement="top" data-html="true" title="{% raw translate('dashboard', 'cpuCores', data['lang']) %}: {{ data.get('hosts_data').get('cpu_cores') }} <br /> {% raw translate('dashboard', 'cpuCurFreq', data['lang']) %}: {{ data.get('hosts_data').get('cpu_cur_freq') }} <br /> {% raw translate('dashboard', 'cpuMaxFreq', data['lang']) %}: {{ data.get('hosts_data').get('cpu_max_freq') }}" >
|
||||
{{ translate('dashboard', 'cpuUsage', data['lang']) }}: <span id="cpu_usage">{{ data.get('hosts_data').get('cpu_usage') }}</span>
|
||||
</p>
|
||||
<p id="mem_usage" class="mb-0 text-danger" data-toggle="tooltip" data-placement="top" title="{{ translate('dashboard', 'memUsage') }}: {{ data.get('hosts_data').get('mem_usage') }}" >
|
||||
{{ translate('dashboard', 'memUsage') }}: <span id="mem_percent">{{ data.get('hosts_data').get('mem_percent') }}%</span>
|
||||
<p id="mem_usage" class="mb-0 text-danger" data-toggle="tooltip" data-placement="top" title="{{ translate('dashboard', 'memUsage', data['lang']) }}: {{ data.get('hosts_data').get('mem_usage') }}" >
|
||||
{{ translate('dashboard', 'memUsage', data['lang']) }}: <span id="mem_percent">{{ data.get('hosts_data').get('mem_percent') }}%</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-md-6 mt-md-0 mt-4">
|
||||
<div class="col-lg-4 col-md-6 mt-md-0 mt-4">
|
||||
<div class="d-flex">
|
||||
<div class="wrapper">
|
||||
<h5 class="mb-1 font-weight-medium text-primary">{{ translate('dashboard', 'servers') }}</h5>
|
||||
<h5 class="mb-1 font-weight-medium text-primary">{{ translate('dashboard', 'servers', data['lang']) }}</h5>
|
||||
<h3 class="mb-0 font-weight-semibold">{{ data['server_stats']['total'] }}</h3>
|
||||
|
||||
</div>
|
||||
<div class="wrapper my-auto ml-auto ml-lg-4">
|
||||
<p class="mb-0 text-success">{{ data['server_stats']['running'] }} {{ translate('dashboard', 'online').lower() }}</p>
|
||||
<p class="mb-0 text-warning"> {{ data['server_stats']['stopped'] }} {{ translate('dashboard', 'offline').lower() }}</p>
|
||||
<p class="mb-0 text-success">{{ data['server_stats']['running'] }} {{ translate('dashboard', 'online', data['lang']).lower() }}</p>
|
||||
<p class="mb-0 text-warning"> {{ data['server_stats']['stopped'] }} {{ translate('dashboard', 'offline', data['lang']).lower() }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-md-6 mt-md-0 mt-4">
|
||||
<div class="col-lg-4 col-md-6 mt-md-0 mt-4">
|
||||
<div class="d-flex">
|
||||
<div class="wrapper">
|
||||
<h5 class="mb-1 font-weight-medium text-primary">{{ translate('dashboard', 'players') }}</h5>
|
||||
<h5 class="mb-1 font-weight-medium text-primary">{{ translate('dashboard', 'players', data['lang']) }}</h5>
|
||||
<h3 class="mb-0 font-weight-semibold">{{ data['num_players'] }}</h3>
|
||||
|
||||
</div>
|
||||
<div class="wrapper my-auto ml-auto ml-lg-4">
|
||||
<p class="mb-0 text-success">35 {{ translate('dashboard', 'max') }}</p>
|
||||
<p class="mb-0 text-warning">10 {{ translate('dashboard', 'avg') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-md-6 mt-md-0 mt-4">
|
||||
<div class="d-flex">
|
||||
<div class="wrapper">
|
||||
|
||||
<h5 class="mb-1 font-weight-medium text-primary">{{ translate('dashboard', 'backups') }}</h5>
|
||||
<h3 class="mb-0 font-weight-semibold">7</h3>
|
||||
</div>
|
||||
<div class="wrapper my-auto ml-auto ml-lg-4">
|
||||
<p class="mb-0 text-success">{{ translate('dashboard', 'lastBackup') }} 11-31-2020</p>
|
||||
<p class="mb-0 text-success">{{ translate('dashboard', 'nextBackup') }} 12-05-2020</p>
|
||||
<p class="mb-0 text-success">35 {{ translate('dashboard', 'max', data['lang']) }}</p>
|
||||
<p class="mb-0 text-warning">10 {{ translate('dashboard', 'avg', data['lang']) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -92,25 +79,34 @@
|
||||
<div class="col-md-12 col-lg-12 grid-margin stretch-card">
|
||||
<div class="card">
|
||||
<div class="card-header header-sm d-flex justify-content-between align-items-center">
|
||||
<h4 class="card-title"><i class="fas fa-server"></i> {{ translate('dashboard', 'allServers') }}</h4>
|
||||
<div class="d-md-none">
|
||||
<small>{{ translate('dashboard', 'cannotSeeOnMobile') }}<br /> {{ translate('dashboard', 'cannotSeeOnMobile2') }}</small>
|
||||
</div>
|
||||
<div><a class="nav-link" href="/server/step1"><i class="fas fa-plus-circle"></i> {{ translate('dashboard', 'newServer') }}</a></div>
|
||||
<h4 class="card-title"><i class="fas fa-server"></i> {{ translate('dashboard', 'allServers', data['lang']) }}</h4>
|
||||
{% if len(data['servers']) > 0 %}
|
||||
<span class="too_small" title="{{ translate('dashboard', 'cannotSeeOnMobile', data['lang']) }}", data-content="{{ translate('dashboard', 'cannotSeeOnMobile2', data['lang']) }}", data-placement="top"></span>
|
||||
{% end %}
|
||||
<div><a class="nav-link" href="/server/step1"><i class="fas fa-plus-circle"></i> {{ translate('dashboard', 'newServer', data['lang']) }}</a></div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
|
||||
<div class="table-responsive">
|
||||
{% if len(data['servers']) == 0%}
|
||||
<div style="text-align: center; color: grey;">
|
||||
<h1>{{ translate('dashboard', 'welcome', data['lang']) }}</h1>
|
||||
<br>
|
||||
<h7>{{ translate('dashboard', 'no-servers', data['lang']) }} {{ translate('dashboard', 'newServer', data['lang']) }}.</h7>
|
||||
</div>
|
||||
|
||||
{% end %}
|
||||
{% if len(data['servers']) > 0 %}
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr class="rounded">
|
||||
<th>{{ translate('dashboard', 'server') }}</th>
|
||||
<th>{{ translate('dashboard', 'actions') }}</th>
|
||||
<th>{{ translate('dashboard', 'cpuUsage') }}</th>
|
||||
<th>{{ translate('dashboard', 'memUsage') }}</th>
|
||||
<th>{{ translate('dashboard', 'world') }}</th>
|
||||
<th>{{ translate('dashboard', 'players') }}</th>
|
||||
<th>{{ translate('dashboard', 'status') }}</th>
|
||||
<th>{{ translate('dashboard', 'server', data['lang']) }}</th>
|
||||
<th>{{ translate('dashboard', 'actions', data['lang']) }}</th>
|
||||
<th>{{ translate('dashboard', 'cpuUsage', data['lang']) }}</th>
|
||||
<th>{{ translate('dashboard', 'memUsage', data['lang']) }}</th>
|
||||
<th>{{ translate('dashboard', 'world', data['lang']) }}</th>
|
||||
<th>{{ translate('dashboard', 'players', data['lang']) }}</th>
|
||||
<th>{{ translate('dashboard', 'status', data['lang']) }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -126,17 +122,17 @@
|
||||
<td id="controls{{server['server_data']['server_id']}}" class="actions_serverlist">
|
||||
{% if server['user_command_permission'] %}
|
||||
{% if server['stats']['running'] %}
|
||||
<a class="stop_button" data-id="{{server['server_data']['server_id']}}" data-toggle="tooltip" title={{ translate('dashboard', 'stop') }}> <i class="fas fa-stop"></i></a>
|
||||
<a class="restart_button" data-id="{{server['server_data']['server_id']}}" data-toggle="tooltip" title={{ translate('dashboard', 'restart') }}> <i class="fas fa-sync"></i></a>
|
||||
<a class="kill_button" data-id="{{server['server_data']['server_id']}}" class="kill_button" data-toggle="tooltip" title={{ translate('dashboard', 'kill') }}> <i class="fas fa-skull"></i></a>
|
||||
<a class="stop_button" data-id="{{server['server_data']['server_id']}}" data-toggle="tooltip" title={{ translate('dashboard', 'stop', data['lang']) }}> <i class="fas fa-stop"></i></a>
|
||||
<a class="restart_button" data-id="{{server['server_data']['server_id']}}" data-toggle="tooltip" title={{ translate('dashboard', 'restart', data['lang']) }}> <i class="fas fa-sync"></i></a>
|
||||
<a class="kill_button" data-id="{{server['server_data']['server_id']}}" class="kill_button" data-toggle="tooltip" title={{ translate('dashboard', 'kill', data['lang']) }}> <i class="fas fa-skull"></i></a>
|
||||
{% elif server['stats']['updating']%}
|
||||
<a data-id="{{server['server_data']['server_id']}}" class="">{{ translate('serverTerm', 'updating') }}</i></a>
|
||||
<a data-id="{{server['server_data']['server_id']}}" class="">{{ translate('serverTerm', 'updating', data['lang']) }}</i></a>
|
||||
{% elif server['stats']['waiting_start']%}
|
||||
<a data-id="{{server['server_data']['server_id']}}" class="" title={{ translate('dashboard', 'delay-explained')}}>{{ translate('dashboard', 'starting') }}</i></a>
|
||||
<a data-id="{{server['server_data']['server_id']}}" class="" title={{ translate('dashboard', 'delay-explained', data['lang'])}}>{{ translate('dashboard', 'starting', data['lang']) }}</i></a>
|
||||
{% else %}
|
||||
<a data-id="{{server['server_data']['server_id']}}" class="play_button"><i class="fas fa-play" data-toggle="tooltip" title={{ translate('dashboard', 'start') }}></i></a>
|
||||
<a data-id="{{server['server_data']['server_id']}}" class="clone_button"> <i class="fas fa-clone" data-toggle="tooltip" title={{ translate('dashboard', 'clone') }}></i></a>
|
||||
<a class="kill_button" data-id="{{server['server_data']['server_id']}}" class="kill_button" data-toggle="tooltip" title={{ translate('dashboard', 'kill') }}> <i class="fas fa-skull"></i></a>
|
||||
<a data-id="{{server['server_data']['server_id']}}" class="play_button"><i class="fas fa-play" data-toggle="tooltip" title={{ translate('dashboard', 'start', data['lang']) }}></i></a>
|
||||
<a data-id="{{server['server_data']['server_id']}}" class="clone_button"> <i class="fas fa-clone" data-toggle="tooltip" title={{ translate('dashboard', 'clone', data['lang']) }}></i></a>
|
||||
<a class="kill_button" data-id="{{server['server_data']['server_id']}}" class="kill_button" data-toggle="tooltip" title={{ translate('dashboard', 'kill', data['lang']) }}> <i class="fas fa-skull"></i></a>
|
||||
{% end %}
|
||||
{% end %}
|
||||
</td>
|
||||
@ -181,7 +177,7 @@
|
||||
</td>
|
||||
<td>
|
||||
{% if server['stats']['int_ping_results'] %}
|
||||
{{ server['stats']['online'] }} / {{ server['stats']['max'] }} {{ translate('dashboard', 'max') }}<br />
|
||||
{{ server['stats']['online'] }} / {{ server['stats']['max'] }} {{ translate('dashboard', 'max', data['lang']) }}<br />
|
||||
|
||||
{% if server['stats']['desc'] != 'False' %}
|
||||
{{ server['stats']['desc'] }} <br />
|
||||
@ -195,9 +191,9 @@
|
||||
</td>
|
||||
<td>
|
||||
{% if server['stats']['running'] %}
|
||||
<i class="fas fa-thumbs-up"></i> <span class="text-success">{{ translate('dashboard', 'online') }}</span>
|
||||
<i class="fas fa-thumbs-up"></i> <span class="text-success">{{ translate('dashboard', 'online', data['lang']) }}</span>
|
||||
{% else %}
|
||||
<i class="fas fa-thumbs-down"></i> <span class="text-danger">{{ translate('dashboard', 'offline') }}</span>
|
||||
<i class="fas fa-thumbs-down"></i> <span class="text-danger">{{ translate('dashboard', 'offline', data['lang']) }}</span>
|
||||
{% end %}
|
||||
</td>
|
||||
</tr>
|
||||
@ -205,6 +201,7 @@
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
{% end %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -212,16 +209,42 @@
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<!-- content-wrapper ends -->
|
||||
|
||||
<style>
|
||||
.popover-body{
|
||||
color: white !important;;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
{% end %}
|
||||
|
||||
{% block js %}
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
$('[data-toggle="popover"]').popover();
|
||||
if($(window).width() < 1000){
|
||||
$('.too_small').popover("show");
|
||||
}
|
||||
|
||||
});
|
||||
$(window).ready(function(){
|
||||
$('body').click(function(){
|
||||
$('.too_small').popover("hide");
|
||||
});
|
||||
});
|
||||
$(window).resize(function() {
|
||||
// This will execute whenever the window is resized
|
||||
if($(window).width() < 1000){
|
||||
$('.too_small').popover("show");
|
||||
}
|
||||
else{
|
||||
$('.too_small').popover("hide");
|
||||
} // New width
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
|
||||
function send_command (server_id, command){
|
||||
/* this getCookie function is in base.html */
|
||||
@ -271,8 +294,8 @@ $( document ).ready(function() {
|
||||
send_command(server_id, 'start_server');
|
||||
bootbox.alert({
|
||||
backdrop: true,
|
||||
title: '{% raw translate("dashboard", "sendingCommand") %}',
|
||||
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("dashboard", "bePatientStart") %} </div>'
|
||||
title: '{% raw translate("dashboard", "sendingCommand", data['lang']) %}',
|
||||
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("dashboard", "bePatientStart", data['lang']) %} </div>'
|
||||
});
|
||||
});
|
||||
|
||||
@ -282,8 +305,8 @@ $( document ).ready(function() {
|
||||
send_command(server_id, 'stop_server');
|
||||
bootbox.alert({
|
||||
backdrop: true,
|
||||
title: '{% raw translate("dashboard", "sendingCommand") %}',
|
||||
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("dashboard", "bePatientStop") %} </div>'
|
||||
title: '{% raw translate("dashboard", "sendingCommand", data['lang']) %}',
|
||||
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("dashboard", "bePatientStop", data['lang']) %} </div>'
|
||||
});
|
||||
});
|
||||
|
||||
@ -292,8 +315,8 @@ $( document ).ready(function() {
|
||||
send_command(server_id, 'restart_server');
|
||||
bootbox.alert({
|
||||
backdrop: true,
|
||||
title: '{% raw translate("dashboard", "sendingCommand") %}',
|
||||
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("dashboard", "bePatientRestart") %} </div>'
|
||||
title: '{% raw translate("dashboard", "sendingCommand", data['lang']) %}',
|
||||
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("dashboard", "bePatientRestart", data['lang']) %} </div>'
|
||||
});
|
||||
});
|
||||
$( ".kill_button" ).click(function() {
|
||||
@ -302,11 +325,11 @@ $( document ).ready(function() {
|
||||
message: "This will kill the server process and all it's subprocesses. Killing a process can potentially corrupt files. Only do this in extreme circumstances. Are you sure you would like to continue?",
|
||||
buttons: {
|
||||
confirm: {
|
||||
label: '{% raw translate("dashboard", "kill") %}',
|
||||
label: '{% raw translate("dashboard", "kill", data['lang']) %}',
|
||||
className: 'btn-danger'
|
||||
},
|
||||
cancel: {
|
||||
label: '{% raw translate("panelConfig", "cancel") %}',
|
||||
label: '{% raw translate("panelConfig", "cancel", data['lang']) %}',
|
||||
className: 'btn-secondary'
|
||||
}
|
||||
},
|
||||
@ -314,7 +337,7 @@ $( document ).ready(function() {
|
||||
if(result){
|
||||
send_kill(server_id);
|
||||
var dialog = bootbox.dialog({
|
||||
title: '{% raw translate("dashboard", "killing") %}',
|
||||
title: '{% raw translate("dashboard", "killing", data['lang']) %}',
|
||||
message: '<p><i class="fa fa-spin fa-spinner"></i> Loading...</p>'
|
||||
});
|
||||
|
||||
@ -334,10 +357,10 @@ dialog.init(function(){
|
||||
mem_percent = document.getElementById('mem_percent');
|
||||
|
||||
webSocket.on('update_host_stats', function (hostStats) {
|
||||
var cpuDataTitle = `{% raw translate('dashboard', 'cpuCores') %}: ${hostStats.cpu_cores} <br /> {% raw translate("dashboard", "cpuCurFreq") %}: ${hostStats.cpu_cur_freq} <br /> {% raw translate("dashboard", "cpuMaxFreq") %}: ${hostStats.cpu_max_freq}`;
|
||||
var cpuDataTitle = `{% raw translate('dashboard', 'cpuCores', data['lang']) %}: ${hostStats.cpu_cores} <br /> {% raw translate("dashboard", "cpuCurFreq", data['lang']) %}: ${hostStats.cpu_cur_freq} <br /> {% raw translate("dashboard", "cpuMaxFreq", data['lang']) %}: ${hostStats.cpu_max_freq}`;
|
||||
cpu_data.setAttribute('data-original-title', cpuDataTitle);
|
||||
cpu_usage.textContent = hostStats.cpu_usage;
|
||||
mem_usage.setAttribute('data-original-title', `{% raw translate("dashboard", "memUsage") %}: ${hostStats.mem_usage}`);
|
||||
mem_usage.setAttribute('data-original-title', `{% raw translate("dashboard", "memUsage", data['lang']) %}: ${hostStats.mem_usage}`);
|
||||
mem_percent.textContent = hostStats.mem_percent + '%';
|
||||
});
|
||||
}
|
||||
@ -369,8 +392,8 @@ dialog.init(function(){
|
||||
send_command(server_id, 'clone_server');
|
||||
bootbox.alert({
|
||||
backdrop: true,
|
||||
title: '{% raw translate("dashboard", "sendingCommand") %}',
|
||||
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("dashboard", "bePatientClone") %} </div>'
|
||||
title: '{% raw translate("dashboard", "sendingCommand", data['lang']) %}',
|
||||
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("dashboard", "bePatientClone", data['lang']) %} </div>'
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -32,11 +32,11 @@
|
||||
<div class="col-sm-12 grid-margin stretch-card">
|
||||
<div class="card card-statistics social-card google-card card-colored">
|
||||
<div class="card-body">
|
||||
<h4 class="platform-name mb-3 mt-4 font-weight-semibold user-name">{{ translate('accessDenied', 'accessDenied') }}</h4>
|
||||
<h5 class="headline font-weight-medium">{{ translate('accessDenied', 'noAccess') }}</h5>
|
||||
<h4 class="platform-name mb-3 mt-4 font-weight-semibold user-name">{{ translate('accessDenied', 'accessDenied', data['lang']) }}</h4>
|
||||
<h5 class="headline font-weight-medium">{{ translate('accessDenied', 'noAccess', data['lang']) }}</h5>
|
||||
<p class="mb-2 comment font-weight-light">
|
||||
{{ translate('accessDenied', 'contactAdmin') }}<br /><br />
|
||||
<a class="d-inline font-weight-medium" href="https://discord.gg/9VJPhCE"> {{ translate('accessDenied', 'contact') }}</a>
|
||||
{{ translate('accessDenied', 'contactAdmin', data['lang']) }}<br /><br />
|
||||
<a class="d-inline font-weight-medium" href="https://discord.gg/9VJPhCE"> {{ translate('accessDenied', 'contact', data['lang']) }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -30,10 +30,9 @@
|
||||
<div class="col-md-12 col-lg-12 grid-margin stretch-card">
|
||||
<div class="card">
|
||||
<div class="card-header header-sm d-flex justify-content-between align-items-center">
|
||||
<h4 class="card-title"><i class="fas fa-users"></i> Users</h4>
|
||||
<div class="d-md-none">
|
||||
<small>Can't see everything on mobile?<br /> Try scrolling the table sideways.</small>
|
||||
</div>
|
||||
<h4 class="card-title"><i class="fas fa-users"></i> Users</h4>
|
||||
<span class="too_small" title="{{ translate('dashboard', 'cannotSee', data['lang']) }}", data-content="{{ translate('dashboard', 'cannotSeeOnMobile2', data['lang']) }}", data-placement="top"></span>
|
||||
|
||||
<div><a class="nav-link" href="/panel/add_user"><i class="fas fa-plus-circle"></i> Add New User</a></div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
@ -64,23 +63,27 @@
|
||||
</span>
|
||||
|
||||
{% end %}
|
||||
|
||||
</td>
|
||||
<td>{{ user.api_token }}</td>
|
||||
<td class="server_list_{{user.user_id}}"><ul id="{{user.user_id}}">
|
||||
{% for item in data['auth-servers'][user.user_id] %}
|
||||
<li>{{item}}</li>
|
||||
{% end %}
|
||||
</ul></td>
|
||||
<td class="role_list_{{user.user_id}}"><ul>
|
||||
<td>
|
||||
<button data-toggle="tooltip" title="Show API Key" data-id="{{ user.api_token }}" type="button" class="btn btn-info show_button">Show</button>
|
||||
</td>
|
||||
<td id="server_list_{{user.user_id}}">
|
||||
<ul id="{{user.user_id}}">
|
||||
{% for item in data['auth-servers'][user.user_id] %}
|
||||
<li>{{item}}</li>
|
||||
{% end %}
|
||||
</ul>
|
||||
</td>
|
||||
<td id="role_list_{{user.user_id}}">
|
||||
<ul>
|
||||
{% for item in data['user-roles'][user.user_id] %}
|
||||
<li>{{item}}</li>
|
||||
<li data-toggle="tooltip" title="{{ item }}">{{item}}</li>
|
||||
{% end %}
|
||||
|
||||
</ul>
|
||||
</td>
|
||||
<td><a href="/panel/edit_user?id={{user.user_id}}"><i class="fas fa-pencil-alt"></i></a></td>
|
||||
</tr>
|
||||
{% end %}
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@ -93,9 +96,7 @@
|
||||
<div class="card">
|
||||
<div class="card-header header-sm d-flex justify-content-between align-items-center">
|
||||
<h4 class="card-title"><i class="fas fa-user-tag"></i> Roles</h4>
|
||||
<div class="d-md-none">
|
||||
<small>Can't see everything on mobile?<br /> Try scrolling the table sideways.</small>
|
||||
</div>
|
||||
<span class="too_small2" title="{{ translate('dashboard', 'cannotSee', data['lang']) }}", data-content="{{ translate('dashboard', 'cannotSeeOnMobile2', data['lang']) }}", data-placement="top"></span>
|
||||
<div><a class="nav-link" href="/panel/add_role"><i class="fas fa-plus-circle"></i> Add New Role</a></div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
@ -113,11 +114,13 @@
|
||||
{% for role in data['roles'] %}
|
||||
<tr>
|
||||
<td>{{ role.role_name }}</td>
|
||||
<td class="role_list_{{role.role_id}}"><ul id="{{role.role_id}}">
|
||||
{% for item in data['role-servers'][role.role_id] %}
|
||||
<li>{{item}}</li>
|
||||
{% end %}
|
||||
</ul></td>
|
||||
<td id="role_list_{{role.role_id}}">
|
||||
<ul id="{{role.role_id}}">
|
||||
{% for item in data['role-servers'][role.role_id] %}
|
||||
<li>{{item}}</li>
|
||||
{% end %}
|
||||
</ul>
|
||||
</td>
|
||||
<td><ul>
|
||||
{% for user in data['users'] %}
|
||||
{% for ruser in data['user-roles'][user.user_id] %}
|
||||
@ -146,17 +149,64 @@
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.popover-body{
|
||||
color: white !important;;
|
||||
}
|
||||
</style>
|
||||
<!-- content-wrapper ends -->
|
||||
|
||||
{% end %}
|
||||
|
||||
{% block js %}
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
$('[data-toggle="popover"]').popover();
|
||||
if($(window).width() < 1000){
|
||||
$('.too_small').popover("show");
|
||||
$('.too_small2').popover("show");
|
||||
}
|
||||
|
||||
});
|
||||
$(window).ready(function(){
|
||||
$('body').click(function(){
|
||||
$('.too_small').popover("hide");
|
||||
$('.too_small2').popover("hide");
|
||||
});
|
||||
});
|
||||
$(window).resize(function() {
|
||||
// This will execute whenever the window is resized
|
||||
if($(window).width() < 1000){
|
||||
$('.too_small').popover("show");
|
||||
}
|
||||
else{
|
||||
$('.too_small').popover("hide");
|
||||
} // New width
|
||||
if($(window).width() < 1000){
|
||||
$('.too_small2').popover("show");
|
||||
}
|
||||
else{
|
||||
$('.too_small2').popover("hide");
|
||||
} // New width
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
|
||||
$( document ).ready(function() {
|
||||
console.log('ready for JS!')
|
||||
|
||||
});
|
||||
|
||||
$( ".show_button" ).click(function() {
|
||||
console.log("showing key");
|
||||
api_key = $(this).attr("data-id");
|
||||
bootbox.alert({
|
||||
backdrop: true,
|
||||
title: '',
|
||||
message: api_key,
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
{% end %}
|
@ -141,8 +141,8 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-success mr-2"><i class="fas fa-save"></i> {{ translate('panelConfig', 'save') }}</button>
|
||||
<button type="reset" onclick="location.href='/panel/panel_config'" class="btn btn-light"><i class="fas fa-undo-alt"></i> {{ translate('panelConfig', 'cancel') }}</button>
|
||||
<button type="submit" class="btn btn-success mr-2"><i class="fas fa-save"></i> {{ translate('panelConfig', 'save', data['lang']) }}</button>
|
||||
<button type="reset" onclick="location.href='/panel/panel_config'" class="btn btn-light"><i class="fas fa-undo-alt"></i> {{ translate('panelConfig', 'cancel', data['lang']) }}</button>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
@ -40,12 +40,12 @@
|
||||
<div class="card-body pt-0">
|
||||
<ul class="nav nav-tabs col-md-12 tab-simple-styled " role="tablist">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link active" href="/panel/edit_user?id={{ data['user']['user_id'] }}&subpage=config" role="tab" aria-selected="true">
|
||||
<a class="nav-link active" href="/panel/{{ 'add_user' if data['new_user'] else 'edit_user' }}?id={{ data['user']['user_id'] }}&subpage=config" role="tab" aria-selected="true">
|
||||
<i class="fas fa-cogs"></i>Config</a>
|
||||
</li>
|
||||
{% if data['new_user'] %}
|
||||
{% if not data['new_user'] %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/panel/edit_user?id={{ data['user']['user_id'] }}&subpage=other" role="tab" aria-selected="false">
|
||||
<a class="nav-link" href="/panel/add_user?id={{ data['user']['user_id'] }}&subpage=other" role="tab" aria-selected="false">
|
||||
<i class="fas fa-folder-tree"></i>Other</a>
|
||||
</li>
|
||||
{% end %}
|
||||
@ -54,37 +54,43 @@
|
||||
<div class="row">
|
||||
<div class="col-md-6 col-sm-12">
|
||||
{% if data['new_user'] %}
|
||||
<form class="forms-sample" method="post" action="/panel/add_user">
|
||||
<form id="user_form" class="forms-sample" method="post" action="/panel/add_user">
|
||||
{% else %}
|
||||
<form class="forms-sample" method="post" action="/panel/edit_user">
|
||||
<form id="user_form" class="forms-sample" method="post" action="/panel/edit_user">
|
||||
{% end %}
|
||||
{% raw xsrf_form_html() %}
|
||||
<input type="hidden" name="id" value="{{ data['user']['user_id'] }}">
|
||||
<input type="hidden" name="subpage" value="config">
|
||||
|
||||
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header header-sm d-flex justify-content-between align-items-center">
|
||||
<h4 class="card-title"><i class="fas fa-user"></i> User Settings</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="card-body">
|
||||
<div class="form-group">
|
||||
<label for="username">User Name <small class="text-muted ml-1"> - What you wish to call this user</small> </label>
|
||||
<label class="form-label" for="username">User Name <small class="text-muted ml-1"> - What you wish to call this user</small> </label>
|
||||
<input type="text" class="form-control" name="username" id="username" value="{{ data['user']['username'] }}" placeholder="User Name" >
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password0">Password <small class="text-muted ml-1"> - leave blank to don't change</small> </label>
|
||||
<label class="form-label" for="password0">Password <small class="text-muted ml-1"> - leave blank to don't change</small> </label>
|
||||
<input type="password" class="form-control" name="password0" id="password0" value="" placeholder="Password" >
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password1">Repeat Password <small class="text-muted ml-1"> - leave blank to don't change</small> </label>
|
||||
<label class="form-label" for="password1">Repeat Password <small class="text-muted ml-1"> - leave blank to don't change</small> </label>
|
||||
<input type="password" class="form-control" name="password1" id="password1" value="" placeholder="Repeat Password" >
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="language">User Language:</label>
|
||||
<select class="form-select" id="language" name="language" form="user_form">
|
||||
{% for lang in data['languages'] %}
|
||||
<option value="{{lang}}">{{lang}}</option>
|
||||
{% end %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
{% if len(data['servers_all']) > 0 %}
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header header-sm d-flex justify-content-between align-items-center">
|
||||
<h4 class="card-title"><i class="fas fa-user-tag"></i> Roles <small class="text-muted ml-1"> - the roles this user is a member of</small></h4>
|
||||
@ -105,9 +111,9 @@
|
||||
<td>{{ role.role_name }}</td>
|
||||
<td>
|
||||
{% if role.role_id in data['user']['roles'] %}
|
||||
<input type="checkbox" class="" id="role_{{ role.role_id }}_membership" name="role_{{ role.role_id }}_membership" checked="" value="1">
|
||||
<input type="checkbox" class="form-check-input" id="role_{{ role.role_id }}_membership" name="role_{{ role.role_id }}_membership" checked="" value="1">
|
||||
{% else %}
|
||||
<input type="checkbox" class="" id="role_{{ role.role_id }}_membership" name="role_{{ role.role_id }}_membership" value="1">
|
||||
<input type="checkbox" class="form-check-input" id="role_{{ role.role_id }}_membership" name="role_{{ role.role_id }}_membership" value="1">
|
||||
{% end %}
|
||||
|
||||
</td>
|
||||
@ -120,13 +126,13 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Put Permissions Crafty part here -->
|
||||
|
||||
<!-- Put Permissions Crafty part here -->
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header header-sm d-flex justify-content-between align-items-center">
|
||||
<h4 class="card-title"><i class="fas fa-user-lock"></i> Crafty Permissions <small class="text-muted ml-1"> - permissions this user has on Crafty Controller </small></h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="card-body">
|
||||
<div class="form-group">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
@ -143,9 +149,9 @@
|
||||
<td>{{ permission.name }}</td>
|
||||
<td>
|
||||
{% if permission in data['permissions_list'] %}
|
||||
<input type="checkbox" class="" id="permission_{{ permission.name }}" name="permission_{{ permission.name }}" checked="" value="1">
|
||||
<input type="checkbox" class="form-check-input" id="permission_{{ permission.name }}" name="permission_{{ permission.name }}" checked="" value="1">
|
||||
{% else %}
|
||||
<input type="checkbox" class="" id="permission_{{ permission.name }}" name="permission_{{ permission.name }}" value="1">
|
||||
<input type="checkbox" class="form-check-input" id="permission_{{ permission.name }}" name="permission_{{ permission.name }}" value="1">
|
||||
{% end %}
|
||||
</td>
|
||||
<td><input type="text" class="form-control" name="quantity_{{ permission.name }}" id="quantity_{{ permission.name }}" value="{{ data['quantity_server'][permission.name] }}"></td>
|
||||
@ -184,9 +190,9 @@
|
||||
</label>
|
||||
|
||||
</div>
|
||||
{% end %}
|
||||
<button type="submit" class="btn btn-success mr-2"><i class="fas fa-save"></i> {{ translate('panelConfig', 'save') }}</button>
|
||||
<button type="reset" onclick="location.href='/panel/panel_config'" class="btn btn-light"><i class="fas fa-undo-alt"></i> {{ translate('panelConfig', 'cancel') }}</button>
|
||||
|
||||
<button type="submit" class="btn btn-success mr-2"><i class="fas fa-save"></i> {{ translate('panelConfig', 'save', data['lang']) }}</button>
|
||||
<button type="reset" onclick="location.href='/panel/panel_config'" class="btn btn-light"><i class="fas fa-undo-alt"></i> {{ translate('panelConfig', 'cancel', data['lang']) }}</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
@ -5,33 +5,33 @@
|
||||
<div class="row">
|
||||
<div class="col-sm-3 mr-2">
|
||||
{% if data['server_stats']['running'] %}
|
||||
<b>{{ translate('serverStats', 'serverStatus') }}:</b> <span class="text-success">{{ translate('serverStats', 'online') }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverStarted') }}:</b> <span id="started">{{ data['server_stats']['started'] }} ({{ translate('serverStats', 'serverTime') }})</span><br />
|
||||
<b>{{ translate('serverStats', 'serverUptime') }}:</b> <span id="uptime">{{ translate('serverStats', 'errorCalculatingUptime') }}</span>
|
||||
<b>{{ translate('serverStats', 'serverStatus', data['lang']) }}:</b> <span class="text-success">{{ translate('serverStats', 'online', data['lang']) }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverStarted', data['lang']) }}:</b> <span id="started">{{ data['server_stats']['started'] }} ({{ translate('serverStats', 'serverTime', data['lang']) }})</span><br />
|
||||
<b>{{ translate('serverStats', 'serverUptime', data['lang']) }}:</b> <span id="uptime">{{ translate('serverStats', 'errorCalculatingUptime', data['lang']) }}</span>
|
||||
{% else %}
|
||||
<b>{{ translate('serverStats', 'serverStatus') }}:</b> <span class="text-danger">{{ translate('serverStats', 'offline') }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverStarted') }}:</b> <span class="text-danger">{{ translate('serverStats', 'offline') }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverUptime') }}:</b> <span class="text-danger">{{ translate('serverStats', 'offline') }}</span>
|
||||
<b>{{ translate('serverStats', 'serverStatus', data['lang']) }}:</b> <span class="text-danger">{{ translate('serverStats', 'offline', data['lang']) }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverStarted', data['lang']) }}:</b> <span class="text-danger">{{ translate('serverStats', 'offline', data['lang']) }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverUptime', data['lang']) }}:</b> <span class="text-danger">{{ translate('serverStats', 'offline', data['lang']) }}</span>
|
||||
{% end %}
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 mr-2">
|
||||
<b>{{ translate('serverStats', 'cpuUsage') }}:</b> {{ data['server_stats']['cpu'] }}% <br />
|
||||
<b>{{ translate('serverStats', 'memUsage') }}:</b> {{ data['server_stats']['mem'] }} <br />
|
||||
<b>{{ translate('serverStats', 'cpuUsage', data['lang']) }}:</b> {{ data['server_stats']['cpu'] }}% <br />
|
||||
<b>{{ translate('serverStats', 'memUsage', data['lang']) }}:</b> {{ data['server_stats']['mem'] }} <br />
|
||||
{% if data['server_stats']['int_ping_results'] %}
|
||||
<b>{{ translate('serverStats', 'players') }}:</b> {{ data['server_stats']['online'] }} / {{ data['server_stats']['max'] }}<br />
|
||||
<b>{{ translate('serverStats', 'players', data['lang']) }}:</b> {{ data['server_stats']['online'] }} / {{ data['server_stats']['max'] }}<br />
|
||||
{% else %}
|
||||
<b>{{ translate('serverStats', 'players') }}:</b> 0/0<br />
|
||||
<b>{{ translate('serverStats', 'players', data['lang']) }}:</b> 0/0<br />
|
||||
{% end %}
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 mr-2">
|
||||
{% if data['server_stats']['version'] != 'False' %}
|
||||
<b>{{ translate('serverStats', 'version') }}:</b> {{ data['server_stats']['version'] }} <br />
|
||||
<b>{{ translate('serverStats', 'description') }}:</b> {{ data['server_stats']['desc'] }} <br />
|
||||
<b>{{ translate('serverStats', 'version', data['lang']) }}:</b> {{ data['server_stats']['version'] }} <br />
|
||||
<b>{{ translate('serverStats', 'description', data['lang']) }}:</b> {{ data['server_stats']['desc'] }} <br />
|
||||
{% else %}
|
||||
<b>{{ translate('serverStats', 'version') }}:</b> {{ translate('serverStats', 'unableToConnect') }} <br />
|
||||
<b>{{ translate('serverStats', 'description') }}:</b> {{ translate('serverStats', 'unableToConnect') }} <br />
|
||||
<b>{{ translate('serverStats', 'version', data['lang']) }}:</b> {{ translate('serverStats', 'unableToConnect', data['lang']) }} <br />
|
||||
<b>{{ translate('serverStats', 'description', data['lang']) }}:</b> {{ translate('serverStats', 'unableToConnect', data['lang']) }} <br />
|
||||
{% end %}
|
||||
</div>
|
||||
|
||||
|
@ -2,43 +2,43 @@
|
||||
{% if data['permissions']['Terminal'] in data['user_permissions'] %}
|
||||
<li class="nav-item term-nav-item">
|
||||
<a class="nav-link {% if data['active_link'] == 'term' %}active{% end %}" href="/panel/server_detail?id={{ data['server_stats']['server_id']['server_id'] }}&subpage=term" role="tab" aria-selected="false">
|
||||
<i class="fas fa-file-signature"></i>{{ translate('serverDetails', 'terminal') }}</a>
|
||||
<i class="fas fa-file-signature"></i>{{ translate('serverDetails', 'terminal', data['lang']) }}</a>
|
||||
</li>
|
||||
{% end %}
|
||||
{% if data['permissions']['Logs'] in data['user_permissions'] %}
|
||||
<li class="nav-item term-nav-item">
|
||||
<a class="nav-link {% if data['active_link'] == 'logs' %}active{% end %}" href="/panel/server_detail?id={{ data['server_stats']['server_id']['server_id'] }}&subpage=logs" role="tab" aria-selected="false">
|
||||
<i class="fas fa-file-signature"></i>{{ translate('serverDetails', 'logs') }}</a>
|
||||
<i class="fas fa-file-signature"></i>{{ translate('serverDetails', 'logs', data['lang']) }}</a>
|
||||
</li>
|
||||
{% end %}
|
||||
{% if data['permissions']['Schedule'] in data['user_permissions'] %}
|
||||
<li class="nav-item term-nav-item">
|
||||
<a class="nav-link {% if data['active_link'] == 'schedule' %}active{% end %}" href="/panel/server_detail?id={{ data['server_stats']['server_id']['server_id'] }}&subpage=tasks" role="tab" aria-selected="false">
|
||||
<i class="fas fa-clock"></i>{{ translate('serverDetails', 'schedule') }}</a>
|
||||
<i class="fas fa-clock"></i>{{ translate('serverDetails', 'schedule', data['lang']) }}</a>
|
||||
</li>
|
||||
{% end %}
|
||||
{% if data['permissions']['Backup'] in data['user_permissions'] %}
|
||||
<li class="nav-item term-nav-item">
|
||||
<a class="nav-link {% if data['active_link'] == 'backup' %}active{% end %}" href="/panel/server_detail?id={{ data['server_stats']['server_id']['server_id'] }}&subpage=backup" role="tab" aria-selected="false">
|
||||
<i class="fas fa-save"></i>{{ translate('serverDetails', 'backup') }}</a>
|
||||
<i class="fas fa-save"></i>{{ translate('serverDetails', 'backup', data['lang']) }}</a>
|
||||
</li>
|
||||
{% end %}
|
||||
{% if data['permissions']['Files'] in data['user_permissions'] %}
|
||||
<li class="nav-item term-nav-item">
|
||||
<a class="nav-link {% if data['active_link'] == 'files' %}active{% end %}" href="/panel/server_detail?id={{ data['server_stats']['server_id']['server_id'] }}&subpage=files" role="tab" aria-selected="false">
|
||||
<i class="fas fa-folder-tree"></i>{{ translate('serverDetails', 'files') }}</a>
|
||||
<i class="fas fa-folder-tree"></i>{{ translate('serverDetails', 'files', data['lang']) }}</a>
|
||||
</li>
|
||||
{% end %}
|
||||
{% if data['permissions']['Config'] in data['user_permissions'] %}
|
||||
<li class="nav-item term-nav-item">
|
||||
<a class="nav-link {% if data['active_link'] == 'config' %}active{% end %}" href="/panel/server_detail?id={{ data['server_stats']['server_id']['server_id'] }}&subpage=config" role="tab" aria-selected="true">
|
||||
<i class="fas fa-cogs"></i>{{ translate('serverDetails', 'config') }}</a>
|
||||
<i class="fas fa-cogs"></i>{{ translate('serverDetails', 'config', data['lang']) }}</a>
|
||||
</li>
|
||||
{% end %}
|
||||
{% if data['permissions']['Players'] in data['user_permissions'] %}
|
||||
<li class="nav-item term-nav-item">
|
||||
<a class="nav-link {% if data['active_link'] == 'admin_controls' %}active{% end %}" href="/panel/server_detail?id={{ data['server_stats']['server_id']['server_id'] }}&subpage=admin_controls" role="tab" aria-selected="true">
|
||||
<i class="fas fa-users"></i>{{ translate('serverDetails', 'playerControls') }}</a>
|
||||
<i class="fas fa-users"></i>{{ translate('serverDetails', 'playerControls', data['lang']) }}</a>
|
||||
</li>
|
||||
{% end %}
|
||||
</ul>
|
@ -4,7 +4,7 @@
|
||||
<!-- <meta http-equiv="refresh" content="60">-->
|
||||
{% end %}
|
||||
|
||||
{% block title %}Crafty Controller - {{ translate('serverDetails', 'serverDetails') }}{% end %}
|
||||
{% block title %}Crafty Controller - {{ translate('serverDetails', 'serverDetails', data['lang']) }}{% end %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
<div class="col-12">
|
||||
<div class="page-header">
|
||||
<h4 class="page-title">
|
||||
{{ translate('serverDetails', 'serverDetails') }} - {{ data['server_stats']['server_id']['server_name'] }}
|
||||
{{ translate('serverDetails', 'serverDetails', data['lang']) }} - {{ data['server_stats']['server_id']['server_name'] }}
|
||||
<br />
|
||||
<small>UUID: {{ data['server_stats']['server_id']['server_uuid'] }}</small>
|
||||
</h4>
|
||||
@ -65,7 +65,7 @@
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
</style>
|
||||
<h2>{{ translate('serverPlayerManagement', 'players') }}:</h2>
|
||||
<h2>{{ translate('serverPlayerManagement', 'players', data['lang']) }}:</h2>
|
||||
<ul style="list-style: none;padding: 0px;margin: 0px; margin-bottom: 1rem;gap: 1rem;">
|
||||
{% for player in data['get_players']() %}
|
||||
<li class="playerItem">
|
||||
@ -81,10 +81,10 @@
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-md-6 col-sm-12">
|
||||
<h2>{{ translate('serverPlayerManagement', 'bannedPlayers') }}:</h2>
|
||||
<h2>{{ translate('serverPlayerManagement', 'bannedPlayers', data['lang']) }}:</h2>
|
||||
<ul id="bannedPlayers" style="list-style: none;padding: 0px;margin: 0px; margin-bottom: 1rem;gap: 1rem;">
|
||||
<li class="playerItem banned">
|
||||
<h3>{{ translate('serverPlayerManagement', 'loadingBannedPlayers') }}</h3>
|
||||
<h3>{{ translate('serverPlayerManagement', 'loadingBannedPlayers', data['lang']) }}</h3>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
@ -4,7 +4,7 @@
|
||||
<!-- <meta http-equiv="refresh" content="60">-->
|
||||
{% end %}
|
||||
|
||||
{% block title %}Crafty Controller - {{ translate('serverDetails', 'serverDetails') }}{% end %}
|
||||
{% block title %}Crafty Controller - {{ translate('serverDetails', 'serverDetails', data['lang']) }}{% end %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
<div class="col-12">
|
||||
<div class="page-header">
|
||||
<h4 class="page-title">
|
||||
{{ translate('serverDetails', 'serverDetails') }} - {{ data['server_stats']['server_id']['server_name'] }}
|
||||
{{ translate('serverDetails', 'serverDetails', data['lang']) }} - {{ data['server_stats']['server_id']['server_name'] }}
|
||||
<br />
|
||||
<small>UUID: {{ data['server_stats']['server_id']['server_uuid'] }}</small>
|
||||
</h4>
|
||||
@ -42,37 +42,37 @@
|
||||
<input type="hidden" name="subpage" value="backup">
|
||||
|
||||
<div class="form-group">
|
||||
<a href="/panel/backup_now?id={{ data['server_stats']['server_id']['server_id'] }}" class="btn btn-primary" onclick="backup_started()">{{ translate('serverBackups', 'backupNow') }}</a>
|
||||
<a href="/panel/backup_now?id={{ data['server_stats']['server_id']['server_id'] }}" class="btn btn-primary" onclick="backup_started()">{{ translate('serverBackups', 'backupNow', data['lang']) }}</a>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="server_name">{{ translate('serverBackups', 'storageLocation') }} <small class="text-muted ml-1"> - {{ translate('serverBackups', 'storageLocationDesc') }}</small> </label>
|
||||
<input type="text" class="form-control" name="backup_path" id="backup_path" value="{{ data['server_stats']['server_id']['backup_path'] }}" placeholder="{{ translate('serverBackups', 'storageLocation') }}" >
|
||||
<label for="server_name">{{ translate('serverBackups', 'storageLocation', data['lang']) }} <small class="text-muted ml-1"> - {{ translate('serverBackups', 'storageLocationDesc', data['lang']) }}</small> </label>
|
||||
<input type="text" class="form-control" name="backup_path" id="backup_path" value="{{ data['server_stats']['server_id']['backup_path'] }}" placeholder="{{ translate('serverBackups', 'storageLocation', data['lang']) }}" >
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="server_path">{{ translate('serverBackups', 'maxBackups') }} <small class="text-muted ml-1"> - {{ translate('serverBackups', 'maxBackupsDesc') }}</small> </label>
|
||||
<input type="text" class="form-control" name="max_backups" id="max_backups" value="{{ data['backup_config']['max_backups'] }}" placeholder="{{ translate('serverBackups', 'maxBackups') }}" >
|
||||
<label for="server_path">{{ translate('serverBackups', 'maxBackups', data['lang']) }} <small class="text-muted ml-1"> - {{ translate('serverBackups', 'maxBackupsDesc', data['lang']) }}</small> </label>
|
||||
<input type="text" class="form-control" name="max_backups" id="max_backups" value="{{ data['backup_config']['max_backups'] }}" placeholder="{{ translate('serverBackups', 'maxBackups', data['lang']) }}" >
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="superuser" class="form-check-label ml-4 mb-4">
|
||||
{% if data['backup_config']['auto_enabled'] %}
|
||||
<input type="checkbox" class="form-check-input" id="auto_enabled" name="auto_enabled" checked="" value="1" >{{ translate('serverBackups', 'backupAtMidnight') }}
|
||||
<input type="checkbox" class="form-check-input" id="auto_enabled" name="auto_enabled" checked="" value="1" >{{ translate('serverBackups', 'backupAtMidnight', data['lang']) }}
|
||||
{% else %}
|
||||
<input type="checkbox" class="form-check-input" id="auto_enabled" name="auto_enabled" value="1" >{{ translate('serverBackups', 'backupAtMidnight') }}
|
||||
<input type="checkbox" class="form-check-input" id="auto_enabled" name="auto_enabled" value="1" >{{ translate('serverBackups', 'backupAtMidnight', data['lang']) }}
|
||||
{% end %}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-success mr-2">{{ translate('serverBackups', 'save') }}</button>
|
||||
<button type="reset" class="btn btn-light">{{ translate('serverBackups', 'cancel') }}</button>
|
||||
<button type="submit" class="btn btn-success mr-2">{{ translate('serverBackups', 'save', data['lang']) }}</button>
|
||||
<button type="reset" class="btn btn-light">{{ translate('serverBackups', 'cancel', data['lang']) }}</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 col-sm-12">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h4 class="card-title">{{ translate('serverBackups', 'currentBackups') }}</h4>
|
||||
<h4 class="card-title">{{ translate('serverBackups', 'currentBackups', data['lang']) }}</h4>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@ -81,10 +81,10 @@
|
||||
<table class="table table-responsive dataTable" id="backup_table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="10%">{{ translate('serverBackups', 'download') }}</th>
|
||||
<th>{{ translate('serverBackups', 'path') }}</th>
|
||||
<th width="20%">{{ translate('serverBackups', 'size') }}</th>
|
||||
<th width="10%">{{ translate('serverBackups', 'delete') }}</th>
|
||||
<th width="10%">{{ translate('serverBackups', 'download', data['lang']) }}</th>
|
||||
<th>{{ translate('serverBackups', 'path', data['lang']) }}</th>
|
||||
<th width="20%">{{ translate('serverBackups', 'size', data['lang']) }}</th>
|
||||
<th width="10%">{{ translate('serverBackups', 'delete', data['lang']) }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -93,7 +93,7 @@
|
||||
<td>
|
||||
<a href="/panel/download_backup?file={{ backup['path'] }}&id={{ data['server_stats']['server_id']['server_id'] }}" class="btn btn-primary">
|
||||
<i class="fas fa-download" aria-hidden="true"></i>
|
||||
{{ translate('serverBackups', 'download') }}
|
||||
{{ translate('serverBackups', 'download', data['lang']) }}
|
||||
</a>
|
||||
</td>
|
||||
<td>{{ backup['path'] }}</td>
|
||||
@ -101,7 +101,7 @@
|
||||
<td>
|
||||
<button data-file="{{ backup['path'] }}" class="btn btn-danger del_button">
|
||||
<i class="fas fa-trash" aria-hidden="true"></i>
|
||||
{{ translate('serverBackups', 'delete') }}
|
||||
{{ translate('serverBackups', 'delete', data['lang']) }}
|
||||
</button>
|
||||
|
||||
</td>
|
||||
@ -139,7 +139,7 @@
|
||||
|
||||
function backup_started(time='5-10') {
|
||||
bootbox.alert({
|
||||
message: "{{ translate('serverBackups', 'backupTask') }}",
|
||||
message: "{{ translate('serverBackups', 'backupTask', data['lang']) }}",
|
||||
backdrop: true
|
||||
});
|
||||
}
|
||||
@ -190,14 +190,14 @@
|
||||
console.log("file to delete is" + file_to_del);
|
||||
|
||||
bootbox.confirm({
|
||||
title: "{% raw translate('serverBackups', 'destroyBackup') %}",
|
||||
message: "{{ translate('serverBackups', 'confirmDelete') }}",
|
||||
title: "{% raw translate('serverBackups', 'destroyBackup', data['lang']) %}",
|
||||
message: "{{ translate('serverBackups', 'confirmDelete', data['lang']) }}",
|
||||
buttons: {
|
||||
cancel: {
|
||||
label: '<i class="fas fa-times"></i> {{ translate("serverBackups", "cancel") }}'
|
||||
label: '<i class="fas fa-times"></i> {{ translate("serverBackups", "cancel", data['lang']) }}'
|
||||
},
|
||||
confirm: {
|
||||
label: '<i class="fas fa-check"></i> {{ translate("serverBackups", "confirm") }}'
|
||||
label: '<i class="fas fa-check"></i> {{ translate("serverBackups", "confirm", data['lang']) }}'
|
||||
}
|
||||
},
|
||||
callback: function (result) {
|
||||
|
@ -4,7 +4,7 @@
|
||||
<!-- <meta http-equiv="refresh" content="60">-->
|
||||
{% end %}
|
||||
|
||||
{% block title %}Crafty Controller - {{ translate('serverDetails', 'serverDetails') }}{% end %}
|
||||
{% block title %}Crafty Controller - {{ translate('serverDetails', 'serverDetails', data['lang']) }}{% end %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
<div class="col-12">
|
||||
<div class="page-header">
|
||||
<h4 class="page-title">
|
||||
{{ translate('serverDetails', 'serverDetails') }} - {{ data['server_stats']['server_id']['server_name'] }}
|
||||
{{ translate('serverDetails', 'serverDetails', data['lang']) }} - {{ data['server_stats']['server_id']['server_name'] }}
|
||||
<br />
|
||||
<small>UUID: {{ data['server_stats']['server_id']['server_uuid'] }}</small>
|
||||
</h4>
|
||||
@ -42,104 +42,104 @@
|
||||
<input type="hidden" name="subpage" value="config">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="server_name">{{ translate('serverConfig', 'serverName') }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverNameDesc') }}</small> </label>
|
||||
<input type="text" class="form-control" name="server_name" id="server_name" value="{{ data['server_stats']['server_id']['server_name'] }}" placeholder="{{ translate('serverConfig', 'serverName') }}" >
|
||||
<label for="server_name">{{ translate('serverConfig', 'serverName', data['lang']) }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverNameDesc', data['lang']) }}</small> </label>
|
||||
<input type="text" class="form-control" name="server_name" id="server_name" value="{{ data['server_stats']['server_id']['server_name'] }}" placeholder="{{ translate('serverConfig', 'serverName', data['lang']) }}" >
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="server_path">{{ translate('serverConfig', 'serverPath') }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverPathDesc') }}</small> </label>
|
||||
<input type="text" class="form-control" name="server_path" id="server_path" value="{{ data['server_stats']['server_id']['path'] }}" placeholder="{{ translate('serverConfig', 'serverPath') }}" >
|
||||
<label for="server_path">{{ translate('serverConfig', 'serverPath', data['lang']) }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverPathDesc', data['lang']) }}</small> </label>
|
||||
<input type="text" class="form-control" name="server_path" id="server_path" value="{{ data['server_stats']['server_id']['path'] }}" placeholder="{{ translate('serverConfig', 'serverPath', data['lang']) }}" >
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="log_path">{{ translate('serverConfig', 'serverLogLocation') }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverLogLocationDesc') }}</small> </label>
|
||||
<input type="text" class="form-control" name="log_path" id="log_path" value="{{ data['server_stats']['server_id']['log_path'] }}" placeholder="{{ translate('serverConfig', 'serverLogLocation') }}" >
|
||||
<label for="log_path">{{ translate('serverConfig', 'serverLogLocation', data['lang']) }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverLogLocationDesc', data['lang']) }}</small> </label>
|
||||
<input type="text" class="form-control" name="log_path" id="log_path" value="{{ data['server_stats']['server_id']['log_path'] }}" placeholder="{{ translate('serverConfig', 'serverLogLocation', data['lang']) }}" >
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="executable">{{ translate('serverConfig', 'serverExecutable') }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverExecutableDesc') }}</small> </label>
|
||||
<input type="text" class="form-control" name="executable" id="executable" value="{{ data['server_stats']['server_id']['executable'] }}" placeholder="{{ translate('serverConfig', 'serverExecutable') }}" >
|
||||
<label for="executable">{{ translate('serverConfig', 'serverExecutable', data['lang']) }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverExecutableDesc', data['lang']) }}</small> </label>
|
||||
<input type="text" class="form-control" name="executable" id="executable" value="{{ data['server_stats']['server_id']['executable'] }}" placeholder="{{ translate('serverConfig', 'serverExecutable', data['lang']) }}" >
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="execution_command">{{ translate('serverConfig', 'serverExecutionCommand') }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverExecutionCommandDesc') }}</small> </label>
|
||||
<input type="text" class="form-control" name="execution_command" id="execution_command" value="{{ data['server_stats']['server_id']['execution_command'] }}" placeholder="{{ translate('serverConfig', 'serverExecutionCommand') }}" >
|
||||
<label for="execution_command">{{ translate('serverConfig', 'serverExecutionCommand', data['lang']) }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverExecutionCommandDesc', data['lang']) }}</small> </label>
|
||||
<input type="text" class="form-control" name="execution_command" id="execution_command" value="{{ data['server_stats']['server_id']['execution_command'] }}" placeholder="{{ translate('serverConfig', 'serverExecutionCommand', data['lang']) }}" >
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="stop_command">{{ translate('serverConfig', 'serverStopCommand') }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverStopCommandDesc') }}</small> </label>
|
||||
<input type="text" class="form-control" name="stop_command" id="stop_command" value="{{ data['server_stats']['server_id']['stop_command'] }}" placeholder="{{ translate('serverConfig', 'serverStopCommand') }}" >
|
||||
<label for="stop_command">{{ translate('serverConfig', 'serverStopCommand', data['lang']) }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverStopCommandDesc', data['lang']) }}</small> </label>
|
||||
<input type="text" class="form-control" name="stop_command" id="stop_command" value="{{ data['server_stats']['server_id']['stop_command'] }}" placeholder="{{ translate('serverConfig', 'serverStopCommand', data['lang']) }}" >
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="auto_start_delay">{{ translate('serverConfig', 'serverAutostartDelay') }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverAutostartDelayDesc') }}</small> </label>
|
||||
<label for="auto_start_delay">{{ translate('serverConfig', 'serverAutostartDelay', data['lang']) }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverAutostartDelayDesc', data['lang']) }}</small> </label>
|
||||
<input type="number" class="form-control" name="auto_start_delay" id="auto_start_delay" value="{{ data['server_stats']['server_id']['auto_start_delay'] }}" step="1" max="999" min="10" >
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="executable_update_url">{{ translate('serverConfig', 'exeUpdateURL') }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'exeUpdateURLDesc') }}</small> </label>
|
||||
<input type="text" class="form-control" name="executable_update_url" id="executable_update_url" value="{{ data['server_stats']['server_id']['executable_update_url'] }}" placeholder="{{ translate('serverConfig', 'exeUpdateURL') }}" >
|
||||
<label for="executable_update_url">{{ translate('serverConfig', 'exeUpdateURL', data['lang']) }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'exeUpdateURLDesc', data['lang']) }}</small> </label>
|
||||
<input type="text" class="form-control" name="executable_update_url" id="executable_update_url" value="{{ data['server_stats']['server_id']['executable_update_url'] }}" placeholder="{{ translate('serverConfig', 'exeUpdateURL', data['lang']) }}" >
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="server_ip">{{ translate('serverConfig', 'serverIP') }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverPortDesc') }}</small> </label>
|
||||
<label for="server_ip">{{ translate('serverConfig', 'serverIP', data['lang']) }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverPortDesc', data['lang']) }}</small> </label>
|
||||
<input type="text" class="form-control" name="server_ip" id="server_ip" value="{{ data['server_stats']['server_id']['server_ip'] }}">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="server_port">{{ translate('serverConfig', 'serverPort') }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverIPDesc') }}</small> </label>
|
||||
<label for="server_port">{{ translate('serverConfig', 'serverPort', data['lang']) }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'serverIPDesc', data['lang']) }}</small> </label>
|
||||
<input type="number" class="form-control" name="server_port" id="server_port" value="{{ data['server_stats']['server_id']['server_port'] }}" step="1" max="65566" min="1" >
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="logs_delete_after">{{ translate('serverConfig', 'removeOldLogsAfter') }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'removeOldLogsAfterDesc') }}</small> </label>
|
||||
<label for="logs_delete_after">{{ translate('serverConfig', 'removeOldLogsAfter', data['lang']) }} <small class="text-muted ml-1"> - {{ translate('serverConfig', 'removeOldLogsAfterDesc', data['lang']) }}</small> </label>
|
||||
<input type="number" class="form-control" name="logs_delete_after" id="logs_delete_after" value="{{ data['server_stats']['server_id']['logs_delete_after'] }}" step="1" max="365" min="0" >
|
||||
</div>
|
||||
|
||||
<div class="form-check-flat">
|
||||
<label for="auto_start" class="form-check-label ml-4 mb-4">
|
||||
{% if data['server_stats']['server_id']['auto_start'] %}
|
||||
<input type="checkbox" class="form-check-input" id="auto_start" name="auto_start" checked="" value="1">{{ translate('serverConfig', 'serverAutoStart') }}
|
||||
<input type="checkbox" class="form-check-input" id="auto_start" name="auto_start" checked="" value="1">{{ translate('serverConfig', 'serverAutoStart', data['lang']) }}
|
||||
{% else %}
|
||||
<input type="checkbox" class="form-check-input" id="auto_start" name="auto_start" value="1">{{ translate('serverConfig', 'serverAutoStart') }}
|
||||
<input type="checkbox" class="form-check-input" id="auto_start" name="auto_start" value="1">{{ translate('serverConfig', 'serverAutoStart', data['lang']) }}
|
||||
{% end %}
|
||||
</label>
|
||||
|
||||
<label for="crash_detection" class="form-check-label ml-4 mb-4">
|
||||
{% if data['server_stats']['server_id']['crash_detection'] %}
|
||||
<input type="checkbox" class="form-check-input" id="crash_detection" name="crash_detection" checked="" value="1">{{ translate('serverConfig', 'serverCrashDetection') }}
|
||||
<input type="checkbox" class="form-check-input" id="crash_detection" name="crash_detection" checked="" value="1">{{ translate('serverConfig', 'serverCrashDetection', data['lang']) }}
|
||||
{% else %}
|
||||
<input type="checkbox" class="form-check-input" id="crash_detection" name="crash_detection" value="1" >{{ translate('serverConfig', 'serverCrashDetection') }}
|
||||
<input type="checkbox" class="form-check-input" id="crash_detection" name="crash_detection" value="1" >{{ translate('serverConfig', 'serverCrashDetection', data['lang']) }}
|
||||
{% end %}
|
||||
</label>
|
||||
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-success mr-2"><i class="fas fa-save"></i> {{ translate('serverConfig', 'save') }}</button>
|
||||
<button type="reset" class="btn btn-light"><i class="fas fa-times"></i> {{ translate('serverConfig', 'cancel') }}</button>
|
||||
<button type="submit" class="btn btn-success mr-2"><i class="fas fa-save"></i> {{ translate('serverConfig', 'save', data['lang']) }}</button>
|
||||
<button type="reset" class="btn btn-light"><i class="fas fa-times"></i> {{ translate('serverConfig', 'cancel', data['lang']) }}</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 col-sm-12">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h4 class="card-title">{{ translate('serverConfigHelp', 'title') }}</h4>
|
||||
<p class="card-description"> {{ translate('serverConfigHelp', 'desc') }}</p>
|
||||
<h4 class="card-title">{{ translate('serverConfigHelp', 'title', data['lang']) }}</h4>
|
||||
<p class="card-description"> {{ translate('serverConfigHelp', 'desc', data['lang']) }}</p>
|
||||
<blockquote class="blockquote">
|
||||
<p class="mb-0">
|
||||
{% raw translate('serverConfigHelp', 'perms') %}
|
||||
{% raw translate('serverConfigHelp', 'perms', data['lang']) %}
|
||||
</p>
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
{% if data['server_stats']['running'] %}
|
||||
<button onclick="send_command(server_id, 'update_executable');" id="update_executable" style="max-width: 7rem;" class="btn btn-warning m-1 flex-grow-1 disabled">{{ translate('serverConfig', 'update') }}</button>
|
||||
<a class="btn btn-sm btn-danger disabled">{{ translate('serverConfig', 'deleteServer') }}</a><br />
|
||||
<small>{{ translate('serverConfig', 'stopBeforeDeleting') }}</small>
|
||||
<button onclick="send_command(server_id, 'update_executable');" id="update_executable" style="max-width: 7rem;" class="btn btn-warning m-1 flex-grow-1 disabled">{{ translate('serverConfig', 'update', data['lang']) }}</button>
|
||||
<a class="btn btn-sm btn-danger disabled">{{ translate('serverConfig', 'deleteServer', data['lang']) }}</a><br />
|
||||
<small>{{ translate('serverConfig', 'stopBeforeDeleting', data['lang']) }}</small>
|
||||
{% else %}
|
||||
<button onclick="send_command(server_id, 'update_executable');" id="update_executable" style="max-width: 7rem;" class="btn btn-warning m-1 flex-grow-1">{{ translate('serverConfig', 'update') }}</button>
|
||||
<button onclick="deleteConfirm()" class="btn btn-sm btn-danger">{{ translate('serverConfig', 'deleteServer') }}</button>
|
||||
<button onclick="send_command(server_id, 'update_executable');" id="update_executable" style="max-width: 7rem;" class="btn btn-warning m-1 flex-grow-1">{{ translate('serverConfig', 'update', data['lang']) }}</button>
|
||||
<button onclick="deleteConfirm()" class="btn btn-sm btn-danger">{{ translate('serverConfig', 'deleteServer', data['lang']) }}</button>
|
||||
{% end %}
|
||||
|
||||
</div>
|
||||
@ -222,8 +222,8 @@ let server_id = '{{ data['server_stats']['server_id']['server_id'] }}';
|
||||
if(command != "delete_server" && command != "delete_server_files"){
|
||||
bootbox.alert({
|
||||
backdrop: true,
|
||||
title: '{% raw translate("serverConfig", "sendingRequest") %}',
|
||||
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("serverConfig", "bePatientUpdate") %} </div>'
|
||||
title: '{% raw translate("serverConfig", "sendingRequest", data['lang']) %}',
|
||||
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("serverConfig", "bePatientUpdate", data['lang']) %} </div>'
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -233,16 +233,16 @@ let server_id = '{{ data['server_stats']['server_id']['server_id'] }}';
|
||||
name = "{{data['server_stats']['server_id']['server_name']}}";
|
||||
bootbox.confirm({
|
||||
size: "",
|
||||
title: "{% raw translate('serverConfig', 'deleteFilesQuestion') %}",
|
||||
title: "{% raw translate('serverConfig', 'deleteFilesQuestion', data['lang']) %}",
|
||||
closeButton: false,
|
||||
message: "{% raw translate('serverConfig', 'deleteFilesQuestionMessage') %}",
|
||||
message: "{% raw translate('serverConfig', 'deleteFilesQuestionMessage', data['lang']) %}",
|
||||
buttons: {
|
||||
confirm: {
|
||||
label: "{{ translate('serverConfig', 'yesDeleteFiles') }}",
|
||||
label: "{{ translate('serverConfig', 'yesDeleteFiles', data['lang']) }}",
|
||||
className: 'btn-danger',
|
||||
},
|
||||
cancel: {
|
||||
label: "{{ translate('serverConfig', 'noDeleteFiles') }}",
|
||||
label: "{{ translate('serverConfig', 'noDeleteFiles', data['lang']) }}",
|
||||
className: 'btn-link',
|
||||
}
|
||||
},
|
||||
@ -252,8 +252,8 @@ let server_id = '{{ data['server_stats']['server_id']['server_id'] }}';
|
||||
setTimeout(function(){ window.location = '/panel/dashboard'; }, 5000);
|
||||
bootbox.dialog({
|
||||
backdrop: true,
|
||||
title: '{% raw translate("serverConfig", "sendingDelete") %}',
|
||||
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("serverConfig", "bePatientDelete") %} </div>',
|
||||
title: '{% raw translate("serverConfig", "sendingDelete", data['lang']) %}',
|
||||
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("serverConfig", "bePatientDelete", data['lang']) %} </div>',
|
||||
closeButton: false
|
||||
})
|
||||
|
||||
@ -263,8 +263,8 @@ let server_id = '{{ data['server_stats']['server_id']['server_id'] }}';
|
||||
setTimeout(function(){ window.location = '/panel/dashboard'; }, 5000);
|
||||
bootbox.dialog({
|
||||
backdrop: true,
|
||||
title: '{% raw translate("serverConfig", "sendingDelete") %}',
|
||||
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("serverConfig", "bePatientDeleteFiles") %} </div>',
|
||||
title: '{% raw translate("serverConfig", "sendingDelete", data['lang']) %}',
|
||||
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("serverConfig", "bePatientDeleteFiles", data['lang']) %} </div>',
|
||||
closeButton: false
|
||||
})
|
||||
}
|
||||
@ -277,16 +277,16 @@ let server_id = '{{ data['server_stats']['server_id']['server_id'] }}';
|
||||
name = "{{data['server_stats']['server_id']['server_name']}}";
|
||||
bootbox.confirm({
|
||||
size: "",
|
||||
title: "{% raw translate('serverConfig', 'deleteServerQuestion') %}",
|
||||
title: "{% raw translate('serverConfig', 'deleteServerQuestion', data['lang']) %}",
|
||||
closeButton: false,
|
||||
message: "{% raw translate('serverConfig', 'deleteServerQuestionMessage') %}",
|
||||
message: "{% raw translate('serverConfig', 'deleteServerQuestionMessage', data['lang']) %}",
|
||||
buttons: {
|
||||
confirm: {
|
||||
label: "{{ translate('serverConfig', 'yesDelete') }}",
|
||||
label: "{{ translate('serverConfig', 'yesDelete', data['lang']) }}",
|
||||
className: 'btn-danger',
|
||||
},
|
||||
cancel: {
|
||||
label: "{{ translate('serverConfig', 'noDelete') }}",
|
||||
label: "{{ translate('serverConfig', 'noDelete', data['lang']) }}",
|
||||
className: 'btn-link',
|
||||
}
|
||||
},
|
||||
|
@ -4,7 +4,7 @@
|
||||
<!-- <meta http-equiv="refresh" content="60">-->
|
||||
{% end %}
|
||||
|
||||
{% block title %}Crafty Controller - {{ translate('serverDetails', 'serverDetails') }}{% end %}
|
||||
{% block title %}Crafty Controller - {{ translate('serverDetails', 'serverDetails', data['lang']) }}{% end %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
<div class="col-12">
|
||||
<div class="page-header">
|
||||
<h4 class="page-title">
|
||||
{{ translate('serverDetails', 'serverDetails') }} - {{ data['server_stats']['server_id']['server_name'] }}
|
||||
{{ translate('serverDetails', 'serverDetails', data['lang']) }} - {{ data['server_stats']['server_id']['server_name'] }}
|
||||
<br />
|
||||
<small>UUID: {{ data['server_stats']['server_id']['server_uuid'] }}</small>
|
||||
</h4>
|
||||
@ -37,7 +37,7 @@
|
||||
<div class="row">
|
||||
<div class="col-md-6 col-sm-12">
|
||||
<noscript>
|
||||
{{ translate('serverFiles', 'noscript') }}
|
||||
{{ translate('serverFiles', 'noscript', data['lang']) }}
|
||||
</noscript>
|
||||
<div id="files-tree-nav" class="overlay">
|
||||
|
||||
@ -45,15 +45,15 @@
|
||||
|
||||
<!-- Overlay content -->
|
||||
<div id="files-tree-nav-content" class="overlay-content">
|
||||
<a onclick="createFileE(event)" href="javascript:void(0)" id="createFile" href="#">{{ translate('serverFiles', 'createFile') }}</a>
|
||||
<a onclick="createDirE(event)" href="javascript:void(0)" id="createDir" href="#">{{ translate('serverFiles', 'createDir') }}</a>
|
||||
<a onclick="renameItemE(event)" href="javascript:void(0)" id="renameItem" href="#">{{ translate('serverFiles', 'rename') }}</a>
|
||||
<a onclick="uploadFilesE(event)" href="javascript:void(0)" id="upload" href="#">{{ translate('serverFiles', 'upload') }}</a>
|
||||
<a onclick="unzipFilesE(event)" href="javascript:void(0)" id="unzip" href="#">{{ translate('serverFiles', 'unzip') }}</a>
|
||||
<a onclick="downloadFileE(event)" href="javascript:void(0)" id="downloadFile" href="#">{{ translate('serverFiles', 'download') }}</a>
|
||||
<a onclick="deleteFileE(event)" href="javascript:void(0)" id="deleteFile" href="#" style="color: red">{{ translate('serverFiles', 'delete') }}</a>
|
||||
<a onclick="deleteDirE(event)" href="javascript:void(0)" id="deleteDir" href="#" style="color: red">{{ translate('serverFiles', 'delete') }}</a>
|
||||
<a href="javascript:void(0)" class="closebtn" style="color: #8862e0;" onclick="document.getElementById('files-tree-nav').style.display = 'none';">{{ translate('serverFiles', 'close') }}</a>
|
||||
<a onclick="createFileE(event)" href="javascript:void(0)" id="createFile" href="#">{{ translate('serverFiles', 'createFile', data['lang']) }}</a>
|
||||
<a onclick="createDirE(event)" href="javascript:void(0)" id="createDir" href="#">{{ translate('serverFiles', 'createDir', data['lang']) }}</a>
|
||||
<a onclick="renameItemE(event)" href="javascript:void(0)" id="renameItem" href="#">{{ translate('serverFiles', 'rename', data['lang']) }}</a>
|
||||
<a onclick="uploadFilesE(event)" href="javascript:void(0)" id="upload" href="#">{{ translate('serverFiles', 'upload', data['lang']) }}</a>
|
||||
<a onclick="unzipFilesE(event)" href="javascript:void(0)" id="unzip" href="#">{{ translate('serverFiles', 'unzip', data['lang']) }}</a>
|
||||
<a onclick="downloadFileE(event)" href="javascript:void(0)" id="downloadFile" href="#">{{ translate('serverFiles', 'download', data['lang']) }}</a>
|
||||
<a onclick="deleteFileE(event)" href="javascript:void(0)" id="deleteFile" href="#" style="color: red">{{ translate('serverFiles', 'delete', data['lang']) }}</a>
|
||||
<a onclick="deleteDirE(event)" href="javascript:void(0)" id="deleteDir" href="#" style="color: red">{{ translate('serverFiles', 'delete', data['lang']) }}</a>
|
||||
<a href="javascript:void(0)" class="closebtn" style="color: #8862e0;" onclick="document.getElementById('files-tree-nav').style.display = 'none';">{{ translate('serverFiles', 'close', data['lang']) }}</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@ -137,10 +137,10 @@
|
||||
<div class="tree-caret tree-ctx-item files-tree-title">
|
||||
<i class="far fa-folder"></i>
|
||||
<i class="far fa-folder-open"></i>
|
||||
{{ translate('serverFiles', 'files') }}
|
||||
{{ translate('serverFiles', 'files', data['lang']) }}
|
||||
</div>
|
||||
<ul class="tree-nested" id="files-tree">
|
||||
<li>{{ translate('serverFiles', 'error') }}</li>
|
||||
<li>{{ translate('serverFiles', 'error', data['lang']) }}</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
@ -187,19 +187,19 @@
|
||||
<div class="col-md-6 col-sm-12">
|
||||
<h2 id="fileError"></h2>
|
||||
<div id="editorParent">
|
||||
{{ translate('serverFiles', 'editingFile') }} <span id="editingFile"></span>
|
||||
{{ translate('serverFiles', 'editingFile', data['lang']) }} <span id="editingFile"></span>
|
||||
<div id="editor" onresize="editor.resize()" style="resize: both;width: 100%;">file_contents</div>
|
||||
<br/>
|
||||
</div>
|
||||
{{ translate('serverFiles', 'keybindings') }}:
|
||||
{{ translate('serverFiles', 'keybindings', data['lang']) }}:
|
||||
<div class="btn-group" role="group">
|
||||
<button onclick="setKeyboard(event.target)" class="btn btn-primary" data-handler-name="null">{{ translate('serverFiles', 'default') }}</button>
|
||||
<button onclick="setKeyboard(event.target)" class="btn btn-primary" data-handler-name="null">{{ translate('serverFiles', 'default', data['lang']) }}</button>
|
||||
<button onclick="setKeyboard(event.target)" class="btn btn-secondary" data-handler-name="ace/keyboard/vim">Vim</button>
|
||||
<button onclick="setKeyboard(event.target)" class="btn btn-secondary" data-handler-name="ace/keyboard/emacs">Emacs</button>
|
||||
<button onclick="setKeyboard(event.target)" class="btn btn-secondary" data-handler-name="ace/keyboard/sublime">Sublime</button>
|
||||
</div>
|
||||
<h3 id="file_warn"></h3>
|
||||
<button class="btn btn-success" onclick="save()"><i class="fas fa-save"></i> {{ translate('serverFiles', 'save') }}</button>
|
||||
<button class="btn btn-success" onclick="save()"><i class="fas fa-save"></i> {{ translate('serverFiles', 'save', data['lang']) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -342,7 +342,7 @@
|
||||
if (json.error) {
|
||||
$('#editorParent').toggle(false) // hide
|
||||
$('#fileError').toggle(true) // show
|
||||
$('#fileError').text("{{ translate('serverFiles', 'fileReadError') }}: " + json.error) // show error
|
||||
$('#fileError').text("{{ translate('serverFiles', 'fileReadError', data['lang']) }}: " + json.error) // show error
|
||||
editor.blur()
|
||||
} else {
|
||||
$('#editorParent').toggle(true) // show
|
||||
@ -370,7 +370,7 @@
|
||||
setMode('txt');
|
||||
document
|
||||
.querySelector('#file_warn')
|
||||
.innerText = "{% raw translate('serverFiles', 'unsupportedLanguage') %}";
|
||||
.innerText = "{% raw translate('serverFiles', 'unsupportedLanguage', data['lang']) %}";
|
||||
}
|
||||
}
|
||||
|
||||
@ -392,7 +392,7 @@
|
||||
if (!aceMode.startsWith('ace/mode/')) {
|
||||
document
|
||||
.querySelector('#file_warn')
|
||||
.innerText = "{% raw translate('serverFiles', 'unsupportedLanguage') %}";
|
||||
.innerText = "{% raw translate('serverFiles', 'unsupportedLanguage', data['lang']) %}";
|
||||
} else {
|
||||
document
|
||||
.querySelector('#file_warn')
|
||||
@ -572,25 +572,25 @@
|
||||
"<input id='files' name='files' type='file' style='display:none;' multiple='true'>" +
|
||||
"<i class='fa fa-cloud-upload fa-3x'></i>" +
|
||||
"<br />" +
|
||||
"{{translate('serverFiles', 'clickUpload')}}" +
|
||||
"{{translate('serverFiles', 'clickUpload', data['lang'])}}" +
|
||||
"</label></form>" +
|
||||
"<br />" +
|
||||
"<ul style='margin-left:5px !important;' id='fileList'></ul>" +
|
||||
"</div><div class='clearfix'></div>";
|
||||
bootbox.dialog({
|
||||
message: uploadHtml,
|
||||
title: "{{ translate('serverFiles', 'uploadTitle')}}"+path,
|
||||
title: "{{ translate('serverFiles', 'uploadTitle', data['lang'])}}"+path,
|
||||
buttons: {
|
||||
success: {
|
||||
label: "{{ translate('serverFiles', 'upload') }}",
|
||||
label: "{{ translate('serverFiles', 'upload', data['lang']) }}",
|
||||
className: "btn-default",
|
||||
callback: async function () {
|
||||
var height = files.files.length*50;
|
||||
|
||||
var waitMessage = '<p class="text-center mb-0">'+
|
||||
'<i class="fa fa-spin fa-cog"></i>'+
|
||||
"{{ translate('serverFiles', 'waitUpload') }}"+'<br>'+
|
||||
'<strong>'+"{{ translate('serverFiles', 'stayHere') }}"+'</strong>'+
|
||||
"{{ translate('serverFiles', 'waitUpload', data['lang']) }}"+'<br>'+
|
||||
'<strong>'+"{{ translate('serverFiles', 'stayHere', data['lang']) }}"+'</strong>'+
|
||||
'</p>'+
|
||||
'<div class="progress" id="upload-progress-bar-parent" style="height:'+height +'px; width:100%; display: block;">'+
|
||||
'</div>'
|
||||
@ -769,7 +769,7 @@
|
||||
}
|
||||
|
||||
function createFileE(event) {
|
||||
bootbox.prompt("{% raw translate('serverFiles', 'createFileQuestion') %}", function(result) {
|
||||
bootbox.prompt("{% raw translate('serverFiles', 'createFileQuestion', data['lang']) %}", function(result) {
|
||||
path = event.target.parentElement.getAttribute('data-path');
|
||||
name = event.target.parentElement.getAttribute('data-name');
|
||||
if (!result) return;
|
||||
@ -782,7 +782,7 @@
|
||||
}
|
||||
|
||||
function createDirE(event) {
|
||||
bootbox.prompt("{% raw translate('serverFiles', 'createDirQuestion') %}", function(result) {
|
||||
bootbox.prompt("{% raw translate('serverFiles', 'createDirQuestion', data['lang']) %}", function(result) {
|
||||
path = event.target.parentElement.getAttribute('data-path');
|
||||
name = event.target.parentElement.getAttribute('data-name');
|
||||
if (!result) return;
|
||||
@ -803,7 +803,7 @@
|
||||
path = event.target.parentElement.getAttribute('data-path');
|
||||
name = event.target.parentElement.getAttribute('data-name');
|
||||
bootbox.prompt({
|
||||
title: "{% raw translate('serverFiles', 'renameItemQuestion') %}",
|
||||
title: "{% raw translate('serverFiles', 'renameItemQuestion', data['lang']) %}",
|
||||
value: name,
|
||||
callback: function(result) {
|
||||
if (!result) return;
|
||||
@ -824,16 +824,16 @@
|
||||
name = event.target.parentElement.getAttribute('data-name');
|
||||
bootbox.confirm({
|
||||
size: "",
|
||||
title: "{% raw translate('serverFiles', 'deleteItemQuestion') %}",
|
||||
title: "{% raw translate('serverFiles', 'deleteItemQuestion', data['lang']) %}",
|
||||
closeButton: false,
|
||||
message: "{% raw translate('serverFiles', 'deleteItemQuestionMessage') %}",
|
||||
message: "{% raw translate('serverFiles', 'deleteItemQuestionMessage', data['lang']) %}",
|
||||
buttons: {
|
||||
confirm: {
|
||||
label: "{{ translate('serverFiles', 'yesDelete') }}",
|
||||
label: "{{ translate('serverFiles', 'yesDelete', data['lang']) }}",
|
||||
className: 'btn-danger'
|
||||
},
|
||||
cancel: {
|
||||
label: "{{ translate('serverFiles', 'noDelete') }}",
|
||||
label: "{{ translate('serverFiles', 'noDelete', data['lang']) }}",
|
||||
className: 'btn-link'
|
||||
}
|
||||
},
|
||||
@ -852,16 +852,16 @@
|
||||
name = event.target.parentElement.getAttribute('data-name');
|
||||
bootbox.confirm({
|
||||
size: "",
|
||||
title: "{% raw translate('serverFiles', 'deleteItemQuestion') %}",
|
||||
title: "{% raw translate('serverFiles', 'deleteItemQuestion', data['lang']) %}",
|
||||
closeButton: false,
|
||||
message: "{% raw translate('serverFiles', 'deleteItemQuestionMessage') %}",
|
||||
message: "{% raw translate('serverFiles', 'deleteItemQuestionMessage', data['lang']) %}",
|
||||
buttons: {
|
||||
confirm: {
|
||||
label: "{{ translate('serverFiles', 'yesDelete') }}",
|
||||
label: "{{ translate('serverFiles', 'yesDelete', data['lang']) }}",
|
||||
className: 'btn-danger'
|
||||
},
|
||||
cancel: {
|
||||
label: "{{ translate('serverFiles', 'noDelete') }}",
|
||||
label: "{{ translate('serverFiles', 'noDelete', data['lang']) }}",
|
||||
className: 'btn-link'
|
||||
}
|
||||
},
|
||||
|
@ -4,7 +4,7 @@
|
||||
<!-- <meta http-equiv="refresh" content="60">-->
|
||||
{% end %}
|
||||
|
||||
{% block title %}Crafty Controller - {{ translate('serverDetails', 'serverDetails') }}{% end %}
|
||||
{% block title %}Crafty Controller - {{ translate('serverDetails', 'serverDetails', data['lang']) }}{% end %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
<div class="col-12">
|
||||
<div class="page-header">
|
||||
<h4 class="page-title">
|
||||
{{ translate('serverDetails', 'serverDetails') }} - {{ data['server_stats']['server_id']['server_name'] }}
|
||||
{{ translate('serverDetails', 'serverDetails', data['lang']) }} - {{ data['server_stats']['server_id']['server_name'] }}
|
||||
<br />
|
||||
<small>UUID: {{ data['server_stats']['server_id']['server_uuid'] }}</small>
|
||||
</h4>
|
||||
|
@ -4,7 +4,7 @@
|
||||
<!-- <meta http-equiv="refresh" content="60">-->
|
||||
{% end %}
|
||||
|
||||
{% block title %}Crafty Controller - {{ translate('serverDetails', 'serverDetails') }}{% end %}
|
||||
{% block title %}Crafty Controller - {{ translate('serverDetails', 'serverDetails', data['lang']) }}{% end %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
<div class="col-12">
|
||||
<div class="page-header">
|
||||
<h4 class="page-title">
|
||||
{{ translate('serverDetails', 'serverDetails') }} - {{ data['server_stats']['server_id']['server_name'] }}
|
||||
{{ translate('serverDetails', 'serverDetails', data['lang']) }} - {{ data['server_stats']['server_id']['server_name'] }}
|
||||
<br />
|
||||
<small>UUID: {{ data['server_stats']['server_id']['server_uuid'] }}</small>
|
||||
</h4>
|
||||
@ -41,30 +41,30 @@
|
||||
<br />
|
||||
|
||||
<div style="gap: 0.5rem;" class="input-group flex-wrap">
|
||||
<input style="min-width: 10rem;" type="text" class="form-control" id="server_command" name="server_command" placeholder="{{ translate('serverTerm', 'commandInput') }}" autofocus="">
|
||||
<input style="min-width: 10rem;" type="text" class="form-control" id="server_command" name="server_command" placeholder="{{ translate('serverTerm', 'commandInput', data['lang']) }}" autofocus="">
|
||||
<span class="input-group-btn ml-5">
|
||||
<input type="hidden" value="" id="last_command"/>
|
||||
<button id="submit" class="btn btn-sm btn-info" type="button">{{ translate('serverTerm', 'sendCommand') }}</button>
|
||||
<button id="submit" class="btn btn-sm btn-info" type="button">{{ translate('serverTerm', 'sendCommand', data['lang']) }}</button>
|
||||
</span>
|
||||
</div>
|
||||
{% if data['permissions']['Commands'] in data['user_permissions'] %}
|
||||
{% if data['server_stats']['updating']%}
|
||||
<div id="update_control_buttons" class="mt-4 flex-wrap d-flex justify-content-between justify-content-md-center align-items-center px-5 px-md-0" style="visibility: visible">
|
||||
<button onclick="" id="start-btn" style="max-width: 7rem;" class="btn btn-warning m-1 flex-grow-1 disabled">{{ translate('serverTerm', 'updating') }}</button>
|
||||
<button onclick="" id="restart-btn" style="max-width: 7rem;" class="btn btn-outline-primary m-1 flex-grow-1 disabled">{% raw translate('serverTerm', 'restart') %}</button>
|
||||
<button onclick="" id="stop-btn" style="max-width: 7rem;" class="btn btn-danger m-1 flex-grow-1 disabled">{{ translate('serverTerm', 'stop') }}</button>
|
||||
<button onclick="" id="start-btn" style="max-width: 7rem;" class="btn btn-warning m-1 flex-grow-1 disabled">{{ translate('serverTerm', 'updating', data['lang']) }}</button>
|
||||
<button onclick="" id="restart-btn" style="max-width: 7rem;" class="btn btn-outline-primary m-1 flex-grow-1 disabled">{% raw translate('serverTerm', 'restart', data['lang']) %}</button>
|
||||
<button onclick="" id="stop-btn" style="max-width: 7rem;" class="btn btn-danger m-1 flex-grow-1 disabled">{{ translate('serverTerm', 'stop', data['lang']) }}</button>
|
||||
</div>
|
||||
{% elif data['waiting_start'] %}
|
||||
<div id="control_buttons" class="mt-4 flex-wrap d-flex justify-content-between justify-content-md-center align-items-center px-5 px-md-0" style="visibility: visible">
|
||||
<button onclick="" id="start-btn" style="max-width: 7rem; white-space: nowrap;" class="btn btn-secondary m-1 flex-grow-1 disabled" data-toggle="tooltip" title="{{ translate('serverTerm', 'delay-explained')}}">{{ translate('serverTerm', 'starting') }}</button>
|
||||
<button onclick="" id="restart-btn" style="max-width: 7rem;" class="btn btn-outline-primary m-1 flex-grow-1 disabled">{% raw translate('serverTerm', 'restart') %}</button>
|
||||
<button onclick="" id="stop-btn" style="max-width: 7rem;" class="btn btn-danger m-1 flex-grow-1 disabled">{{ translate('serverTerm', 'stop') }}</button>
|
||||
<button onclick="" id="start-btn" style="max-width: 7rem; white-space: nowrap;" class="btn btn-secondary m-1 flex-grow-1 disabled" data-toggle="tooltip" title="{{ translate('serverTerm', 'delay-explained', data['lang'])}}">{{ translate('serverTerm', 'starting', data['lang']) }}</button>
|
||||
<button onclick="" id="restart-btn" style="max-width: 7rem;" class="btn btn-outline-primary m-1 flex-grow-1 disabled">{% raw translate('serverTerm', 'restart', data['lang']) %}</button>
|
||||
<button onclick="" id="stop-btn" style="max-width: 7rem;" class="btn btn-danger m-1 flex-grow-1 disabled">{{ translate('serverTerm', 'stop', data['lang']) }}</button>
|
||||
</div>
|
||||
{% else %}
|
||||
<div id="control_buttons" class="mt-4 flex-wrap d-flex justify-content-between justify-content-md-center align-items-center px-5 px-md-0" style="visibility: visible">
|
||||
<button onclick="send_command(server_id, 'start_server');" id="start-btn" style="max-width: 7rem;" class="btn btn-primary m-1 flex-grow-1">{{ translate('serverTerm', 'start') }}</button>
|
||||
<button onclick="send_command(server_id, 'restart_server');" id="restart-btn" style="max-width: 7rem;" class="btn btn-outline-primary m-1 flex-grow-1">{% raw translate('serverTerm', 'restart') %}</button>
|
||||
<button onclick="send_command(server_id, 'stop_server');" id="stop-btn" style="max-width: 7rem;" class="btn btn-danger m-1 flex-grow-1">{{ translate('serverTerm', 'stop') }}</button>
|
||||
<button onclick="send_command(server_id, 'start_server');" id="start-btn" style="max-width: 7rem;" class="btn btn-primary m-1 flex-grow-1">{{ translate('serverTerm', 'start', data['lang']) }}</button>
|
||||
<button onclick="send_command(server_id, 'restart_server');" id="restart-btn" style="max-width: 7rem;" class="btn btn-outline-primary m-1 flex-grow-1">{% raw translate('serverTerm', 'restart', data['lang']) %}</button>
|
||||
<button onclick="send_command(server_id, 'stop_server');" id="stop-btn" style="max-width: 7rem;" class="btn btn-danger m-1 flex-grow-1">{{ translate('serverTerm', 'stop', data['lang']) }}</button>
|
||||
</div>
|
||||
{% end %}
|
||||
{% end %}
|
||||
@ -128,11 +128,11 @@
|
||||
webSocket.on('update_button_status', function (updateButton) {
|
||||
if (updateButton.isUpdating){
|
||||
console.log(updateButton.isUpdating)
|
||||
document.getElementById('control_buttons').innerHTML = '<button onclick="" id="start-btn" style="max-width: 7rem;" class="btn btn-primary m-1 flex-grow-1">{{ translate("serverTerm", "updating") }}</button><button onclick="" id="restart-btn" style="max-width: 7rem;" class="btn btn-outline-primary m-1 flex-grow-1">{% raw translate("serverTerm", "restart") %}</button><button onclick="" id="stop-btn" style="max-width: 7rem;" class="btn btn-danger m-1 flex-grow-1 disabled">{{ translate("serverTerm", "stop") }}</button>';
|
||||
document.getElementById('control_buttons').innerHTML = '<button onclick="" id="start-btn" style="max-width: 7rem;" class="btn btn-primary m-1 flex-grow-1">{{ translate("serverTerm", "updating", data['lang']) }}</button><button onclick="" id="restart-btn" style="max-width: 7rem;" class="btn btn-outline-primary m-1 flex-grow-1">{% raw translate("serverTerm", "restart", data['lang']) %}</button><button onclick="" id="stop-btn" style="max-width: 7rem;" class="btn btn-danger m-1 flex-grow-1 disabled">{{ translate("serverTerm", "stop", data['lang']) }}</button>';
|
||||
}
|
||||
else{
|
||||
window.location.reload()
|
||||
document.getElementById('update_control_buttons').innerHTML = '<button onclick="send_command(server_id, "start_server");" id="start-btn" style="max-width: 7rem;" class="btn btn-primary m-1 flex-grow-1">{{ translate("serverTerm", "start") }}</button><button onclick="send_command(server_id, "restart_server");" id="restart-btn" style="max-width: 7rem;" class="btn btn-outline-primary m-1 flex-grow-1">{% raw translate("serverTerm", "restart") %}</button><button onclick="" id="stop-btn" style="max-width: 7rem;" class="btn btn-danger m-1 flex-grow-1 disabled">{{ translate("serverTerm", "stop") }}</button>';
|
||||
document.getElementById('update_control_buttons').innerHTML = '<button onclick="send_command(server_id, "start_server");" id="start-btn" style="max-width: 7rem;" class="btn btn-primary m-1 flex-grow-1">{{ translate("serverTerm", "start", data['lang']) }}</button><button onclick="send_command(server_id, "restart_server");" id="restart-btn" style="max-width: 7rem;" class="btn btn-outline-primary m-1 flex-grow-1">{% raw translate("serverTerm", "restart", data['lang']) %}</button><button onclick="" id="stop-btn" style="max-width: 7rem;" class="btn btn-danger m-1 flex-grow-1 disabled">{{ translate("serverTerm", "stop", data['lang']) }}</button>';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -33,11 +33,11 @@
|
||||
<div class="card card-statistics social-card facebook-card card-colored">
|
||||
<div class="card-body">
|
||||
<h4 class="platform-name mb-3 mt-4 font-weight-semibold user-name">404</h4>
|
||||
<h5 class="headline font-weight-medium">{{ translate('404', 'notFound') }}</h5>
|
||||
<h5 class="headline font-weight-medium">{{ translate('404', 'notFound', data['lang']) }}</h5>
|
||||
<p class="mb-2 comment font-weight-light">
|
||||
{{ translate('404', 'unableToFind') }}
|
||||
{{ translate('404', 'unableToFind', data['lang']) }}
|
||||
<br /><br />
|
||||
<a class="d-inline font-weight-medium" href="https://discord.gg/9VJPhCE"> {{ translate('404', 'contact') }}</a>
|
||||
<a class="d-inline font-weight-medium" href="https://discord.gg/9VJPhCE"> {{ translate('404', 'contact', data['lang']) }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -32,15 +32,15 @@
|
||||
<div class="col-sm-12 grid-margin stretch-card">
|
||||
<div class="card card-statistics social-card google-card card-colored">
|
||||
<div class="card-body">
|
||||
<h4 class="platform-name mb-3 mt-4 font-weight-semibold user-name">{{ translate('error', 'error') }}</h4>
|
||||
<h5 class="headline font-weight-medium">{{ translate('error', 'terribleFailure') }}</h5>
|
||||
<h4 class="platform-name mb-3 mt-4 font-weight-semibold user-name">{{ translate('error', 'error', data['lang']) }}</h4>
|
||||
<h5 class="headline font-weight-medium">{{ translate('error', 'terribleFailure', data['lang']) }}</h5>
|
||||
<p class="mb-2 comment font-weight-light">
|
||||
{{ translate('error', 'embarassing') }}<br />
|
||||
{{ translate('error', 'embarassing', data['lang']) }}<br />
|
||||
<br />
|
||||
<b>{{ translate('error', 'hereIsTheError') }}: {{data['error']}}</b><br /><br />
|
||||
<b>{{ translate('error', 'hereIsTheError', data['lang']) }}: {{data['error']}}</b><br /><br />
|
||||
That's all the help I can give you - Godspeed
|
||||
<br /><br />
|
||||
<a class="d-inline font-weight-medium" href="https://discord.gg/9VJPhCE"> {{ translate('error', 'contact') }}</a>
|
||||
<a class="d-inline font-weight-medium" href="https://discord.gg/9VJPhCE"> {{ translate('error', 'contact', data['lang']) }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -57,25 +57,25 @@
|
||||
<form action="/public/login" method="post">
|
||||
{% raw xsrf_form_html() %}
|
||||
<div class="form-group">
|
||||
<label class="label">{{ translate('login', 'username') }}</label>
|
||||
<label class="label">{{ translate('login', 'username', data['lang']) }}</label>
|
||||
<div class="input-group">
|
||||
<input type="text" class="form-control login-text-input login-input" placeholder="{{ translate('login', 'username') }}" name="username" id="username" required="true">
|
||||
<input type="text" class="form-control login-text-input login-input" placeholder="{{ translate('login', 'username', data['lang']) }}" name="username" id="username" required="true">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="label">{{ translate('login', 'password') }}</label>
|
||||
<label class="label">{{ translate('login', 'password', data['lang']) }}</label>
|
||||
<div class="input-group">
|
||||
<input type="password" class="form-control login-text-input login-input" placeholder="{{ translate('login', 'password') }}" name="password" id="password" required="true">
|
||||
<input type="password" class="form-control login-text-input login-input" placeholder="{{ translate('login', 'password', data['lang']) }}" name="password" id="password" required="true">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<button class="login-input btn btn-primary submit-btn btn-block">{{ translate('login', 'login') }}</button>
|
||||
<button class="login-input btn btn-primary submit-btn btn-block">{{ translate('login', 'login', data['lang']) }}</button>
|
||||
</div>
|
||||
<div class="form-group d-flex justify-content-between">
|
||||
<div class="form-check form-check-flat mt-0">
|
||||
|
||||
</div>
|
||||
<a href="#" class="text-small forgot-password ">{{ translate('login', 'forgotPassword') }}</a>
|
||||
<a href="#" class="text-small forgot-password ">{{ translate('login', 'forgotPassword', data['lang']) }}</a>
|
||||
</div>
|
||||
|
||||
<div class="text-block text-center my-3">
|
||||
|
@ -4,7 +4,7 @@
|
||||
<meta http-equiv="refresh" content="30">
|
||||
{% end %}
|
||||
|
||||
{% block title %}Crafty Controller - {{ translate('dashboard', 'dashboard') }}{% end %}
|
||||
{% block title %}Crafty Controller - {{ translate('dashboard', 'dashboard', data['lang']) }}{% end %}
|
||||
|
||||
{% block content %}
|
||||
<div class="content-wrapper col-md login-modal" style="background-color: #222437;">
|
||||
@ -14,11 +14,11 @@
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr class="rounded">
|
||||
<th>{{ translate('dashboard', 'server') }}</th>
|
||||
<th>{{ translate('dashboard', 'players') }}</th>
|
||||
<th>{{ translate('dashboard', 'motd') }}</th>
|
||||
<th>{{ translate('dashboard', 'version') }}</th>
|
||||
<th>{{ translate('dashboard', 'status') }}</th>
|
||||
<th>{{ translate('dashboard', 'server', data['lang']) }}</th>
|
||||
<th>{{ translate('dashboard', 'players', data['lang']) }}</th>
|
||||
<th>{{ translate('dashboard', 'motd', data['lang']) }}</th>
|
||||
<th>{{ translate('dashboard', 'version', data['lang']) }}</th>
|
||||
<th>{{ translate('dashboard', 'status', data['lang']) }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -30,7 +30,7 @@
|
||||
</td>
|
||||
{% if server['stats']['int_ping_results'] != 'False' %}
|
||||
<td>
|
||||
{{ server['stats']['online'] }} / {{ server['stats']['max'] }} {{ translate('dashboard', 'max') }}<br />
|
||||
{{ server['stats']['online'] }} / {{ server['stats']['max'] }} {{ translate('dashboard', 'max', data['lang']) }}<br />
|
||||
</td>
|
||||
<td>
|
||||
{% if server['stats']['desc'] != 'False' %}
|
||||
@ -53,10 +53,10 @@
|
||||
</td>
|
||||
{% end %}
|
||||
<td>
|
||||
{% if server['stats']['int_ping_results'] %}
|
||||
<span class="text-success"><i class="fas fa-signal"></i> {{ translate('dashboard', 'online') }}</span>
|
||||
{% if server['stats']['running'] %}
|
||||
<span class="text-success"><i class="fas fa-signal"></i> {{ translate('dashboard', 'online', data['lang']) }}</span>
|
||||
{% else %}
|
||||
<span class="text-danger"><i class="fas fa-ban"></i> {{ translate('dashboard', 'offline') }}</span>
|
||||
<span class="text-danger"><i class="fas fa-ban"></i> {{ translate('dashboard', 'offline', data['lang']) }}</span>
|
||||
{% end %}
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -1,327 +1,327 @@
|
||||
{% extends ../base.html %}
|
||||
|
||||
{% block title %}Crafty Controller - {{ translate('serverWizard', 'newServer') }}{% end %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="content-wrapper">
|
||||
<div class="row">
|
||||
<div class="col-sm-6 grid-margin stretch-card">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
|
||||
<h4>{{ translate('serverWizard', 'newServer') }}</h4>
|
||||
<br />
|
||||
<p class="card-description">
|
||||
|
||||
<form method="post" class="server-wizard">
|
||||
{% raw xsrf_form_html() %}
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server_type">{{ translate('serverWizard', 'serverType') }}</label>
|
||||
<select class="form-control form-control-lg select-css" id="server_type" name="server_type" onchange="serverTypeChange(this)">
|
||||
{% for s in data['server_types'] %}
|
||||
<option value="{{ s }}">{{ s.capitalize() }}</option>
|
||||
{% end %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server_version">{{ translate('serverWizard', 'serverVersion') }}</label>
|
||||
<select class="form-control form-control-lg select-css" id="server" name="server">
|
||||
<option value="0">Select a Version</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server_name">{{ translate('serverWizard', 'serverName') }}</label>
|
||||
<input type="text" class="form-control" id="server_name" name="server_name" placeholder="{{ translate('serverWizard', 'myNewServer') }}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<br />
|
||||
<h4 class="card-title">{{ translate('serverWizard', 'quickSettings') }} <small style="text-transform: none;"> - {{ translate('serverWizard', 'quickSettingsDescription') }}</small></h4>
|
||||
<hr>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm-3">
|
||||
<div class="form-group">
|
||||
<label for="min_memory1">{{ translate('serverWizard', 'minMem') }} <small> - {{ translate('serverWizard', 'sizeInGB') }}</small></label>
|
||||
<input type="number" class="form-control" id="min_memory1" name="min_memory" value="1" step="0.5" min="0.5">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 offset-1">
|
||||
<div class="form-group">
|
||||
<label for="max_memory1">{{ translate('serverWizard', 'maxMem') }} <small> - {{ translate('serverWizard', 'sizeInGB') }}</small></label>
|
||||
<input type="number" class="form-control" id="max_memory1" name="max_memory" value="2" step="0.5" min="0.5">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 offset-1">
|
||||
<div class="form-group">
|
||||
<label for="port1">{{ translate('serverWizard', 'serverPort') }} <small> - {{ translate('serverWizard', 'defaultPort') }}</small></label>
|
||||
<input type="number" class="form-control" id="port1" name="port" value="25565" step="1" min="1">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary mr-2" onclick="wait_msg()">{{ translate('serverWizard', 'buildServer') }}</button>
|
||||
<button type="reset" class="btn btn-danger mr-2">{{ translate('serverWizard', 'resetForm') }}</button>
|
||||
|
||||
</form>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 grid-margin stretch-card">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
|
||||
<h4>{{ translate('serverWizard', 'importServer') }}</h4>
|
||||
<br />
|
||||
<p class="card-description">
|
||||
|
||||
<form method="post" class="server-wizard">
|
||||
{% raw xsrf_form_html() %}
|
||||
<input type="hidden" value="import_jar" name="create_type">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server_name">{{ translate('serverWizard', 'serverName') }}</label>
|
||||
<input type="text" class="form-control" id="server_name" name="server_name" value="" placeholder="{{ translate('serverWizard', 'myNewServer') }}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server">{{ translate('serverWizard', 'serverPath') }} <small>{{ translate('serverWizard', 'absoluteServerPath') }}</small></label>
|
||||
<input type="text" class="form-control" id="server_path" name="server_path" placeholder="/var/opt/server">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server_jar">{{ translate('serverWizard', 'serverJar') }}</label>
|
||||
<input type="text" class="form-control" id="server_jar" name="server_jar" value="" placeholder="paper.jar">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<br />
|
||||
<h4 class="card-title">{{ translate('serverWizard', 'quickSettings') }} <small style="text-transform: none;"> - {{ translate('serverWizard', 'quickSettingsDescription') }}</small></h4>
|
||||
<hr>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm-3">
|
||||
<div class="form-group">
|
||||
<label for="min_memory2">{{ translate('serverWizard', 'minMem') }} <small> - {{ translate('serverWizard', 'sizeInGB') }}</small></label>
|
||||
<input type="number" class="form-control" id="min_memory2" name="min_memory" value="1" step="0.5" min="0.5">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 offset-1">
|
||||
<div class="form-group">
|
||||
<label for="max_memory2">{{ translate('serverWizard', 'maxMem') }} <small> - {{ translate('serverWizard', 'sizeInGB') }}</small></label>
|
||||
<input type="number" class="form-control" id="max_memory2" name="max_memory" value="2" step="0.5" min="0.5">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 offset-1">
|
||||
<div class="form-group">
|
||||
<label for="port2">{{ translate('serverWizard', 'serverPort') }} <small> - {{ translate('serverWizard', 'defaultPort') }}</small></label>
|
||||
<input type="number" class="form-control" id="port2" name="port" value="25565" step="1" min="1">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary mr-2" onclick="wait_msg(true)">{{ translate('serverWizard', 'importServerButton') }}</button>
|
||||
<button type="reset" class="btn btn-danger mr-2">{{ translate('serverWizard', 'resetForm') }}</button>
|
||||
|
||||
</form>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-13 grid-margin stretch-card">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
|
||||
<h4>{{ translate('serverWizard', 'importZip') }}</h4>
|
||||
<br />
|
||||
<p class="card-description">
|
||||
|
||||
<form method="post" class="server-wizard">
|
||||
{% raw xsrf_form_html() %}
|
||||
<input type="hidden" value="import_zip" name="create_type">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-9">
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server_name">{{ translate('serverWizard', 'serverName') }}</label>
|
||||
<input type="text" class="form-control" id="server_name" name="server_name" value="" placeholder="{{ translate('serverWizard', 'myNewServer') }}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server">{{ translate('serverWizard', 'zipPath') }} <small>{{ translate('serverWizard', 'absoluteZipPath') }}</small></label>
|
||||
<input type="text" class="form-control" id="server_path" name="server_path" placeholder="/var/opt/server.zip">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server_jar">{{ translate('serverWizard', 'serverJar') }}</label>
|
||||
<input type="text" class="form-control" id="server_jar" name="server_jar" value="" placeholder="paper.jar">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="col-sm-3">
|
||||
<h4 class="card-title">{{ translate('serverWizard', 'quickSettings') }} <small style="text-transform: none;"> - {{ translate('serverWizard', 'quickSettingsDescription') }}</small></h4>
|
||||
<hr>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="min_memory3">{{ translate('serverWizard', 'minMem') }} <small> - {{ translate('serverWizard', 'sizeInGB') }}</small></label>
|
||||
<input type="number" class="form-control" id="min_memory3" name="min_memory" value="1" step="0.5" min="0.5">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="max_memory3">{{ translate('serverWizard', 'maxMem') }} <small> - {{ translate('serverWizard', 'sizeInGB') }}</small></label>
|
||||
<input type="number" class="form-control" id="max_memory3" name="max_memory" value="2" step="0.5" min="0.5">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="port3">{{ translate('serverWizard', 'serverPort') }} <small> - {{ translate('serverWizard', 'defaultPort') }}</small></label>
|
||||
<input type="number" class="form-control" id="port3" name="port" value="25565" step="1" min="1">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary mr-2" onclick="wait_msg(true)">{{ translate('serverWizard', 'importServerButton') }}</button>
|
||||
<button type="reset" class="btn btn-danger mr-2">{{ translate('serverWizard', 'resetForm') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% end %}
|
||||
|
||||
{% block js%}
|
||||
|
||||
<script>
|
||||
$( document ).ready(function() {
|
||||
console.log('ready');
|
||||
var forms = $('form.server-wizard');
|
||||
forms.each(function(i, formEl) {
|
||||
var form = $(formEl);
|
||||
var min = form.find('[name=min_memory]');
|
||||
var max = form.find('[name=max_memory]');
|
||||
console.log(form, min, max)
|
||||
min.change(function(){
|
||||
check_sizes(max, min, 'min');
|
||||
});
|
||||
max.change(function(){
|
||||
check_sizes(max, min, 'max');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
function wait_msg(importing){
|
||||
bootbox.alert({
|
||||
title: importing ? '{% raw translate("serverWizard", "importing") %}' : '{% raw translate("serverWizard", "downloading") %}',
|
||||
message: '<i class="fas fa-cloud-download"></i> {% raw translate("serverWizard", "bePatient") %}'
|
||||
});
|
||||
}
|
||||
|
||||
function check_sizes(a, b, changed){
|
||||
max_mem = parseFloat(a.val());
|
||||
min_mem = parseFloat(b.val());
|
||||
if (max_mem < min_mem && changed === 'min'){
|
||||
a.val(min_mem)
|
||||
}
|
||||
if (max_mem < min_mem && changed === 'max'){
|
||||
b.val(max_mem)
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
//<![CDATA[
|
||||
// array of possible countries in the same order as they appear in the country selection list
|
||||
|
||||
function decodeHtmlCharCodes(str) {
|
||||
return str.replace(""", "\"");
|
||||
}
|
||||
|
||||
function convertHtmlJsonToJavacriptArray(str) {
|
||||
var result = []
|
||||
str = decodeHtmlCharCodes(str)
|
||||
for(var i in str)
|
||||
result.push([i, str [i]]);
|
||||
return result
|
||||
}
|
||||
|
||||
var text = '{% raw data["js_server_types"] %}';
|
||||
var serverTypesLists = JSON.parse(text);
|
||||
//convertHtmlJsonToJavacriptArray('{{ data["js_server_types"] }}')
|
||||
/* CountryChange() is called from the onchange event of a select element.
|
||||
* param selectObj - the select object which fired the on change event.
|
||||
*/
|
||||
function serverTypeChange(selectObj) {
|
||||
// get the index of the selected option
|
||||
var idx = selectObj.selectedIndex;
|
||||
// get the value of the selected option
|
||||
var which = selectObj.options[idx].value;
|
||||
// use the selected option value to retrieve the list of items from the serverTypesLists array
|
||||
cList = serverTypesLists[which];
|
||||
// get the country select element via its known id
|
||||
var cSelect = document.getElementById("server");
|
||||
// remove the current options from the country select
|
||||
var len=cSelect.options.length;
|
||||
while (cSelect.options.length > 0) {
|
||||
cSelect.remove(0);
|
||||
}
|
||||
var newOption;
|
||||
// create new options
|
||||
for (var i=0; i<cList.length; i++) {
|
||||
newOption = document.createElement("option");
|
||||
newOption.value = which+"|"+cList[i]; // assumes option string and value are the same
|
||||
newOption.text=cList[i];
|
||||
// add the new option
|
||||
try {
|
||||
cSelect.add(newOption); // this will fail in DOM browsers but is needed for IE
|
||||
}
|
||||
catch (e) {
|
||||
cSelect.appendChild(newOption);
|
||||
}
|
||||
}
|
||||
}
|
||||
//]]>
|
||||
</script>
|
||||
{% extends ../base.html %}
|
||||
|
||||
{% block title %}Crafty Controller - {{ translate('serverWizard', 'newServer', data['lang']) }}{% end %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="content-wrapper">
|
||||
<div class="row">
|
||||
<div class="col-sm-6 grid-margin stretch-card">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
|
||||
<h4>{{ translate('serverWizard', 'newServer', data['lang']) }}</h4>
|
||||
<br />
|
||||
<p class="card-description">
|
||||
|
||||
<form method="post" class="server-wizard">
|
||||
{% raw xsrf_form_html() %}
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server_type">{{ translate('serverWizard', 'serverType', data['lang']) }}</label>
|
||||
<select class="form-control form-control-lg select-css" id="server_type" name="server_type" onchange="serverTypeChange(this)">
|
||||
{% for s in data['server_types'] %}
|
||||
<option value="{{ s }}">{{ s.capitalize() }}</option>
|
||||
{% end %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server_version">{{ translate('serverWizard', 'serverVersion', data['lang']) }}</label>
|
||||
<select class="form-control form-control-lg select-css" id="server" name="server">
|
||||
<option value="0">Select a Version</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server_name">{{ translate('serverWizard', 'serverName', data['lang']) }}</label>
|
||||
<input type="text" class="form-control" id="server_name" name="server_name" placeholder="{{ translate('serverWizard', 'myNewServer', data['lang']) }}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<br />
|
||||
<h4 class="card-title">{{ translate('serverWizard', 'quickSettings', data['lang']) }} <small style="text-transform: none;"> - {{ translate('serverWizard', 'quickSettingsDescription', data['lang']) }}</small></h4>
|
||||
<hr>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm-3">
|
||||
<div class="form-group">
|
||||
<label for="min_memory1">{{ translate('serverWizard', 'minMem', data['lang']) }} <small> - {{ translate('serverWizard', 'sizeInGB', data['lang']) }}</small></label>
|
||||
<input type="number" class="form-control" id="min_memory1" name="min_memory" value="1" step="0.5" min="0.5">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 offset-1">
|
||||
<div class="form-group">
|
||||
<label for="max_memory1">{{ translate('serverWizard', 'maxMem', data['lang']) }} <small> - {{ translate('serverWizard', 'sizeInGB', data['lang']) }}</small></label>
|
||||
<input type="number" class="form-control" id="max_memory1" name="max_memory" value="2" step="0.5" min="0.5">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 offset-1">
|
||||
<div class="form-group">
|
||||
<label for="port1">{{ translate('serverWizard', 'serverPort', data['lang']) }} <small> - {{ translate('serverWizard', 'defaultPort', data['lang']) }}</small></label>
|
||||
<input type="number" class="form-control" id="port1" name="port" value="25565" step="1" min="1">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary mr-2" onclick="wait_msg()">{{ translate('serverWizard', 'buildServer', data['lang']) }}</button>
|
||||
<button type="reset" class="btn btn-danger mr-2">{{ translate('serverWizard', 'resetForm', data['lang']) }}</button>
|
||||
|
||||
</form>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 grid-margin stretch-card">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
|
||||
<h4>{{ translate('serverWizard', 'importServer', data['lang']) }}</h4>
|
||||
<br />
|
||||
<p class="card-description">
|
||||
|
||||
<form method="post" class="server-wizard">
|
||||
{% raw xsrf_form_html() %}
|
||||
<input type="hidden" value="import_jar" name="create_type">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server_name">{{ translate('serverWizard', 'serverName', data['lang']) }}</label>
|
||||
<input type="text" class="form-control" id="server_name" name="server_name" value="" placeholder="{{ translate('serverWizard', 'myNewServer', data['lang']) }}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server">{{ translate('serverWizard', 'serverPath', data['lang']) }} <small>{{ translate('serverWizard', 'absoluteServerPath', data['lang']) }}</small></label>
|
||||
<input type="text" class="form-control" id="server_path" name="server_path" placeholder="/var/opt/server">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server_jar">{{ translate('serverWizard', 'serverJar', data['lang']) }}</label>
|
||||
<input type="text" class="form-control" id="server_jar" name="server_jar" value="" placeholder="paper.jar">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<br />
|
||||
<h4 class="card-title">{{ translate('serverWizard', 'quickSettings', data['lang']) }} <small style="text-transform: none;"> - {{ translate('serverWizard', 'quickSettingsDescription', data['lang']) }}</small></h4>
|
||||
<hr>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm-3">
|
||||
<div class="form-group">
|
||||
<label for="min_memory2">{{ translate('serverWizard', 'minMem', data['lang']) }} <small> - {{ translate('serverWizard', 'sizeInGB', data['lang']) }}</small></label>
|
||||
<input type="number" class="form-control" id="min_memory2" name="min_memory" value="1" step="0.5" min="0.5">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 offset-1">
|
||||
<div class="form-group">
|
||||
<label for="max_memory2">{{ translate('serverWizard', 'maxMem', data['lang']) }} <small> - {{ translate('serverWizard', 'sizeInGB', data['lang']) }}</small></label>
|
||||
<input type="number" class="form-control" id="max_memory2" name="max_memory" value="2" step="0.5" min="0.5">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 offset-1">
|
||||
<div class="form-group">
|
||||
<label for="port2">{{ translate('serverWizard', 'serverPort', data['lang']) }} <small> - {{ translate('serverWizard', 'defaultPort', data['lang']) }}</small></label>
|
||||
<input type="number" class="form-control" id="port2" name="port" value="25565" step="1" min="1">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary mr-2" onclick="wait_msg(true)">{{ translate('serverWizard', 'importServerButton', data['lang']) }}</button>
|
||||
<button type="reset" class="btn btn-danger mr-2">{{ translate('serverWizard', 'resetForm', data['lang']) }}</button>
|
||||
|
||||
</form>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-13 grid-margin stretch-card">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
|
||||
<h4>{{ translate('serverWizard', 'importZip', data['lang']) }}</h4>
|
||||
<br />
|
||||
<p class="card-description">
|
||||
|
||||
<form method="post" class="server-wizard">
|
||||
{% raw xsrf_form_html() %}
|
||||
<input type="hidden" value="import_zip" name="create_type">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-9">
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server_name">{{ translate('serverWizard', 'serverName', data['lang']) }}</label>
|
||||
<input type="text" class="form-control" id="server_name" name="server_name" value="" placeholder="{{ translate('serverWizard', 'myNewServer', data['lang']) }}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server">{{ translate('serverWizard', 'zipPath', data['lang']) }} <small>{{ translate('serverWizard', 'absoluteZipPath', data['lang']) }}</small></label>
|
||||
<input type="text" class="form-control" id="server_path" name="server_path" placeholder="/var/opt/server.zip">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="server_jar">{{ translate('serverWizard', 'serverJar', data['lang']) }}</label>
|
||||
<input type="text" class="form-control" id="server_jar" name="server_jar" value="" placeholder="paper.jar">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="col-sm-3">
|
||||
<h4 class="card-title">{{ translate('serverWizard', 'quickSettings', data['lang']) }} <small style="text-transform: none;"> - {{ translate('serverWizard', 'quickSettingsDescription', data['lang']) }}</small></h4>
|
||||
<hr>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="min_memory3">{{ translate('serverWizard', 'minMem', data['lang']) }} <small> - {{ translate('serverWizard', 'sizeInGB', data['lang']) }}</small></label>
|
||||
<input type="number" class="form-control" id="min_memory3" name="min_memory" value="1" step="0.5" min="0.5">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="max_memory3">{{ translate('serverWizard', 'maxMem', data['lang']) }} <small> - {{ translate('serverWizard', 'sizeInGB', data['lang']) }}</small></label>
|
||||
<input type="number" class="form-control" id="max_memory3" name="max_memory" value="2" step="0.5" min="0.5">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12">
|
||||
<div class="form-group">
|
||||
<label for="port3">{{ translate('serverWizard', 'serverPort', data['lang']) }} <small> - {{ translate('serverWizard', 'defaultPort', data['lang']) }}</small></label>
|
||||
<input type="number" class="form-control" id="port3" name="port" value="25565" step="1" min="1">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary mr-2" onclick="wait_msg(true)">{{ translate('serverWizard', 'importServerButton', data['lang']) }}</button>
|
||||
<button type="reset" class="btn btn-danger mr-2">{{ translate('serverWizard', 'resetForm', data['lang']) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% end %}
|
||||
|
||||
{% block js%}
|
||||
|
||||
<script>
|
||||
$( document ).ready(function() {
|
||||
console.log('ready');
|
||||
var forms = $('form.server-wizard');
|
||||
forms.each(function(i, formEl) {
|
||||
var form = $(formEl);
|
||||
var min = form.find('[name=min_memory]');
|
||||
var max = form.find('[name=max_memory]');
|
||||
console.log(form, min, max)
|
||||
min.change(function(){
|
||||
check_sizes(max, min, 'min');
|
||||
});
|
||||
max.change(function(){
|
||||
check_sizes(max, min, 'max');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
function wait_msg(importing){
|
||||
bootbox.alert({
|
||||
title: importing ? '{% raw translate("serverWizard", "importing", data['lang']) %}' : '{% raw translate("serverWizard", "downloading", data['lang']) %}',
|
||||
message: '<i class="fas fa-cloud-download"></i> {% raw translate("serverWizard", "bePatient", data['lang']) %}'
|
||||
});
|
||||
}
|
||||
|
||||
function check_sizes(a, b, changed){
|
||||
max_mem = parseFloat(a.val());
|
||||
min_mem = parseFloat(b.val());
|
||||
if (max_mem < min_mem && changed === 'min'){
|
||||
a.val(min_mem)
|
||||
}
|
||||
if (max_mem < min_mem && changed === 'max'){
|
||||
b.val(max_mem)
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
//<![CDATA[
|
||||
// array of possible countries in the same order as they appear in the country selection list
|
||||
|
||||
function decodeHtmlCharCodes(str) {
|
||||
return str.replace(""", "\"");
|
||||
}
|
||||
|
||||
function convertHtmlJsonToJavacriptArray(str) {
|
||||
var result = []
|
||||
str = decodeHtmlCharCodes(str)
|
||||
for(var i in str)
|
||||
result.push([i, str [i]]);
|
||||
return result
|
||||
}
|
||||
|
||||
var text = '{% raw data["js_server_types"] %}';
|
||||
var serverTypesLists = JSON.parse(text);
|
||||
//convertHtmlJsonToJavacriptArray('{{ data["js_server_types"] }}')
|
||||
/* CountryChange() is called from the onchange event of a select element.
|
||||
* param selectObj - the select object which fired the on change event.
|
||||
*/
|
||||
function serverTypeChange(selectObj) {
|
||||
// get the index of the selected option
|
||||
var idx = selectObj.selectedIndex;
|
||||
// get the value of the selected option
|
||||
var which = selectObj.options[idx].value;
|
||||
// use the selected option value to retrieve the list of items from the serverTypesLists array
|
||||
cList = serverTypesLists[which];
|
||||
// get the country select element via its known id
|
||||
var cSelect = document.getElementById("server");
|
||||
// remove the current options from the country select
|
||||
var len=cSelect.options.length;
|
||||
while (cSelect.options.length > 0) {
|
||||
cSelect.remove(0);
|
||||
}
|
||||
var newOption;
|
||||
// create new options ordered by descending
|
||||
for (var i=(cList.length)-1; i>=0; i--) {
|
||||
newOption = document.createElement("option");
|
||||
newOption.value = which+"|"+cList[i]; // assumes option string and value are the same
|
||||
newOption.text=cList[i];
|
||||
// add the new option
|
||||
try {
|
||||
cSelect.add(newOption); // this will fail in DOM browsers but is needed for IE
|
||||
}
|
||||
catch (e) {
|
||||
cSelect.appendChild(newOption);
|
||||
}
|
||||
}
|
||||
}
|
||||
//]]>
|
||||
</script>
|
||||
{% end %}
|
@ -1,6 +1,6 @@
|
||||
# Generated by database migrator
|
||||
from peewee import *
|
||||
from app.classes.shared.models import Users
|
||||
from app.classes.models.users import Users
|
||||
|
||||
def migrate(migrator, database, **kwargs):
|
||||
db = database
|
||||
|
@ -1,6 +1,7 @@
|
||||
# Generated by database migrator
|
||||
from peewee import *
|
||||
from app.classes.shared.models import Users, Servers
|
||||
from app.classes.models.users import Users
|
||||
from app.classes.models.servers import Servers
|
||||
|
||||
|
||||
def migrate(migrator, database, **kwargs):
|
||||
|
16
app/migrations/20210929205501_user_lang.py
Normal file
16
app/migrations/20210929205501_user_lang.py
Normal file
@ -0,0 +1,16 @@
|
||||
# Generated by database migrator
|
||||
import peewee
|
||||
|
||||
def migrate(migrator, database, **kwargs):
|
||||
migrator.add_columns('users', lang=peewee.CharField(default='en_EN'))
|
||||
"""
|
||||
Write your migrations here.
|
||||
"""
|
||||
|
||||
|
||||
|
||||
def rollback(migrator, database, **kwargs):
|
||||
migrator.drop_columns('users', ['lang'])
|
||||
"""
|
||||
Write your rollback migrations here.
|
||||
"""
|
@ -81,7 +81,8 @@
|
||||
"lastBackup": "Last:",
|
||||
"nextBackup": "Next:",
|
||||
"servers": "Servers",
|
||||
"cannotSeeOnMobile": "Can't see everything on mobile?",
|
||||
"cannotSeeOnMobile": "Not seeing everything on mobile?",
|
||||
"cannotSee": "Not seeing everything?",
|
||||
"cannotSeeOnMobile2": "Try scrolling the table sideways.",
|
||||
"max": "Max",
|
||||
"avg": "Avg",
|
||||
@ -100,7 +101,9 @@
|
||||
"restart": "Restart",
|
||||
"killing": "Killing process...",
|
||||
"starting": "Delayed-Start",
|
||||
"delay-explained": "The service/agent has recently started and is delaying the start of the minecraft server instance"
|
||||
"delay-explained": "The service/agent has recently started and is delaying the start of the minecraft server instance",
|
||||
"no-servers": "There are currently no servers. To get started, click",
|
||||
"welcome": "Welcome to Crafty Controller"
|
||||
},
|
||||
"accessDenied": {
|
||||
"accessDenied": "Access Denied",
|
||||
|
@ -82,6 +82,7 @@
|
||||
"nextBackup": "Seuraava:",
|
||||
"servers": "Palvelimet",
|
||||
"cannotSeeOnMobile": "Etkö näe kaikkea mobiililaitteella?",
|
||||
"cannotSee": "Etkö näe kaikkea?",
|
||||
"cannotSeeOnMobile2": "Yritä vierittää taulukkoa sivuttain.",
|
||||
"max": "maks.",
|
||||
"avg": "ka.",
|
||||
@ -100,7 +101,9 @@
|
||||
"restart": "Uudelleenkäynnistää",
|
||||
"killing": "Tappamisprosessi ...",
|
||||
"starting": "Myöhästynyt lähtö",
|
||||
"delay-explained": "Palvelu/agentti on äskettäin aloittanut ja viivästyttää minecraft -palvelimen ilmentymän alkua"
|
||||
"delay-explained": "Palvelu/agentti on äskettäin aloittanut ja viivästyttää minecraft -palvelimen ilmentymän alkua",
|
||||
"no-servers": "Palvelimia ei tällä hetkellä ole. Aloita napsauttamalla",
|
||||
"welcome": "Tervetuloa Crafty Controller"
|
||||
},
|
||||
"accessDenied": {
|
||||
"accessDenied": "Käyttö estetty",
|
||||
|
@ -82,6 +82,7 @@
|
||||
"nextBackup": "Prochain:",
|
||||
"servers": "Serveurs",
|
||||
"cannotSeeOnMobile": "Impossible de tout voir sur mobile ?",
|
||||
"cannotSee": "Impossible de tout voir ?",
|
||||
"cannotSeeOnMobile2": "Essaie de déplacer le tableau sur le côté.",
|
||||
"max": "Max",
|
||||
"avg": "Moy",
|
||||
@ -93,14 +94,16 @@
|
||||
"cpuCurFreq": "Fréquence CPU actuelle",
|
||||
"cpuMaxFreq": "Fréquence CPU Maximum",
|
||||
"cpuCores": "Coeurs CPU",
|
||||
"start": "Début",
|
||||
"start": "Démarrer",
|
||||
"stop": "Arrêter",
|
||||
"clone": "Cloner",
|
||||
"kill": "Tuer le processus",
|
||||
"restart": "Redémarrage",
|
||||
"restart": "Redémarrer",
|
||||
"killing": "Processus de mise à mort...",
|
||||
"starting": "Démarrage retardé",
|
||||
"delay-explained": "Le service/agent a récemment démarré et retarde le démarrage de l'instance du serveur minecraft"
|
||||
"delay-explained": "Le service/agent a récemment démarré et retarde le démarrage de l'instance du serveur minecraft",
|
||||
"no-servers": "Il n'y a actuellement aucun serveur. Pour commencer, clique sur",
|
||||
"welcome": "Bienvenue sur Crafty Controller"
|
||||
},
|
||||
"accessDenied": {
|
||||
"accessDenied": "Accès Interdit",
|
||||
@ -191,7 +194,7 @@
|
||||
"fileReadError": "Erreur de Lecture du Fichier",
|
||||
"upload": "Téléverser",
|
||||
"unzip": "Décompresser",
|
||||
"clickUpload": "Cliquez ici pour sélectionner tes fichiers",
|
||||
"clickUpload": "Cliquer ici pour sélectionner tes fichiers",
|
||||
"uploadTitle": "Téléverser les fichiers vers : ",
|
||||
"waitUpload": "Merci de patienter pendant que nous téléversons tes fichiers... Cela peut prendre un certain temps.",
|
||||
"stayHere": "NE FERME PAS CETTE PAGE!",
|
||||
|
20
main.py
20
main.py
@ -9,10 +9,10 @@ import signal
|
||||
""" Our custom classes / pip packages """
|
||||
from app.classes.shared.console import console
|
||||
from app.classes.shared.helpers import helper
|
||||
from app.classes.shared.models import installer, database
|
||||
from app.classes.shared.main_models import installer, database
|
||||
|
||||
from app.classes.shared.tasks import TasksManager
|
||||
from app.classes.shared.controller import Controller
|
||||
from app.classes.shared.main_controller import Controller
|
||||
from app.classes.shared.migration import MigrationManager
|
||||
|
||||
from app.classes.shared.cmd import MainPrompt
|
||||
@ -23,14 +23,14 @@ def do_intro():
|
||||
|
||||
version = helper.get_version_string()
|
||||
|
||||
intro = """
|
||||
{lines}
|
||||
#\t\tWelcome to Crafty Controller - v.{version}\t\t #
|
||||
{lines}
|
||||
# \tServer Manager / Web Portal for your Minecraft server \t #
|
||||
# \t\tHomepage: www.craftycontrol.com\t\t\t #
|
||||
{lines}
|
||||
""".format(lines="/" * 75, version=version)
|
||||
intro = f"""
|
||||
{'/' * 75}
|
||||
#{("Welcome to Crafty Controller - v." + version).center(73, " ")}#
|
||||
{'/' * 75}
|
||||
#{"Server Manager / Web Portal for your Minecraft server".center(73, " ")}#
|
||||
#{"Homepage: www.craftycontrol.com".center(73, " ")}#
|
||||
{'/' * 75}
|
||||
"""
|
||||
|
||||
console.magenta(intro)
|
||||
|
||||
|
@ -1,25 +1,12 @@
|
||||
argon2-cffi==20.1.0
|
||||
bleach==3.1.5
|
||||
certifi==2020.6.20
|
||||
cffi==1.14.1
|
||||
chardet==3.0.4
|
||||
colorama==0.4.3
|
||||
cryptography==3.4
|
||||
idna==2.10
|
||||
packaging==20.4
|
||||
peewee==3.13.3
|
||||
pexpect==4.8.0
|
||||
psutil==5.7.2
|
||||
ptyprocess==0.6.0
|
||||
pycparser==2.20
|
||||
pyminifier==2.1
|
||||
pyOpenSSL==19.1.0
|
||||
pyparsing==2.4.7
|
||||
argon2-cffi~=20.1
|
||||
bleach~=3.1
|
||||
colorama~=0.4
|
||||
peewee~=3.13
|
||||
pexpect~=4.8
|
||||
psutil~=5.7
|
||||
pyOpenSSL~=19.1.0
|
||||
PyYAML==5.3.1
|
||||
requests~=2.26.0
|
||||
schedule==0.6.0
|
||||
six==1.15.0
|
||||
termcolor==1.1.0
|
||||
tornado==6.0.4
|
||||
urllib3==1.25.10
|
||||
webencodings==0.5.1
|
||||
requests~=2.26
|
||||
schedule~=1.1.0
|
||||
termcolor~=1.1
|
||||
tornado~=6.0
|
||||
|
Loading…
Reference in New Issue
Block a user