mirror of
https://gitlab.com/crafty-controller/crafty-4.git
synced 2024-08-30 18:23:09 +00:00
Merge branch 'dev' into feature/openmetrics-implementation
This commit is contained in:
commit
5947d4ebbf
@ -13,6 +13,8 @@
|
|||||||
- Fix public status page not updating #255 ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/615))
|
- Fix public status page not updating #255 ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/615))
|
||||||
- Fix service worker vulrn and CQ raised by SonarQ ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/631))
|
- Fix service worker vulrn and CQ raised by SonarQ ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/631))
|
||||||
- Fix Backup Restore/Schedules, Backup button function on `remote-comms2` ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/634))
|
- Fix Backup Restore/Schedules, Backup button function on `remote-comms2` ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/634))
|
||||||
|
- Add a wait to the call for the directory so we can make sure the wait dialogue has time to show up first ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/637))
|
||||||
|
- Fix bug where a reaction loop could be created, but would be cut short by an error when the loop occurred ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/636))
|
||||||
### Refactor
|
### Refactor
|
||||||
- Consolidate remaining frontend functions into API V2, and remove ajax internal API ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/585))
|
- Consolidate remaining frontend functions into API V2, and remove ajax internal API ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/585))
|
||||||
- Replace bleach with nh3 ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/628))
|
- Replace bleach with nh3 ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/628))
|
||||||
@ -25,6 +27,8 @@
|
|||||||
- Use `Jar` class naming for jar refresh to make room for steamCMD naming in the future ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/630))
|
- Use `Jar` class naming for jar refresh to make room for steamCMD naming in the future ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/630))
|
||||||
- Improve ui visibility of Build Wizard selection tabs ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/633))
|
- Improve ui visibility of Build Wizard selection tabs ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/633))
|
||||||
- Add additional logging for server bootstrap & moves unnecessary logging to `debug` for improved log clarity ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/635))
|
- Add additional logging for server bootstrap & moves unnecessary logging to `debug` for improved log clarity ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/635))
|
||||||
|
- Bump orjson to 3.9.7 for python 3.12 support ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/638))
|
||||||
|
- Bump all Crafty required python dependancies, maintaining minimum 3.9 support ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/639))
|
||||||
### Lang
|
### Lang
|
||||||
TBD
|
TBD
|
||||||
<br><br>
|
<br><br>
|
||||||
|
@ -8,11 +8,11 @@ import time
|
|||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import threading
|
import threading
|
||||||
|
from zoneinfo import ZoneInfoNotFoundError
|
||||||
from peewee import DoesNotExist
|
from peewee import DoesNotExist
|
||||||
|
|
||||||
# TZLocal is set as a hidden import on win pipeline
|
# TZLocal is set as a hidden import on win pipeline
|
||||||
from tzlocal import get_localzone
|
from tzlocal import get_localzone
|
||||||
from tzlocal.utils import ZoneInfoNotFoundError
|
|
||||||
from apscheduler.schedulers.background import BackgroundScheduler
|
from apscheduler.schedulers.background import BackgroundScheduler
|
||||||
|
|
||||||
from app.classes.models.server_permissions import EnumPermissionsServer
|
from app.classes.models.server_permissions import EnumPermissionsServer
|
||||||
|
@ -16,8 +16,8 @@ import json
|
|||||||
from zoneinfo import ZoneInfo
|
from zoneinfo import ZoneInfo
|
||||||
|
|
||||||
# TZLocal is set as a hidden import on win pipeline
|
# TZLocal is set as a hidden import on win pipeline
|
||||||
|
from zoneinfo import ZoneInfoNotFoundError
|
||||||
from tzlocal import get_localzone
|
from tzlocal import get_localzone
|
||||||
from tzlocal.utils import ZoneInfoNotFoundError
|
|
||||||
from apscheduler.schedulers.background import BackgroundScheduler
|
from apscheduler.schedulers.background import BackgroundScheduler
|
||||||
from apscheduler.jobstores.base import JobLookupError, ConflictingIdError
|
from apscheduler.jobstores.base import JobLookupError, ConflictingIdError
|
||||||
|
|
||||||
@ -45,6 +45,45 @@ with redirect_stderr(NullWriter()):
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def callback(called_func):
|
||||||
|
# Usage of @callback on method
|
||||||
|
# definition to run a webhook check
|
||||||
|
# on method completion
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
res = None
|
||||||
|
logger.debug("Checking for callbacks")
|
||||||
|
try:
|
||||||
|
res = called_func(*args, **kwargs)
|
||||||
|
finally:
|
||||||
|
events = WebhookFactory.get_monitored_events()
|
||||||
|
if called_func.__name__ in events:
|
||||||
|
server_webhooks = HelpersWebhooks.get_webhooks_by_server(
|
||||||
|
args[0].server_id, True
|
||||||
|
)
|
||||||
|
for swebhook in server_webhooks:
|
||||||
|
if called_func.__name__ in str(swebhook.trigger).split(","):
|
||||||
|
logger.info(
|
||||||
|
f"Found callback for event {called_func.__name__}"
|
||||||
|
f" for server {args[0].server_id}"
|
||||||
|
)
|
||||||
|
webhook = HelpersWebhooks.get_webhook_by_id(swebhook.id)
|
||||||
|
webhook_provider = WebhookFactory.create_provider(
|
||||||
|
webhook["webhook_type"]
|
||||||
|
)
|
||||||
|
if res is not False and swebhook.enabled:
|
||||||
|
webhook_provider.send(
|
||||||
|
bot_name=webhook["bot_name"],
|
||||||
|
server_name=args[0].name,
|
||||||
|
title=webhook["name"],
|
||||||
|
url=webhook["url"],
|
||||||
|
message=webhook["body"],
|
||||||
|
color=webhook["color"],
|
||||||
|
)
|
||||||
|
return res
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
class ServerOutBuf:
|
class ServerOutBuf:
|
||||||
lines = {}
|
lines = {}
|
||||||
|
|
||||||
@ -172,45 +211,6 @@ class ServerInstance:
|
|||||||
self.stats_helper.server_crash_reset()
|
self.stats_helper.server_crash_reset()
|
||||||
self.stats_helper.set_update(False)
|
self.stats_helper.set_update(False)
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def callback(called_func):
|
|
||||||
# Usage of @callback on method
|
|
||||||
# definition to run a webhook check
|
|
||||||
# on method completion
|
|
||||||
def wrapper(*args, **kwargs):
|
|
||||||
res = None
|
|
||||||
logger.debug("Checking for callbacks")
|
|
||||||
try:
|
|
||||||
res = called_func(*args, **kwargs)
|
|
||||||
finally:
|
|
||||||
events = WebhookFactory.get_monitored_events()
|
|
||||||
if called_func.__name__ in events:
|
|
||||||
server_webhooks = HelpersWebhooks.get_webhooks_by_server(
|
|
||||||
args[0].server_id, True
|
|
||||||
)
|
|
||||||
for swebhook in server_webhooks:
|
|
||||||
if called_func.__name__ in str(swebhook.trigger).split(","):
|
|
||||||
logger.info(
|
|
||||||
f"Found callback for event {called_func.__name__}"
|
|
||||||
f" for server {args[0].server_id}"
|
|
||||||
)
|
|
||||||
webhook = HelpersWebhooks.get_webhook_by_id(swebhook.id)
|
|
||||||
webhook_provider = WebhookFactory.create_provider(
|
|
||||||
webhook["webhook_type"]
|
|
||||||
)
|
|
||||||
if res is not False and swebhook.enabled:
|
|
||||||
webhook_provider.send(
|
|
||||||
bot_name=webhook["bot_name"],
|
|
||||||
server_name=args[0].name,
|
|
||||||
title=webhook["name"],
|
|
||||||
url=webhook["url"],
|
|
||||||
message=webhook["body"],
|
|
||||||
color=webhook["color"],
|
|
||||||
)
|
|
||||||
return res
|
|
||||||
|
|
||||||
return wrapper
|
|
||||||
|
|
||||||
# **********************************************************************************
|
# **********************************************************************************
|
||||||
# Minecraft Server Management
|
# Minecraft Server Management
|
||||||
# **********************************************************************************
|
# **********************************************************************************
|
||||||
|
@ -5,9 +5,8 @@ import threading
|
|||||||
import asyncio
|
import asyncio
|
||||||
import datetime
|
import datetime
|
||||||
import json
|
import json
|
||||||
|
from zoneinfo import ZoneInfoNotFoundError
|
||||||
from tzlocal import get_localzone
|
from tzlocal import get_localzone
|
||||||
from tzlocal.utils import ZoneInfoNotFoundError
|
|
||||||
from apscheduler.events import EVENT_JOB_EXECUTED
|
from apscheduler.events import EVENT_JOB_EXECUTED
|
||||||
from apscheduler.schedulers.background import BackgroundScheduler
|
from apscheduler.schedulers.background import BackgroundScheduler
|
||||||
from apscheduler.triggers.cron import CronTrigger
|
from apscheduler.triggers.cron import CronTrigger
|
||||||
@ -330,6 +329,8 @@ class TasksManager:
|
|||||||
|
|
||||||
# Check to see if it's enabled and is not a chain reaction.
|
# Check to see if it's enabled and is not a chain reaction.
|
||||||
if job_data["enabled"] and job_data["interval_type"] != "reaction":
|
if job_data["enabled"] and job_data["interval_type"] != "reaction":
|
||||||
|
# Lets make sure this can not be mistaken for a reaction
|
||||||
|
job_data["parent"] = None
|
||||||
new_job = "error"
|
new_job = "error"
|
||||||
if job_data["cron_string"] != "":
|
if job_data["cron_string"] != "":
|
||||||
try:
|
try:
|
||||||
@ -450,7 +451,10 @@ class TasksManager:
|
|||||||
def update_job(self, sch_id, job_data):
|
def update_job(self, sch_id, job_data):
|
||||||
# Checks to make sure some doofus didn't actually make the newly
|
# Checks to make sure some doofus didn't actually make the newly
|
||||||
# created task a child of itself.
|
# created task a child of itself.
|
||||||
if str(job_data.get("parent")) == str(sch_id):
|
if (
|
||||||
|
str(job_data.get("parent")) == str(sch_id)
|
||||||
|
or job_data["interval_type"] != "reaction"
|
||||||
|
):
|
||||||
job_data["parent"] = None
|
job_data["parent"] = None
|
||||||
HelpersManagement.update_scheduled_task(sch_id, job_data)
|
HelpersManagement.update_scheduled_task(sch_id, job_data)
|
||||||
|
|
||||||
@ -609,7 +613,10 @@ class TasksManager:
|
|||||||
):
|
):
|
||||||
# event job ID's are strings so we need to look at
|
# event job ID's are strings so we need to look at
|
||||||
# this as the same data type.
|
# this as the same data type.
|
||||||
if str(schedule.parent) == str(event.job_id):
|
if (
|
||||||
|
str(schedule.parent) == str(event.job_id)
|
||||||
|
and schedule.interval_type == "reaction"
|
||||||
|
):
|
||||||
if schedule.enabled:
|
if schedule.enabled:
|
||||||
delaytime = datetime.datetime.now() + datetime.timedelta(
|
delaytime = datetime.datetime.now() + datetime.timedelta(
|
||||||
seconds=schedule.delay
|
seconds=schedule.delay
|
||||||
|
@ -7,6 +7,7 @@ import json
|
|||||||
import logging
|
import logging
|
||||||
import threading
|
import threading
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
|
from zoneinfo import ZoneInfoNotFoundError
|
||||||
import nh3
|
import nh3
|
||||||
import requests
|
import requests
|
||||||
import tornado.web
|
import tornado.web
|
||||||
@ -15,7 +16,6 @@ from tornado import iostream
|
|||||||
|
|
||||||
# TZLocal is set as a hidden import on win pipeline
|
# TZLocal is set as a hidden import on win pipeline
|
||||||
from tzlocal import get_localzone
|
from tzlocal import get_localzone
|
||||||
from tzlocal.utils import ZoneInfoNotFoundError
|
|
||||||
|
|
||||||
from app.classes.models.servers import Servers
|
from app.classes.models.servers import Servers
|
||||||
from app.classes.models.server_permissions import EnumPermissionsServer
|
from app.classes.models.server_permissions import EnumPermissionsServer
|
||||||
|
@ -591,7 +591,9 @@
|
|||||||
message: '<p class="text-center mb-0"><i class="fa fa-spin fa-cog"></i> Please wait while we gather your files...</p>',
|
message: '<p class="text-center mb-0"><i class="fa fa-spin fa-cog"></i> Please wait while we gather your files...</p>',
|
||||||
closeButton: false
|
closeButton: false
|
||||||
});
|
});
|
||||||
getDirView();
|
setTimeout(function(){
|
||||||
|
getDirView();
|
||||||
|
}, 2000);
|
||||||
} else {
|
} else {
|
||||||
bootbox.alert("You must input a path before selecting this button");
|
bootbox.alert("You must input a path before selecting this button");
|
||||||
}
|
}
|
||||||
@ -638,7 +640,9 @@
|
|||||||
message: '<p class="text-center mb-0"><i class="fa fa-spin fa-cog"></i> Please wait while we gather your files...</p>',
|
message: '<p class="text-center mb-0"><i class="fa fa-spin fa-cog"></i> Please wait while we gather your files...</p>',
|
||||||
closeButton: false
|
closeButton: false
|
||||||
});
|
});
|
||||||
getDirView();
|
setTimeout(function(){
|
||||||
|
getDirView();
|
||||||
|
}, 2000);
|
||||||
} else {
|
} else {
|
||||||
bootbox.alert("You must input a path before selecting this button");
|
bootbox.alert("You must input a path before selecting this button");
|
||||||
}
|
}
|
||||||
|
@ -826,8 +826,9 @@
|
|||||||
message: '<p class="text-center mb-0"><i class="fa fa-spin fa-cog"></i> Please wait while we gather your files...</p>',
|
message: '<p class="text-center mb-0"><i class="fa fa-spin fa-cog"></i> Please wait while we gather your files...</p>',
|
||||||
closeButton: false
|
closeButton: false
|
||||||
});
|
});
|
||||||
console.log("CALLING DIR")
|
setTimeout(function(){
|
||||||
getDirView();
|
getDirView();
|
||||||
|
}, 2000);
|
||||||
} else {
|
} else {
|
||||||
bootbox.alert("You must input a path before selecting this button");
|
bootbox.alert("You must input a path before selecting this button");
|
||||||
}
|
}
|
||||||
@ -843,8 +844,9 @@
|
|||||||
message: '<p class="text-center mb-0"><i class="fa fa-spin fa-cog"></i> Please wait while we gather your files...</p>',
|
message: '<p class="text-center mb-0"><i class="fa fa-spin fa-cog"></i> Please wait while we gather your files...</p>',
|
||||||
closeButton: false
|
closeButton: false
|
||||||
});
|
});
|
||||||
console.log("CALLING DIR")
|
setTimeout(function(){
|
||||||
getDirView();
|
getDirView();
|
||||||
|
}, 2000);
|
||||||
});
|
});
|
||||||
var upload = false;
|
var upload = false;
|
||||||
var file;
|
var file;
|
||||||
|
@ -1,23 +1,22 @@
|
|||||||
|
|
||||||
apscheduler==3.8.1
|
apscheduler==3.10.4
|
||||||
argon2-cffi==21.3
|
argon2-cffi==23.1.0
|
||||||
cached_property==1.5.2
|
cached_property==1.5.2
|
||||||
colorama==0.4
|
colorama==0.4.6
|
||||||
croniter==1.3.5
|
croniter==1.4.1
|
||||||
cryptography==41.0.3
|
cryptography==41.0.4
|
||||||
libgravatar==1.0.0
|
libgravatar==1.0.4
|
||||||
nh3==0.2.14
|
nh3==0.2.14
|
||||||
packaging==23.1
|
packaging==23.2
|
||||||
peewee==3.13
|
peewee==3.16.3
|
||||||
pexpect==4.8
|
|
||||||
psutil==5.9.5
|
psutil==5.9.5
|
||||||
pyOpenSSL==23.2.0
|
pyOpenSSL==23.2.0
|
||||||
pyjwt==2.4.0
|
pyjwt==2.8.0
|
||||||
PyYAML==6.0.1
|
PyYAML==6.0.1
|
||||||
requests==2.31
|
requests==2.31.0
|
||||||
termcolor==1.1
|
termcolor==1.1
|
||||||
tornado==6.3.3
|
tornado==6.3.3
|
||||||
tzlocal==4.0
|
tzlocal==5.1
|
||||||
jsonschema==4.5.1
|
jsonschema==4.19.1
|
||||||
orjson==3.8.12
|
orjson==3.9.7
|
||||||
prometheus-client==0.17.1
|
prometheus-client==0.17.1
|
||||||
|
Loading…
Reference in New Issue
Block a user