mirror of
https://gitlab.com/crafty-controller/crafty-4.git
synced 2024-08-30 18:23:09 +00:00
Merge branch 'dev' into experimental/lukas-cleanup
This commit is contained in:
commit
42af86b6f7
@ -6,7 +6,7 @@ docker-compose.yml
|
||||
|
||||
# git & gitlab related
|
||||
.git/
|
||||
.github/
|
||||
.gitlab/
|
||||
.gitignore
|
||||
.gitlab-ci.yml
|
||||
|
||||
|
89
.github/workflows/docker-build.yml
vendored
89
.github/workflows/docker-build.yml
vendored
@ -1,89 +0,0 @@
|
||||
# yamllint disable rule:line-length
|
||||
---
|
||||
name: Build Docker Images
|
||||
|
||||
on: # yamllint disable-line rule:truthy
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- dev
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build Docker Images
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
date: ${{ steps.date.outputs.date }}
|
||||
tag: ${{ steps.branch.outputs.tag }}
|
||||
version: ${{ steps.version.outputs.version }}
|
||||
|
||||
steps:
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up QEMU
|
||||
id: qemu
|
||||
uses: docker/setup-qemu-action@v1
|
||||
with:
|
||||
image: tonistiigi/binfmt:latest
|
||||
platforms: all
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
|
||||
- name: Log in to GitHub Container Registry
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@v1
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GHCR_PAT }}
|
||||
|
||||
# - name: Login to Docker Hub
|
||||
# if: github.event_name != 'pull_request'
|
||||
# uses: docker/login-action@v1
|
||||
# with:
|
||||
# username: ${{ secrets.DOCKER_USERNAME }}
|
||||
# password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Get current date
|
||||
id: date
|
||||
run: echo "::set-output name=date::$(date +"%Y-%m-%dT%H:%M:%SZ")"
|
||||
|
||||
- name: Get Crafty version
|
||||
id: version
|
||||
run: |
|
||||
MAJOR=$(cat app/config/version.json | jq '.major' )
|
||||
MINOR=$(cat app/config/version.json | jq '.minor' )
|
||||
SUB=$(cat app/config/version.json | jq '.sub' )
|
||||
META=$(cat app/config/version.json | jq -r '.meta' )
|
||||
echo "::set-output name=version::$MAJOR.$MINOR.$SUB-$META"
|
||||
|
||||
- name: Get branch tag
|
||||
id: branch
|
||||
run: |
|
||||
if [[ "${{ github.ref }}" == "refs/heads/master" ]]; then
|
||||
echo "::set-output name=tag::latest"
|
||||
else
|
||||
echo "::set-output name=tag::$(echo "${{ github.ref }}" | sed -e 's/refs\/heads\///g')"
|
||||
fi
|
||||
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@v2
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
platforms: linux/arm64,linux/amd64
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
cache-from: type=registry,ref=${{ github.repository }}:${{ steps.branch.outputs.tag }}
|
||||
cache-to: type=inline
|
||||
build-args: |
|
||||
BUILD_DATE=${{ steps.date.outputs.date }}
|
||||
BUILD_REF=${{ github.sha }}
|
||||
CRAFTY_VER=${{ steps.version.outputs.version }}
|
||||
tags: |
|
||||
ghcr.io/${{ github.repository }}:${{ steps.branch.outputs.tag }}
|
||||
|
||||
# {{ GITHUB_REPOSITORY }}:${{ steps.branch.outputs.tag }}
|
37
.github/workflows/lint.yml
vendored
37
.github/workflows/lint.yml
vendored
@ -1,37 +0,0 @@
|
||||
# yamllint disable rule:line-length
|
||||
---
|
||||
name: Lint
|
||||
|
||||
on: [push, pull_request] # yamllint disable-line rule:truthy
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
name: Lint
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v3
|
||||
with:
|
||||
python-version: "3.9"
|
||||
cache: "pip"
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install pylint black yamllint
|
||||
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
||||
|
||||
- name: Run pylint
|
||||
run: |
|
||||
pylint --output-format=text $(find -type f -name "*.py" ! -path "**/.venv/**" ! -path "**/app/migrations/**") | tee /tmp/pylint.txt
|
||||
echo "pylint score: $(cat /tmp/pylint.txt | grep -oP 'Your code has been rated at \K[0-9]*\.?[0-9]*')"
|
||||
|
||||
- name: Run black
|
||||
run: black --check --diff .
|
||||
|
||||
- name: Lint YAML files
|
||||
run: yamllint .
|
@ -68,6 +68,6 @@ LABEL \
|
||||
org.opencontainers.image.description="A Game Server Control Panel / Launcher" \
|
||||
org.opencontainers.image.url="https://craftycontrol.com/" \
|
||||
org.opencontainers.image.documentation="https://wiki.craftycontrol.com/" \
|
||||
org.opencontainers.image.source="https://github.com/arcadia-technology/crafty-4" \
|
||||
org.opencontainers.image.source="https://gitlab.com/crafty-controller/crafty-4" \
|
||||
org.opencontainers.image.vendor="Arcadia Technology, LLC." \
|
||||
org.opencontainers.image.licenses=""
|
||||
org.opencontainers.image.licenses="GPL-3.0"
|
||||
|
18
README.md
18
README.md
@ -2,9 +2,9 @@
|
||||
|
||||
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
|
||||
[![Supported Python Versions](https://shields.io/badge/python-3.8%20%7C%203.9%20%7C%203.10%20-blue)](https://www.python.org)
|
||||
[![Version(temp-hardcoded)](https://img.shields.io/badge/release-v4.0.0--beta-orange)](https://github.com/arcadia-technology/crafty-4)
|
||||
[![Code Quality(temp-hardcoded)](https://img.shields.io/badge/code%20quality-10-brightgreen)](https://github.com/arcadia-technology/crafty-4)
|
||||
[![Build Status](https://github.com/arcadia-technology/crafty-4/actions/workflows/docker-build.yml/badge.svg)](https://github.com/arcadia-technology/crafty-4/actions/workflows/docker-build.yml)
|
||||
[![Version(temp-hardcoded)](https://img.shields.io/badge/release-v4.0.0--beta-orange)](https://gitlab.com/crafty-controller/crafty-4)
|
||||
[![Code Quality(temp-hardcoded)](https://img.shields.io/badge/code%20quality-10-brightgreen)](https://gitlab.com/crafty-controller/crafty-4)
|
||||
[![Build Status](https://gitlab.com/crafty-controller/crafty-4/badges/master/pipeline.svg)](https://gitlab.com/crafty-controller/crafty-4/-/commits/master)
|
||||
|
||||
# Crafty Controller 4.0.0-beta
|
||||
> Python based Control Panel for your Minecraft Server
|
||||
@ -23,7 +23,7 @@ Project Homepage - https://craftycontrol.com
|
||||
|
||||
Discord Server - https://discord.gg/9VJPhCE
|
||||
|
||||
Git Repository - https://github.com/arcadia-technology/crafty-4
|
||||
Git Repository - https://gitlab.com/crafty-controller/crafty-4
|
||||
|
||||
<br>
|
||||
|
||||
@ -55,11 +55,11 @@ As the Dockerfile uses the permission structure of `crafty:root` **internally**
|
||||
### - Using the registry image 🌎
|
||||
The provided image supports both `arm64` and `amd64` out the box, if you have issues though you can build it yourself with the `compose` file in `docker/`.
|
||||
|
||||
The image is located at: `ghcr.io/arcadia-technology/crafty-4:latest`
|
||||
The image is located at: `registry.gitlab.com/crafty-controller/crafty-4:latest`
|
||||
| Branch | Status |
|
||||
| ----------------- | ------------------------------------------------------------------ |
|
||||
| :latest | [![Pipeline status](https://github.com/arcadia-technology/crafty-4/actions/workflows/docker-build.yml/badge.svg)](https://github.com/arcadia-technology/crafty-4/actions/workflows/docker-build.yml) |
|
||||
| :dev | [![Pipeline status](https://github.com/arcadia-technology/crafty-4/actions/workflows/docker-build.yml/badge.svg?branch=dev)](https://github.com/arcadia-technology/crafty-4/actions/workflows/docker-build.yml) |
|
||||
| :latest | [![pipeline status](https://gitlab.com/crafty-controller/crafty-4/badges/master/pipeline.svg)](https://gitlab.com/crafty-controller/crafty-4/-/commits/master) |
|
||||
| :dev | [![pipeline status](https://gitlab.com/crafty-controller/crafty-4/badges/dev/pipeline.svg)](https://gitlab.com/crafty-controller/crafty-4/-/commits/dev)
|
||||
|
||||
<br>
|
||||
|
||||
@ -76,7 +76,7 @@ version: '3'
|
||||
services:
|
||||
crafty:
|
||||
container_name: crafty_container
|
||||
image: ghcr.io/arcadia-technology/crafty-4:latest
|
||||
image: registry.gitlab.com/crafty-controller/crafty-4:latest
|
||||
restart: always
|
||||
environment:
|
||||
- TZ=Etc/UTC
|
||||
@ -115,7 +115,7 @@ $ docker run \
|
||||
-v "/$(pwd)/docker/servers:/crafty/servers" \
|
||||
-v "/$(pwd)/docker/config:/crafty/app/config" \
|
||||
-v "/$(pwd)/docker/import:/crafty/import" \
|
||||
ghcr.io/arcadia-technology/crafty-4:latest
|
||||
registry.gitlab.com/crafty-controller/crafty-4:latest
|
||||
```
|
||||
|
||||
### **Building from the cloned repository:**
|
||||
|
@ -7,6 +7,7 @@ from app.classes.models.server_permissions import (
|
||||
from app.classes.models.users import HelperUsers, ApiKeys
|
||||
from app.classes.models.roles import HelperRoles
|
||||
from app.classes.models.servers import HelperServers
|
||||
from app.classes.models.server_stats import HelperServerStats
|
||||
from app.classes.shared.main_models import DatabaseShortcuts
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@ -111,7 +112,7 @@ class ServerPermsController:
|
||||
)
|
||||
|
||||
for server in authorized_servers:
|
||||
latest = HelperServers.get_latest_server_stats(server.get("server_id"))
|
||||
latest = HelperServerStats.get_latest_server_stats(server.get("server_id"))
|
||||
server_data.append(
|
||||
{
|
||||
"server_data": server,
|
||||
|
@ -4,6 +4,7 @@ import json
|
||||
|
||||
from app.classes.controllers.roles_controller import RolesController
|
||||
from app.classes.models.servers import HelperServers
|
||||
from app.classes.models.server_stats import HelperServerStats
|
||||
from app.classes.models.users import HelperUsers, ApiKeys
|
||||
from app.classes.models.server_permissions import (
|
||||
PermissionsServers,
|
||||
@ -58,15 +59,15 @@ class ServersController:
|
||||
|
||||
@staticmethod
|
||||
def set_download(server_id):
|
||||
return HelperServers.set_download(server_id)
|
||||
return HelperServerStats.set_download(server_id)
|
||||
|
||||
@staticmethod
|
||||
def finish_download(server_id):
|
||||
return HelperServers.finish_download(server_id)
|
||||
return HelperServerStats.finish_download(server_id)
|
||||
|
||||
@staticmethod
|
||||
def get_download_status(server_id):
|
||||
return HelperServers.get_download_status(server_id)
|
||||
return HelperServerStats.get_download_status(server_id)
|
||||
|
||||
def remove_server(self, server_id):
|
||||
roles_list = PermissionsServers.get_roles_from_server(server_id)
|
||||
@ -104,7 +105,7 @@ class ServersController:
|
||||
|
||||
@staticmethod
|
||||
def get_all_servers_stats():
|
||||
return HelperServers.get_all_servers_stats()
|
||||
return HelperServerStats.get_all_servers_stats()
|
||||
|
||||
@staticmethod
|
||||
def get_authorized_servers_stats_api_key(api_key: ApiKeys):
|
||||
@ -112,7 +113,7 @@ class ServersController:
|
||||
authorized_servers = ServersController.get_authorized_servers(api_key.user_id)
|
||||
|
||||
for server in authorized_servers:
|
||||
latest = HelperServers.get_latest_server_stats(server.get("server_id"))
|
||||
latest = HelperServerStats.get_latest_server_stats(server.get("server_id"))
|
||||
key_permissions = PermissionsServers.get_api_key_permissions_list(
|
||||
api_key, server.get("server_id")
|
||||
)
|
||||
@ -135,7 +136,7 @@ class ServersController:
|
||||
authorized_servers = ServersController.get_authorized_servers(user_id)
|
||||
|
||||
for server in authorized_servers:
|
||||
latest = HelperServers.get_latest_server_stats(server.get("server_id"))
|
||||
latest = HelperServerStats.get_latest_server_stats(server.get("server_id"))
|
||||
# TODO
|
||||
user_permissions = PermissionsServers.get_user_id_permissions_list(
|
||||
user_id, server.get("server_id")
|
||||
@ -163,11 +164,11 @@ class ServersController:
|
||||
# **********************************************************************************
|
||||
@staticmethod
|
||||
def get_server_stats_by_id(server_id):
|
||||
return HelperServers.get_server_stats_by_id(server_id)
|
||||
return HelperServerStats.get_server_stats_by_id(server_id)
|
||||
|
||||
@staticmethod
|
||||
def server_id_exists(server_id):
|
||||
return HelperServers.server_id_exists(server_id)
|
||||
return HelperServerStats.server_id_exists(server_id)
|
||||
|
||||
@staticmethod
|
||||
def get_server_type_by_id(server_id):
|
||||
@ -186,7 +187,7 @@ class ServersController:
|
||||
|
||||
@staticmethod
|
||||
def is_crashed(server_id):
|
||||
return HelperServers.is_crashed(server_id)
|
||||
return HelperServerStats.is_crashed(server_id)
|
||||
|
||||
@staticmethod
|
||||
def server_id_authorized_api_key(server_id: str, api_key: ApiKeys) -> bool:
|
||||
@ -195,34 +196,36 @@ class ServersController:
|
||||
# There is no view server permission
|
||||
# permission_helper.both_have_perm(api_key)
|
||||
|
||||
def set_update(self, server_id, value):
|
||||
return self.servers_helper.set_update(server_id, value)
|
||||
@staticmethod
|
||||
def set_update(server_id, value):
|
||||
return HelperServerStats.set_update(server_id, value)
|
||||
|
||||
@staticmethod
|
||||
def get_ttl_without_player(server_id):
|
||||
return HelperServers.get_ttl_without_player(server_id)
|
||||
return HelperServerStats.get_ttl_without_player(server_id)
|
||||
|
||||
@staticmethod
|
||||
def can_stop_no_players(server_id, time_limit):
|
||||
return HelperServers.can_stop_no_players(server_id, time_limit)
|
||||
return HelperServerStats.can_stop_no_players(server_id, time_limit)
|
||||
|
||||
def set_waiting_start(self, server_id, value):
|
||||
self.servers_helper.set_waiting_start(server_id, value)
|
||||
@staticmethod
|
||||
def set_waiting_start(server_id, value):
|
||||
HelperServerStats.set_waiting_start(server_id, value)
|
||||
|
||||
@staticmethod
|
||||
def get_waiting_start(server_id):
|
||||
return HelperServers.get_waiting_start(server_id)
|
||||
return HelperServerStats.get_waiting_start(server_id)
|
||||
|
||||
@staticmethod
|
||||
def get_update_status(server_id):
|
||||
return HelperServers.get_update_status(server_id)
|
||||
return HelperServerStats.get_update_status(server_id)
|
||||
|
||||
# **********************************************************************************
|
||||
# Servers Helpers Methods
|
||||
# **********************************************************************************
|
||||
@staticmethod
|
||||
def get_banned_players(server_id):
|
||||
stats = HelperServers.get_server_stats_by_id(server_id)
|
||||
stats = HelperServerStats.get_server_stats_by_id(server_id)
|
||||
server_path = stats["server_id"]["path"]
|
||||
path = os.path.join(server_path, "banned-players.json")
|
||||
|
||||
|
@ -210,36 +210,9 @@ class Stats:
|
||||
}
|
||||
).execute()
|
||||
|
||||
# server_stats = stats_to_send.get("servers")
|
||||
# for server in server_stats:
|
||||
# Server_Stats.insert(
|
||||
# {
|
||||
# Server_Stats.server_id: server.get("id", 0),
|
||||
# Server_Stats.started: server.get("started", ""),
|
||||
# Server_Stats.running: server.get("running", False),
|
||||
# Server_Stats.cpu: server.get("cpu", 0),
|
||||
# Server_Stats.mem: server.get("mem", 0),
|
||||
# Server_Stats.mem_percent: server.get("mem_percent", 0),
|
||||
# Server_Stats.world_name: server.get("world_name", ""),
|
||||
# Server_Stats.world_size: server.get("world_size", ""),
|
||||
# Server_Stats.server_port: server.get("server_port", ""),
|
||||
# Server_Stats.int_ping_results: server.get(
|
||||
# "int_ping_results", False
|
||||
# ),
|
||||
# Server_Stats.online: server.get("online", False),
|
||||
# Server_Stats.max: server.get("max", False),
|
||||
# Server_Stats.players: server.get("players", False),
|
||||
# Server_Stats.desc: server.get("desc", False),
|
||||
# Server_Stats.version: server.get("version", False),
|
||||
# }
|
||||
# ).execute()
|
||||
|
||||
# delete old data
|
||||
max_age = self.helper.get_setting("history_max_age")
|
||||
now = datetime.datetime.now()
|
||||
last_week = now.day - max_age
|
||||
|
||||
HostStats.delete().where(HostStats.time < last_week).execute()
|
||||
|
||||
|
||||
# Server_Stats.delete().where(Server_Stats.created < last_week).execute()
|
||||
|
355
app/classes/models/server_stats.py
Normal file
355
app/classes/models/server_stats.py
Normal file
@ -0,0 +1,355 @@
|
||||
import os
|
||||
import logging
|
||||
import datetime
|
||||
|
||||
from app.classes.models.servers import Servers, HelperServers
|
||||
from app.classes.shared.helpers import Helpers
|
||||
from app.classes.shared.main_models import DatabaseShortcuts
|
||||
from app.classes.shared.migration import MigrationManager
|
||||
|
||||
try:
|
||||
from peewee import (
|
||||
SqliteDatabase,
|
||||
Model,
|
||||
DatabaseProxy,
|
||||
ForeignKeyField,
|
||||
CharField,
|
||||
AutoField,
|
||||
DateTimeField,
|
||||
BooleanField,
|
||||
IntegerField,
|
||||
FloatField,
|
||||
)
|
||||
|
||||
except ModuleNotFoundError as e:
|
||||
Helpers.auto_installer_fix(e)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
peewee_logger = logging.getLogger("peewee")
|
||||
peewee_logger.setLevel(logging.INFO)
|
||||
database_stats_proxy = DatabaseProxy()
|
||||
|
||||
|
||||
# **********************************************************************************
|
||||
# Servers Stats Class
|
||||
# **********************************************************************************
|
||||
class ServerStats(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)
|
||||
first_run = BooleanField(default=True)
|
||||
crashed = BooleanField(default=False)
|
||||
downloading = BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
table_name = "server_stats"
|
||||
database = database_stats_proxy
|
||||
|
||||
|
||||
# **********************************************************************************
|
||||
# Servers_Stats Methods
|
||||
# **********************************************************************************
|
||||
class HelperServerStats:
|
||||
def __init__(self, database):
|
||||
self.database = database
|
||||
|
||||
@staticmethod
|
||||
def init_database(server_id):
|
||||
try:
|
||||
server = HelperServers.get_server_data_by_id(server_id)
|
||||
db_folder = os.path.join(f"{server['path']}", "db_stats")
|
||||
db_file = os.path.join(
|
||||
db_folder,
|
||||
f"{server['server_name']}" + ".sqlite",
|
||||
)
|
||||
database = SqliteDatabase(
|
||||
db_file, pragmas={"journal_mode": "wal", "cache_size": -1024 * 10}
|
||||
)
|
||||
if not os.path.exists(db_file):
|
||||
try:
|
||||
os.mkdir(db_folder)
|
||||
except Exception as ex:
|
||||
logger.warning(
|
||||
f"Error try to create the db_stats folder for server : {ex}"
|
||||
)
|
||||
helper_stats = Helpers()
|
||||
helper_stats.migration_dir = os.path.join(
|
||||
f"{helper_stats.migration_dir}", "stats"
|
||||
)
|
||||
helper_stats.db_path = db_file
|
||||
database_stats_proxy.initialize(database)
|
||||
migration_manager = MigrationManager(database, helper_stats)
|
||||
migration_manager.up() # Automatically runs migrations
|
||||
database_stats_proxy.initialize(database)
|
||||
except Exception as ex:
|
||||
logger.warning(
|
||||
f"Error try to look for the db_stats files for server : {ex}"
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def select_database(server_id):
|
||||
try:
|
||||
server = HelperServers.get_server_data_by_id(server_id)
|
||||
db_file = os.path.join(
|
||||
f"{server['path']}",
|
||||
"db_stats",
|
||||
f"{server['server_name']}" + ".sqlite",
|
||||
)
|
||||
database = SqliteDatabase(
|
||||
db_file, pragmas={"journal_mode": "wal", "cache_size": -1024 * 10}
|
||||
)
|
||||
database_stats_proxy.initialize(database)
|
||||
except Exception as ex:
|
||||
logger.warning(
|
||||
f"Error try to look for the db_stats files for server : {ex}"
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_all_servers_stats():
|
||||
servers = HelperServers.get_all_defined_servers()
|
||||
server_data = []
|
||||
try:
|
||||
for s in servers:
|
||||
HelperServerStats.select_database(s.get("server_id"))
|
||||
latest = (
|
||||
ServerStats.select()
|
||||
.where(ServerStats.server_id == s.get("server_id"))
|
||||
.order_by(ServerStats.created.desc())
|
||||
.limit(1)
|
||||
)
|
||||
server_data.append(
|
||||
{
|
||||
"server_data": s,
|
||||
"stats": DatabaseShortcuts.return_rows(latest)[0],
|
||||
"user_command_permission": True,
|
||||
}
|
||||
)
|
||||
except IndexError as ex:
|
||||
logger.error(
|
||||
f"Stats collection failed with error: {ex}. Was a server just created?"
|
||||
)
|
||||
return server_data
|
||||
|
||||
@staticmethod
|
||||
def insert_server_stats(server):
|
||||
server_id = server.get("id", 0)
|
||||
HelperServerStats.select_database(server_id)
|
||||
|
||||
if server_id == 0:
|
||||
logger.warning("Stats saving failed with error: Server unknown (id = 0)")
|
||||
return
|
||||
|
||||
ServerStats.insert(
|
||||
{
|
||||
ServerStats.server_id: server.get("id", 0),
|
||||
ServerStats.started: server.get("started", ""),
|
||||
ServerStats.running: server.get("running", False),
|
||||
ServerStats.cpu: server.get("cpu", 0),
|
||||
ServerStats.mem: server.get("mem", 0),
|
||||
ServerStats.mem_percent: server.get("mem_percent", 0),
|
||||
ServerStats.world_name: server.get("world_name", ""),
|
||||
ServerStats.world_size: server.get("world_size", ""),
|
||||
ServerStats.server_port: server.get("server_port", ""),
|
||||
ServerStats.int_ping_results: server.get("int_ping_results", False),
|
||||
ServerStats.online: server.get("online", False),
|
||||
ServerStats.max: server.get("max", False),
|
||||
ServerStats.players: server.get("players", False),
|
||||
ServerStats.desc: server.get("desc", False),
|
||||
ServerStats.version: server.get("version", False),
|
||||
}
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def remove_old_stats(server_id, last_week):
|
||||
HelperServerStats.select_database(server_id)
|
||||
ServerStats.delete().where(ServerStats.created < last_week).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_latest_server_stats(server_id):
|
||||
HelperServerStats.select_database(server_id)
|
||||
return (
|
||||
ServerStats.select()
|
||||
.where(ServerStats.server_id == server_id)
|
||||
.order_by(ServerStats.created.desc())
|
||||
.limit(1)
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_server_stats_by_id(server_id):
|
||||
HelperServerStats.select_database(server_id)
|
||||
stats = (
|
||||
ServerStats.select()
|
||||
.where(ServerStats.server_id == server_id)
|
||||
.order_by(ServerStats.created.desc())
|
||||
.limit(1)
|
||||
)
|
||||
return DatabaseShortcuts.return_rows(stats)[0]
|
||||
|
||||
@staticmethod
|
||||
def server_id_exists(server_id):
|
||||
HelperServerStats.select_database(server_id)
|
||||
if not HelperServers.get_server_data_by_id(server_id):
|
||||
return False
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def sever_crashed(server_id):
|
||||
HelperServerStats.select_database(server_id)
|
||||
with database_stats_proxy.atomic():
|
||||
ServerStats.update(crashed=True).where(
|
||||
ServerStats.server_id == server_id
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def set_download(server_id):
|
||||
HelperServerStats.select_database(server_id)
|
||||
with database_stats_proxy.atomic():
|
||||
ServerStats.update(downloading=True).where(
|
||||
ServerStats.server_id == server_id
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def finish_download(server_id):
|
||||
HelperServerStats.select_database(server_id)
|
||||
with database_stats_proxy.atomic():
|
||||
ServerStats.update(downloading=False).where(
|
||||
ServerStats.server_id == server_id
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_download_status(server_id):
|
||||
HelperServerStats.select_database(server_id)
|
||||
download_status = (
|
||||
ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||
)
|
||||
return download_status.downloading
|
||||
|
||||
@staticmethod
|
||||
def server_crash_reset(server_id):
|
||||
if server_id is None:
|
||||
return
|
||||
|
||||
HelperServerStats.select_database(server_id)
|
||||
with database_stats_proxy.atomic():
|
||||
ServerStats.update(crashed=False).where(
|
||||
ServerStats.server_id == server_id
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def is_crashed(server_id):
|
||||
HelperServerStats.select_database(server_id)
|
||||
svr = ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||
# pylint: disable=singleton-comparison
|
||||
if svr.crashed == True:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def set_update(server_id, value):
|
||||
if server_id is None:
|
||||
return
|
||||
|
||||
HelperServerStats.select_database(server_id)
|
||||
try:
|
||||
# Checks if server even exists
|
||||
ServerStats.select().where(ServerStats.server_id == server_id)
|
||||
except Exception as ex:
|
||||
logger.error(f"Database entry not found! {ex}")
|
||||
with database_stats_proxy.atomic():
|
||||
ServerStats.update(updating=value).where(
|
||||
ServerStats.server_id == server_id
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_update_status(server_id):
|
||||
HelperServerStats.select_database(server_id)
|
||||
update_status = (
|
||||
ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||
)
|
||||
return update_status.updating
|
||||
|
||||
@staticmethod
|
||||
def set_first_run(server_id):
|
||||
HelperServerStats.select_database(server_id)
|
||||
# Sets first run to false
|
||||
try:
|
||||
# Checks if server even exists
|
||||
ServerStats.select().where(ServerStats.server_id == server_id)
|
||||
except Exception as ex:
|
||||
logger.error(f"Database entry not found! {ex}")
|
||||
return
|
||||
with database_stats_proxy.atomic():
|
||||
ServerStats.update(first_run=False).where(
|
||||
ServerStats.server_id == server_id
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_first_run(server_id):
|
||||
HelperServerStats.select_database(server_id)
|
||||
first_run = ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||
return first_run.first_run
|
||||
|
||||
@staticmethod
|
||||
def get_ttl_without_player(server_id):
|
||||
HelperServerStats.select_database(server_id)
|
||||
last_stat = (
|
||||
ServerStats.select()
|
||||
.where(ServerStats.server_id == server_id)
|
||||
.order_by(ServerStats.created.desc())
|
||||
.first()
|
||||
)
|
||||
last_stat_with_player = (
|
||||
ServerStats.select()
|
||||
.where(ServerStats.server_id == server_id)
|
||||
.where(ServerStats.online > 0)
|
||||
.order_by(ServerStats.created.desc())
|
||||
.first()
|
||||
)
|
||||
return last_stat.created - last_stat_with_player.created
|
||||
|
||||
@staticmethod
|
||||
def can_stop_no_players(server_id, time_limit):
|
||||
HelperServerStats.select_database(server_id)
|
||||
can = False
|
||||
ttl_no_players = HelperServerStats.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):
|
||||
HelperServerStats.select_database(server_id)
|
||||
try:
|
||||
# Checks if server even exists
|
||||
ServerStats.select().where(ServerStats.server_id == server_id)
|
||||
except Exception as ex:
|
||||
logger.error(f"Database entry not found! {ex}")
|
||||
with database_stats_proxy.atomic():
|
||||
ServerStats.update(waiting_start=value).where(
|
||||
ServerStats.server_id == server_id
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_waiting_start(server_id):
|
||||
HelperServerStats.select_database(server_id)
|
||||
waiting_start = (
|
||||
ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||
)
|
||||
return waiting_start.waiting_start
|
@ -1,13 +1,11 @@
|
||||
import logging
|
||||
import datetime
|
||||
from peewee import (
|
||||
ForeignKeyField,
|
||||
CharField,
|
||||
AutoField,
|
||||
DateTimeField,
|
||||
BooleanField,
|
||||
IntegerField,
|
||||
FloatField,
|
||||
)
|
||||
|
||||
from app.classes.shared.main_models import DatabaseShortcuts
|
||||
@ -42,37 +40,6 @@ class Servers(BaseModel):
|
||||
table_name = "servers"
|
||||
|
||||
|
||||
# **********************************************************************************
|
||||
# Servers Stats Class
|
||||
# **********************************************************************************
|
||||
class ServerStats(BaseModel):
|
||||
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)
|
||||
first_run = BooleanField(default=True)
|
||||
crashed = BooleanField(default=False)
|
||||
downloading = BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
table_name = "server_stats"
|
||||
|
||||
|
||||
# **********************************************************************************
|
||||
# Servers Class
|
||||
# **********************************************************************************
|
||||
@ -146,31 +113,6 @@ class HelperServers:
|
||||
query = Servers.select()
|
||||
return DatabaseShortcuts.return_rows(query)
|
||||
|
||||
@staticmethod
|
||||
def get_all_servers_stats():
|
||||
servers = HelperServers.get_all_defined_servers()
|
||||
server_data = []
|
||||
try:
|
||||
for s in servers:
|
||||
latest = (
|
||||
ServerStats.select()
|
||||
.where(ServerStats.server_id == s.get("server_id"))
|
||||
.order_by(ServerStats.created.desc())
|
||||
.limit(1)
|
||||
)
|
||||
server_data.append(
|
||||
{
|
||||
"server_data": s,
|
||||
"stats": DatabaseShortcuts.return_rows(latest)[0],
|
||||
"user_command_permission": True,
|
||||
}
|
||||
)
|
||||
except IndexError as ex:
|
||||
logger.error(
|
||||
f"Stats collection failed with error: {ex}. Was a server just created?"
|
||||
)
|
||||
return server_data
|
||||
|
||||
@staticmethod
|
||||
def get_server_friendly_name(server_id):
|
||||
server_data = HelperServers.get_server_data_by_id(server_id)
|
||||
@ -179,147 +121,3 @@ class HelperServers:
|
||||
f"with ID: {server_data.get('server_id', 0)}"
|
||||
)
|
||||
return friendly_name
|
||||
|
||||
# **********************************************************************************
|
||||
# Servers_Stats Methods
|
||||
# **********************************************************************************
|
||||
@staticmethod
|
||||
def get_latest_server_stats(server_id):
|
||||
return (
|
||||
ServerStats.select()
|
||||
.where(ServerStats.server_id == server_id)
|
||||
.order_by(ServerStats.created.desc())
|
||||
.limit(1)
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_server_stats_by_id(server_id):
|
||||
stats = (
|
||||
ServerStats.select()
|
||||
.where(ServerStats.server_id == server_id)
|
||||
.order_by(ServerStats.created.desc())
|
||||
.limit(1)
|
||||
)
|
||||
return DatabaseShortcuts.return_rows(stats)[0]
|
||||
|
||||
@staticmethod
|
||||
def server_id_exists(server_id):
|
||||
return Servers.select().where(Servers.server_id == server_id).count() != 0
|
||||
|
||||
@staticmethod
|
||||
def sever_crashed(server_id):
|
||||
ServerStats.update(crashed=True).where(
|
||||
ServerStats.server_id == server_id
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def set_download(server_id):
|
||||
ServerStats.update(downloading=True).where(
|
||||
ServerStats.server_id == server_id
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def finish_download(server_id):
|
||||
ServerStats.update(downloading=False).where(
|
||||
ServerStats.server_id == server_id
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_download_status(server_id):
|
||||
download_status = (
|
||||
ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||
)
|
||||
return download_status.downloading
|
||||
|
||||
@staticmethod
|
||||
def server_crash_reset(server_id):
|
||||
ServerStats.update(crashed=False).where(
|
||||
ServerStats.server_id == server_id
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def is_crashed(server_id):
|
||||
svr = ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||
if svr.crashed is True:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def set_update(server_id, value):
|
||||
try:
|
||||
# Checks if server even exists
|
||||
ServerStats.select().where(ServerStats.server_id == server_id)
|
||||
except Exception as ex:
|
||||
logger.error(f"Database entry not found! {ex}")
|
||||
ServerStats.update(updating=value).where(
|
||||
ServerStats.server_id == server_id
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_update_status(server_id):
|
||||
update_status = (
|
||||
ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||
)
|
||||
return update_status.updating
|
||||
|
||||
@staticmethod
|
||||
def set_first_run(server_id):
|
||||
# Sets first run to false
|
||||
try:
|
||||
# Checks if server even exists
|
||||
ServerStats.select().where(ServerStats.server_id == server_id)
|
||||
except Exception as ex:
|
||||
logger.error(f"Database entry not found! {ex}")
|
||||
return
|
||||
ServerStats.update(first_run=False).where(
|
||||
ServerStats.server_id == server_id
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_first_run(server_id):
|
||||
first_run = ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||
return first_run.first_run
|
||||
|
||||
@staticmethod
|
||||
def get_ttl_without_player(server_id):
|
||||
last_stat = (
|
||||
ServerStats.select()
|
||||
.where(ServerStats.server_id == server_id)
|
||||
.order_by(ServerStats.created.desc())
|
||||
.first()
|
||||
)
|
||||
last_stat_with_player = (
|
||||
ServerStats.select()
|
||||
.where(ServerStats.server_id == server_id)
|
||||
.where(ServerStats.online > 0)
|
||||
.order_by(ServerStats.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 = HelperServers.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:
|
||||
# Checks if server even exists
|
||||
ServerStats.select().where(ServerStats.server_id == server_id)
|
||||
except Exception as ex:
|
||||
logger.error(f"Database entry not found! {ex}")
|
||||
ServerStats.update(waiting_start=value).where(
|
||||
ServerStats.server_id == server_id
|
||||
).execute()
|
||||
|
||||
@staticmethod
|
||||
def get_waiting_start(server_id):
|
||||
waiting_start = (
|
||||
ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||
)
|
||||
return waiting_start.waiting_start
|
||||
|
@ -826,8 +826,8 @@ class Helpers:
|
||||
output += f"""<li class="tree-item" data-path="{dpath}">
|
||||
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
||||
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
||||
<i class="far fa-folder"></i>
|
||||
<i class="far fa-folder-open"></i>
|
||||
<i style="color: #8862e0;" class="far fa-folder"></i>
|
||||
<i style="color: #8862e0;" class="far fa-folder-open"></i>
|
||||
{filename}
|
||||
</span>
|
||||
</div><li>
|
||||
@ -835,7 +835,7 @@ class Helpers:
|
||||
else:
|
||||
if filename != "crafty_managed.txt":
|
||||
output += f"""<li
|
||||
class="tree-nested d-block tree-ctx-item tree-file tree-item"
|
||||
class="d-block tree-ctx-item tree-file tree-item"
|
||||
data-path="{dpath}"
|
||||
data-name="{filename}"
|
||||
onclick="clickOnFile(event)"><span style="margin-right: 6px;">
|
||||
@ -864,15 +864,15 @@ class Helpers:
|
||||
output += f"""<li class="tree-item" data-path="{dpath}">
|
||||
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
||||
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
||||
<i class="far fa-folder"></i>
|
||||
<i class="far fa-folder-open"></i>
|
||||
<i style="color: #8862e0;" class="far fa-folder"></i>
|
||||
<i style="color: #8862e0;" class="far fa-folder-open"></i>
|
||||
{filename}
|
||||
</span>
|
||||
</div><li>"""
|
||||
else:
|
||||
if filename != "crafty_managed.txt":
|
||||
output += f"""<li
|
||||
class="tree-nested d-block tree-ctx-item tree-file tree-item"
|
||||
class="d-block tree-ctx-item tree-file tree-item"
|
||||
data-path="{dpath}"
|
||||
data-name="{filename}"
|
||||
onclick="clickOnFile(event)"><span style="margin-right: 6px;">
|
||||
@ -894,8 +894,8 @@ class Helpers:
|
||||
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
||||
<input type="radio" name="root_path" value="{dpath}">
|
||||
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
||||
<i class="far fa-folder"></i>
|
||||
<i class="far fa-folder-open"></i>
|
||||
<i style="color: #8862e0;" class="far fa-folder"></i>
|
||||
<i style="color: #8862e0;" class="far fa-folder-open"></i>
|
||||
{filename}
|
||||
</span>
|
||||
</input></div><li>
|
||||
@ -916,8 +916,8 @@ class Helpers:
|
||||
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
||||
<input type="radio" name="root_path" value="{dpath}">
|
||||
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
||||
<i class="far fa-folder"></i>
|
||||
<i class="far fa-folder-open"></i>
|
||||
<i style="color: #8862e0;" class="far fa-folder"></i>
|
||||
<i style="color: #8862e0;" class="far fa-folder-open"></i>
|
||||
{filename}
|
||||
</span>
|
||||
</input></div><li>"""
|
||||
|
@ -812,6 +812,7 @@ class Controller:
|
||||
Console.info(f"Deleting Server: ID {server_id} | Name: {server_name} ")
|
||||
|
||||
srv_obj = server["server_obj"]
|
||||
srv_obj.server_scheduler.shutdown()
|
||||
running = srv_obj.check_running()
|
||||
|
||||
if running:
|
||||
|
@ -17,7 +17,8 @@ from apscheduler.schedulers.background import BackgroundScheduler
|
||||
|
||||
from app.classes.minecraft.stats import Stats
|
||||
from app.classes.minecraft.mc_ping import ping, ping_bedrock
|
||||
from app.classes.models.servers import ServerStats, HelperServers
|
||||
from app.classes.models.servers import HelperServers
|
||||
from app.classes.models.server_stats import HelperServerStats
|
||||
from app.classes.models.management import HelpersManagement
|
||||
from app.classes.models.users import HelperUsers
|
||||
from app.classes.models.server_permissions import PermissionsServers
|
||||
@ -118,8 +119,8 @@ class Server:
|
||||
)
|
||||
self.is_backingup = False
|
||||
# Reset crash and update at initialization
|
||||
HelperServers.server_crash_reset(self.server_id)
|
||||
HelperServers.set_update(self.server_id, False)
|
||||
HelperServerStats.server_crash_reset(self.server_id)
|
||||
HelperServerStats.set_update(self.server_id, False)
|
||||
|
||||
# **********************************************************************************
|
||||
# Minecraft Server Management
|
||||
@ -142,6 +143,7 @@ class Server:
|
||||
self.name = server_name
|
||||
self.settings = server_data_obj
|
||||
|
||||
HelperServerStats.init_database(server_id)
|
||||
self.record_server_stats()
|
||||
|
||||
# build our server run command
|
||||
@ -163,7 +165,7 @@ class Server:
|
||||
Console.info(f"Starting server ID: {self.server_id} - {self.name}")
|
||||
logger.info(f"Starting server ID: {self.server_id} - {self.name}")
|
||||
# Sets waiting start to false since we're attempting to start the server.
|
||||
HelperServers.set_waiting_start(self.server_id, False)
|
||||
HelperServerStats.set_waiting_start(self.server_id, False)
|
||||
self.run_threaded_server(None)
|
||||
|
||||
# remove the scheduled job since it's ran
|
||||
@ -230,7 +232,7 @@ class Server:
|
||||
else:
|
||||
user_lang = HelperUsers.get_user_lang_by_id(user_id)
|
||||
|
||||
if HelperServers.get_download_status(self.server_id):
|
||||
if HelperServerStats.get_download_status(self.server_id):
|
||||
if user_id:
|
||||
self.helper.websocket_helper.broadcast_user(
|
||||
user_id,
|
||||
@ -403,7 +405,7 @@ class Server:
|
||||
).start()
|
||||
|
||||
self.is_crashed = False
|
||||
HelperServers.server_crash_reset(self.server_id)
|
||||
HelperServerStats.server_crash_reset(self.server_id)
|
||||
|
||||
self.start_time = str(datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"))
|
||||
|
||||
@ -411,7 +413,7 @@ class Server:
|
||||
logger.info(f"Server {self.name} running with PID {self.process.pid}")
|
||||
Console.info(f"Server {self.name} running with PID {self.process.pid}")
|
||||
self.is_crashed = False
|
||||
HelperServers.server_crash_reset(self.server_id)
|
||||
HelperServerStats.server_crash_reset(self.server_id)
|
||||
self.record_server_stats()
|
||||
check_internet_thread = threading.Thread(
|
||||
target=self.check_internet_thread,
|
||||
@ -424,11 +426,11 @@ class Server:
|
||||
)
|
||||
check_internet_thread.start()
|
||||
# Checks if this is the servers first run.
|
||||
if HelperServers.get_first_run(self.server_id):
|
||||
HelperServers.set_first_run(self.server_id)
|
||||
loc_server_port = HelperServers.get_server_stats_by_id(self.server_id)[
|
||||
"server_port"
|
||||
]
|
||||
if HelperServerStats.get_first_run(self.server_id):
|
||||
HelperServerStats.set_first_run(self.server_id)
|
||||
loc_server_port = HelperServerStats.get_server_stats_by_id(
|
||||
self.server_id
|
||||
)["server_port"]
|
||||
# Sends port reminder message.
|
||||
self.helper.websocket_helper.broadcast_user(
|
||||
user_id,
|
||||
@ -708,7 +710,7 @@ class Server:
|
||||
self.server_scheduler.remove_job("c_" + str(self.server_id))
|
||||
return
|
||||
|
||||
HelperServers.sever_crashed(self.server_id)
|
||||
HelperServerStats.sever_crashed(self.server_id)
|
||||
# if we haven't tried to restart more 3 or more times
|
||||
if self.restart_count <= 3:
|
||||
|
||||
@ -732,7 +734,7 @@ class Server:
|
||||
|
||||
self.restart_count = 0
|
||||
self.is_crashed = True
|
||||
HelperServers.sever_crashed(self.server_id)
|
||||
HelperServerStats.sever_crashed(self.server_id)
|
||||
|
||||
# cancel the watcher task
|
||||
self.server_scheduler.remove_job("c_" + str(self.server_id))
|
||||
@ -962,7 +964,7 @@ class Server:
|
||||
return []
|
||||
|
||||
def jar_update(self):
|
||||
HelperServers.set_update(self.server_id, True)
|
||||
HelperServerStats.set_update(self.server_id, True)
|
||||
update_thread = threading.Thread(
|
||||
target=self.a_jar_update, daemon=True, name=f"exe_update_{self.name}"
|
||||
)
|
||||
@ -970,7 +972,7 @@ class Server:
|
||||
|
||||
def check_update(self):
|
||||
|
||||
if HelperServers.get_server_stats_by_id(self.server_id)["updating"]:
|
||||
if HelperServerStats.get_server_stats_by_id(self.server_id)["updating"]:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
@ -1043,11 +1045,11 @@ class Server:
|
||||
self.settings["executable_update_url"], current_executable
|
||||
)
|
||||
|
||||
while HelperServers.get_server_stats_by_id(self.server_id)["updating"]:
|
||||
while HelperServerStats.get_server_stats_by_id(self.server_id)["updating"]:
|
||||
if downloaded and not self.is_backingup:
|
||||
logger.info("Executable updated successfully. Starting Server")
|
||||
|
||||
HelperServers.set_update(self.server_id, False)
|
||||
HelperServerStats.set_update(self.server_id, False)
|
||||
if len(self.helper.websocket_helper.clients) > 0:
|
||||
# There are clients
|
||||
self.check_update()
|
||||
@ -1443,29 +1445,11 @@ class Server:
|
||||
def record_server_stats(self):
|
||||
|
||||
server = self.get_servers_stats()
|
||||
ServerStats.insert(
|
||||
{
|
||||
ServerStats.server_id: server.get("id", 0),
|
||||
ServerStats.started: server.get("started", ""),
|
||||
ServerStats.running: server.get("running", False),
|
||||
ServerStats.cpu: server.get("cpu", 0),
|
||||
ServerStats.mem: server.get("mem", 0),
|
||||
ServerStats.mem_percent: server.get("mem_percent", 0),
|
||||
ServerStats.world_name: server.get("world_name", ""),
|
||||
ServerStats.world_size: server.get("world_size", ""),
|
||||
ServerStats.server_port: server.get("server_port", ""),
|
||||
ServerStats.int_ping_results: server.get("int_ping_results", False),
|
||||
ServerStats.online: server.get("online", False),
|
||||
ServerStats.max: server.get("max", False),
|
||||
ServerStats.players: server.get("players", False),
|
||||
ServerStats.desc: server.get("desc", False),
|
||||
ServerStats.version: server.get("version", False),
|
||||
}
|
||||
).execute()
|
||||
HelperServerStats.insert_server_stats(server)
|
||||
|
||||
# delete old data
|
||||
max_age = self.helper.get_setting("history_max_age")
|
||||
now = datetime.datetime.now()
|
||||
last_week = now.day - max_age
|
||||
|
||||
ServerStats.delete().where(ServerStats.created < last_week).execute()
|
||||
HelperServerStats.remove_old_stats(server.get("id", 0), last_week)
|
||||
|
@ -70,9 +70,7 @@ class AjaxHandler(BaseHandler):
|
||||
|
||||
for line in data:
|
||||
try:
|
||||
line = re.sub(
|
||||
"(\033\\[(0;)?[0-9]*[A-z]?(;[0-9])?m?)|(> )", "", line
|
||||
)
|
||||
line = re.sub("(\033\\[(0;)?[0-9]*[A-z]?(;[0-9])?m?)", "", line)
|
||||
line = re.sub("[A-z]{2}\b\b", "", line)
|
||||
line = self.helper.log_colors(html.escape(line))
|
||||
self.write(f"{line}<br />")
|
||||
@ -136,15 +134,15 @@ class AjaxHandler(BaseHandler):
|
||||
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
||||
<input type="checkbox" class="checkBoxClass" name="root_path" value="{dpath}" checked>
|
||||
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
||||
<i class="far fa-folder"></i>
|
||||
<i class="far fa-folder-open"></i>
|
||||
<i style="color: #8862e0;" class="far fa-folder"></i>
|
||||
<i style="color: #8862e0;" class="far fa-folder-open"></i>
|
||||
<strong>{filename}</strong>
|
||||
</span>
|
||||
</input></div><li>
|
||||
\n"""
|
||||
else:
|
||||
output += f"""<li
|
||||
class="tree-nested d-block tree-ctx-item tree-file"
|
||||
class="d-block tree-ctx-item tree-file"
|
||||
data-path="{dpath}"
|
||||
data-name="{filename}"
|
||||
onclick=""><input type='checkbox' class="checkBoxClass" name='root_path' value="{dpath}" checked><span style="margin-right: 6px;">
|
||||
@ -156,15 +154,15 @@ class AjaxHandler(BaseHandler):
|
||||
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
||||
<input type="checkbox" class="checkBoxClass" name="root_path" value="{dpath}">
|
||||
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
||||
<i class="far fa-folder"></i>
|
||||
<i class="far fa-folder-open"></i>
|
||||
<i style="color: #8862e0;" class="far fa-folder"></i>
|
||||
<i style="color: #8862e0;" class="far fa-folder-open"></i>
|
||||
<strong>{filename}</strong>
|
||||
</span>
|
||||
</input></div><li>
|
||||
\n"""
|
||||
else:
|
||||
output += f"""<li
|
||||
class="tree-nested d-block tree-ctx-item tree-file"
|
||||
class="d-block tree-ctx-item tree-file"
|
||||
data-path="{dpath}"
|
||||
data-name="{filename}"
|
||||
onclick=""><input type='checkbox' class="checkBoxClass" name='root_path' value="{dpath}">
|
||||
@ -200,7 +198,7 @@ class AjaxHandler(BaseHandler):
|
||||
if os.path.isdir(rel):
|
||||
output += f"""<li class="tree-item" data-path="{dpath}">
|
||||
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
||||
<input type="checkbox" name="root_path" value="{dpath}">
|
||||
<input type="checkbox" name="root_path" value="{dpath}" checked>
|
||||
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
||||
<i class="far fa-folder"></i>
|
||||
<i class="far fa-folder-open"></i>
|
||||
@ -212,7 +210,7 @@ class AjaxHandler(BaseHandler):
|
||||
class="tree-item tree-nested d-block tree-ctx-item tree-file"
|
||||
data-path="{dpath}"
|
||||
data-name="{filename}"
|
||||
onclick=""><input type='checkbox' name='root_path' value='{dpath}'><span style="margin-right: 6px;">
|
||||
onclick=""><input type='checkbox' name='root_path' value='{dpath}' checked><span style="margin-right: 6px;">
|
||||
<i class="far fa-file"></i></span></input>{filename}</li>"""
|
||||
|
||||
else:
|
||||
|
@ -5,39 +5,60 @@
|
||||
<div class="row">
|
||||
<div class="col-sm-4 mr-2">
|
||||
{% if data['server_stats']['running'] %}
|
||||
<b>{{ translate('serverStats', 'serverStatus', data['lang']) }}:</b> <span id="status" class="text-success">{{ translate('serverStats', 'online', data['lang']) }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverStarted', data['lang']) }}:</b> <span id="started">{{ data['server_stats']['started'] }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverUptime', data['lang']) }}:</b> <span id="uptime">{{ translate('serverStats', 'errorCalculatingUptime', data['lang']) }}</span>
|
||||
<b>{{ translate('serverStats', 'serverStatus', data['lang']) }}:</b> <span id="status"
|
||||
class="text-success">{{ translate('serverStats', 'online', data['lang']) }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverStarted', data['lang']) }}:</b> <span id="started">{{
|
||||
data['server_stats']['started'] }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverUptime', data['lang']) }}:</b> <span id="uptime">{{
|
||||
translate('serverStats', 'errorCalculatingUptime', data['lang']) }}</span>
|
||||
{% elif data['server_stats']['crashed'] %}
|
||||
<b>{{ translate('serverStats', 'serverStatus', data['lang']) }}:</b> <span id="status" class="text-danger"> <i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang']) }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverStarted', data['lang']) }}:</b> <span id="started" class="text-danger"> <i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang']) }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverUptime', data['lang']) }}:</b> <span id="uptime" class="text-danger"> <i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang']) }}</span>
|
||||
<b>{{ translate('serverStats', 'serverStatus', data['lang']) }}:</b> <span id="status" class="text-danger">
|
||||
<i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang'])
|
||||
}}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverStarted', data['lang']) }}:</b> <span id="started"
|
||||
class="text-danger"> <i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed',
|
||||
data['lang']) }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverUptime', data['lang']) }}:</b> <span id="uptime" class="text-danger">
|
||||
<i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang']) }}</span>
|
||||
{% else %}
|
||||
<b>{{ translate('serverStats', 'serverStatus', data['lang']) }}:</b> <span id="status" class="text-warning">{{ translate('serverStats', 'offline', data['lang']) }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverStarted', data['lang']) }}:</b> <span id="started" class="text-warning">{{ translate('serverStats', 'offline', data['lang']) }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverUptime', data['lang']) }}:</b> <span id="uptime" class="text-warning">{{ translate('serverStats', 'offline', data['lang']) }}</span>
|
||||
<b>{{ translate('serverStats', 'serverStatus', data['lang']) }}:</b> <span id="status"
|
||||
class="text-warning">{{ translate('serverStats', 'offline', data['lang']) }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverStarted', data['lang']) }}:</b> <span id="started"
|
||||
class="text-warning">{{ translate('serverStats', 'offline', data['lang']) }}</span><br />
|
||||
<b>{{ translate('serverStats', 'serverUptime', data['lang']) }}:</b> <span id="uptime"
|
||||
class="text-warning">{{ translate('serverStats', 'offline', data['lang']) }}</span>
|
||||
{% end %}
|
||||
<br>
|
||||
<b>{{ translate('serverStats', 'serverTimeZone', data['lang']) }}:</b> <span class="text-info">{{ data['serverTZ'] }}</span>
|
||||
<b>{{ translate('serverStats', 'serverTimeZone', data['lang']) }}:</b> <span class="text-info">{{
|
||||
data['serverTZ'] }}</span>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 mr-2">
|
||||
<b>{{ translate('serverStats', 'cpuUsage', data['lang']) }}:</b> <span id="cpu">{{ data['server_stats']['cpu'] }}%</span> <br />
|
||||
<b>{{ translate('serverStats', 'memUsage', data['lang']) }}:</b> <span id="mem" >{{ data['server_stats']['mem'] }}</span> <br />
|
||||
<b>{{ translate('serverStats', 'cpuUsage', data['lang']) }}:</b> <span id="cpu">{{
|
||||
data['server_stats']['cpu'] }}%</span> <br />
|
||||
<b>{{ translate('serverStats', 'memUsage', data['lang']) }}:</b> <span id="mem">{{
|
||||
data['server_stats']['mem'] }}</span> <br />
|
||||
{% if data['server_stats']['int_ping_results'] %}
|
||||
<b>{{ translate('serverStats', 'players', data['lang']) }}:</b> <span id="players" >{{ data['server_stats']['online'] }} / {{ data['server_stats']['max'] }}</span><br />
|
||||
<b>{{ translate('serverStats', 'players', data['lang']) }}:</b> <span id="players">{{
|
||||
data['server_stats']['online'] }} / {{ data['server_stats']['max'] }}</span><br />
|
||||
{% else %}
|
||||
<b>{{ translate('serverStats', 'players', data['lang']) }}:</b> <span id="players" >0/0</span><br />
|
||||
<b>{{ translate('serverStats', 'players', data['lang']) }}:</b> <span id="players">0/0</span><br />
|
||||
{% end %}
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 mr-2">
|
||||
{% if data['server_stats']['version'] != 'False' %}
|
||||
<b>{{ translate('serverStats', 'version', data['lang']) }}:</b> <span id="version">{{ data['server_stats']['version'] }}</span><br />
|
||||
<b>{{ translate('serverStats', 'description', data['lang']) }}:</b> <span id="input_motd" style="max-width: 10px; max-height: 10px" class="input_motd">{{ data['server_stats']['desc'] }}</span> <br />
|
||||
<b>{{ translate('serverStats', 'version', data['lang']) }}:</b> <span id="version">{{
|
||||
data['server_stats']['version'] }}</span><br />
|
||||
<b>{{ translate('serverStats', 'description', data['lang']) }}:</b> <span id="input_motd"
|
||||
style="max-width: 10px; max-height: 10px" class="input_motd">{{ data['server_stats']['desc'] }}</span>
|
||||
<br />
|
||||
{% else %}
|
||||
<b>{{ translate('serverStats', 'version', data['lang']) }}:</b> <span id="version">{{ translate('serverStats', 'unableToConnect', data['lang']) }}</span> <br />
|
||||
<b>{{ translate('serverStats', 'description', data['lang']) }}:</b> <span style="max-width: 10px; max-height: 10px" id="input_motd" class="input_motd">{{ translate('serverStats', 'unableToConnect', data['lang']) }}</span> <br />
|
||||
<b>{{ translate('serverStats', 'version', data['lang']) }}:</b> <span id="version">{{
|
||||
translate('serverStats', 'unableToConnect', data['lang']) }}</span> <br />
|
||||
<b>{{ translate('serverStats', 'description', data['lang']) }}:</b> <span
|
||||
style="max-width: 10px; max-height: 10px" id="input_motd" class="input_motd">{{ translate('serverStats',
|
||||
'unableToConnect', data['lang']) }}</span> <br />
|
||||
{% end %}
|
||||
<b>Server Type: <span class="text-info">{{data['server_stats']['server_type']}}</span></b>
|
||||
|
||||
@ -64,6 +85,15 @@
|
||||
seconds: duration._data.seconds
|
||||
}
|
||||
|
||||
if (Math.round(duration._data.days)) {
|
||||
obj = {
|
||||
days: Math.round(duration._data.days),
|
||||
hours: Math.round(duration._data.hours -= duration._data.days * 24),
|
||||
minutes: duration._data.minutes,
|
||||
seconds: duration._data.seconds
|
||||
}
|
||||
}
|
||||
|
||||
output = Object.entries(obj)
|
||||
.map(([type, num]) => {
|
||||
// make them strings
|
||||
@ -135,9 +165,9 @@
|
||||
server_input_motd = document.getElementById('input_motd');
|
||||
|
||||
/* TODO Update each element */
|
||||
if (server.running){
|
||||
server_status.setAttribute("class", "text-success");
|
||||
server_status.innerHTML = `{{ translate('serverStats', 'online', data['lang']) }}`;
|
||||
if (server.running) {
|
||||
server_status.setAttribute("class", "text-success");
|
||||
server_status.innerHTML = `{{ translate('serverStats', 'online', data['lang']) }}`;
|
||||
|
||||
startedUTC = server.started;
|
||||
startedUTC = moment.utc(startedUTC, 'YYYY-MM-DD HH:mm:ss');
|
||||
@ -156,9 +186,8 @@
|
||||
uptimeLoop = setInterval(calculateUptime, 1000);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (server.crashed){
|
||||
else {
|
||||
if (server.crashed) {
|
||||
server_status.setAttribute("class", "text-danger");
|
||||
server_status.innerHTML = `<i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang']) }}`;
|
||||
server_started.setAttribute("class", "text-danger");
|
||||
@ -167,37 +196,33 @@
|
||||
uptimeLoop = null;
|
||||
server_uptime.setAttribute("class", "text-danger");
|
||||
server_uptime.innerHTML = `<i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang']) }}`;
|
||||
}else{
|
||||
server_status.setAttribute("class", "text-warning");
|
||||
server_status.innerHTML = `{{ translate('serverStats', 'offline', data['lang']) }}`;
|
||||
server_started.setAttribute("class", "text-warning");
|
||||
server_started.innerHTML = `{{ translate('serverStats', 'offline', data['lang']) }}`;
|
||||
clearInterval(uptimeLoop);
|
||||
uptimeLoop = null;
|
||||
server_uptime.setAttribute("class", "text-warning");
|
||||
server_uptime.innerHTML = `{{ translate('serverStats', 'offline', data['lang']) }}`;
|
||||
} else {
|
||||
server_status.setAttribute("class", "text-warning");
|
||||
server_status.innerHTML = `{{ translate('serverStats', 'offline', data['lang']) }}`;
|
||||
server_started.setAttribute("class", "text-warning");
|
||||
server_started.innerHTML = `{{ translate('serverStats', 'offline', data['lang']) }}`;
|
||||
clearInterval(uptimeLoop);
|
||||
uptimeLoop = null;
|
||||
server_uptime.setAttribute("class", "text-warning");
|
||||
server_uptime.innerHTML = `{{ translate('serverStats', 'offline', data['lang']) }}`;
|
||||
}
|
||||
}
|
||||
|
||||
server_cpu.innerHTML = server.cpu + ` %`;
|
||||
server_mem.innerHTML = server.mem;
|
||||
|
||||
if (server.int_ping_results)
|
||||
{
|
||||
if (server.int_ping_results) {
|
||||
server_players.innerHTML = server.online + `/` + server.max;
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
server_players.innerHTML = `0/0`;
|
||||
}
|
||||
|
||||
if (server.version)
|
||||
{
|
||||
if (server.version) {
|
||||
server_version.innerHTML = server.version;
|
||||
server_input_motd.innerHTML = server.desc;
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
server_version.innerHTML = `{{ translate('serverStats', 'unableToConnect', data['lang']) }}`;
|
||||
server_input_motd.innerHTML = `{{ translate('serverStats', 'unableToConnect', data['lang']) }}`;
|
||||
}
|
||||
@ -213,4 +238,4 @@
|
||||
webSocket.on('update_server_details', update_server_details);
|
||||
//}
|
||||
});
|
||||
</script>
|
||||
</script>
|
@ -39,12 +39,15 @@
|
||||
<noscript>
|
||||
{{ translate('serverFiles', 'noscript', data['lang']) }}
|
||||
</noscript>
|
||||
<div id="files-tree-nav" class="overlay">
|
||||
<div id="files-tree-nav" class="overlay" style="background-color: #9f9daf !important;">
|
||||
|
||||
<!-- Button to close the overlay navigation -->
|
||||
|
||||
<!-- Overlay content -->
|
||||
<div id="files-tree-nav-content" class="overlay-content">
|
||||
<div id="files-tree-nav-content" class="overlay-content" style="background-color: #9f9daf;">
|
||||
<h4 id="context-title" style="color:#4b00ff; text-align: center; padding: 3px;">
|
||||
</h4>
|
||||
<p style="width: 90%; border-bottom: 2px solid black; margin:0 auto;"></p>
|
||||
<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="#">{{
|
||||
@ -72,7 +75,7 @@
|
||||
.overlay {
|
||||
display: none;
|
||||
flex-direction: column;
|
||||
background-color: #fff;
|
||||
background-color: #9f9daf;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 10px 20px rgb(64 64 64 / 5%);
|
||||
padding: 10px 0;
|
||||
@ -97,7 +100,7 @@
|
||||
.overlay-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background-color: #fff;
|
||||
background-color: #9f9daf;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 10px 20px rgb(64 64 64 / 5%);
|
||||
padding: 10px 0;
|
||||
@ -125,7 +128,7 @@
|
||||
/* When you mouse over the navigation links, change their color */
|
||||
.overlay a:hover,
|
||||
.overlay a:focus {
|
||||
background: #f1f3f7;
|
||||
background: grey;
|
||||
color: #4b00ff;
|
||||
}
|
||||
|
||||
@ -445,6 +448,9 @@
|
||||
e.stopImmediatePropagation();
|
||||
var ctxmenuPath = e.target.getAttribute('data-path');
|
||||
var ctxmenuName = e.target.getAttribute('data-name');
|
||||
|
||||
document.getElementById('context-title').innerHTML = ctxmenuName;
|
||||
console.log(ctxmenuName);
|
||||
if (!ctxmenuPath) {
|
||||
console.log({ 'event.target': e.target, ctxmenuPath });
|
||||
return;
|
||||
@ -926,6 +932,9 @@
|
||||
$('#deleteDir').toggle(isDir);
|
||||
$('#upload').toggle(isDir);
|
||||
|
||||
document.getElementById('context-title').innerHTML = ctxmenuName;
|
||||
console.log(ctxmenuName);
|
||||
|
||||
var isFile = event.target.classList.contains('tree-file');
|
||||
$('#deleteFile').toggle(isFile);
|
||||
$('#downloadFile').toggle(isFile);
|
||||
|
42
app/migrations/stats/20220427_init.py
Normal file
42
app/migrations/stats/20220427_init.py
Normal file
@ -0,0 +1,42 @@
|
||||
import peewee
|
||||
import datetime
|
||||
|
||||
from app.classes.models.servers import Servers
|
||||
|
||||
|
||||
def migrate(migrator, database, **kwargs):
|
||||
db = database
|
||||
|
||||
class ServerStats(peewee.Model):
|
||||
stats_id = peewee.AutoField()
|
||||
created = peewee.DateTimeField(default=datetime.datetime.now)
|
||||
server_id = peewee.ForeignKeyField(Servers, backref="server", index=True)
|
||||
started = peewee.CharField(default="")
|
||||
running = peewee.BooleanField(default=False)
|
||||
cpu = peewee.FloatField(default=0)
|
||||
mem = peewee.FloatField(default=0)
|
||||
mem_percent = peewee.FloatField(default=0)
|
||||
world_name = peewee.CharField(default="")
|
||||
world_size = peewee.CharField(default="")
|
||||
server_port = peewee.IntegerField(default=25565)
|
||||
int_ping_results = peewee.CharField(default="")
|
||||
online = peewee.IntegerField(default=0)
|
||||
max = peewee.IntegerField(default=0)
|
||||
players = peewee.CharField(default="")
|
||||
desc = peewee.CharField(default="Unable to Connect")
|
||||
version = peewee.CharField(default="")
|
||||
updating = peewee.BooleanField(default=False)
|
||||
waiting_start = peewee.BooleanField(default=False)
|
||||
first_run = peewee.BooleanField(default=True)
|
||||
crashed = peewee.BooleanField(default=False)
|
||||
downloading = peewee.BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
table_name = "server_stats"
|
||||
database = db
|
||||
|
||||
migrator.create_table(ServerStats)
|
||||
|
||||
|
||||
def rollback(migrator, database, **kwargs):
|
||||
migrator.drop_table("server_stats")
|
@ -34,9 +34,9 @@
|
||||
RewriteCond %{HTTP:Connection} upgrade [NC]
|
||||
RewriteRule .* "wss://127.0.0.1:8443%{REQUEST_URI}" [P]
|
||||
|
||||
SSLCertificateFile /var/opt/minecraft/crafty-commander/app/config/web/certs/commander.cert.pem
|
||||
SSLCertificateFile /var/opt/minecraft/crafty4/app/config/web/certs/commander.cert.pem
|
||||
|
||||
SSLCertificateKeyFile /var/opt/minecraft/crafty-commander/app/config/web/certs/commander.key.pem
|
||||
SSLCertificateKeyFile /var/opt/minecraft/crafty4/app/config/web/certs/commander.key.pem
|
||||
|
||||
ProxyPass / https://127.0.0.1:8443/
|
||||
ProxyPassReverse / https://127.0.0.1:8443/
|
||||
|
2
main.py
2
main.py
@ -131,7 +131,7 @@ if __name__ == "__main__":
|
||||
else:
|
||||
Console.debug("Existing install detected")
|
||||
|
||||
# now the tables are created, we can load the tasks_manger and server controller
|
||||
# now the tables are created, we can load the tasks_manager and server controller
|
||||
controller = Controller(database, helper)
|
||||
tasks_manager = TasksManager(helper, controller)
|
||||
tasks_manager.start_webserver()
|
||||
|
Loading…
Reference in New Issue
Block a user