Merge branch 'feature/crafty-version-check' into 'dev'

Add version checking helper and notices

See merge request crafty-controller/crafty-4!411
This commit is contained in:
Iain Powrie 2022-08-05 02:24:20 +00:00
commit a454632ef1
7 changed files with 83 additions and 10 deletions

View File

@ -2,7 +2,7 @@
## --- [4.0.8] - 2022/TBD
### New features
TBD
- Add Crafty Version Check and notification ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/411))
### Bug fixes
- Fix SU status not sticking on user creation ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/410))
- Handle Missing Java From Win Registry ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/413))

View File

@ -20,6 +20,7 @@ import itertools
from datetime import datetime
from socket import gethostname
from contextlib import redirect_stderr, suppress
from packaging import version as pkg_version
from app.classes.shared.null_writer import NullWriter
from app.classes.shared.console import Console
@ -75,6 +76,7 @@ class Helpers:
self.websocket_helper = WebSocketHelper(self)
self.translation = Translation(self)
self.update_available = False
@staticmethod
def auto_installer_fix(ex):
@ -82,6 +84,29 @@ class Helpers:
print(f"Import Error: Unable to load {ex.name} module")
installer.do_install()
def check_remote_version(self):
"""
Check if the remote version is newer than the local version
Returning remote version if it is newer, otherwise False.
"""
try:
# Get tags from Gitlab, select the latest and parse the semver
response = get(
"https://gitlab.com/api/v4/projects/20430749/repository/tags"
)
if response.status_code == 200:
remote_version = pkg_version.parse(json.loads(response.text)[0]["name"])
# Get local version data from the file and parse the semver
local_version = pkg_version.parse(self.get_version_string())
if remote_version > local_version:
return remote_version
except Exception as e:
logger.error(f"Unable to check for new crafty version! \n{e}")
return False
@staticmethod
def find_java_installs():
# If we're windows return oracle java versions,

View File

@ -3,7 +3,7 @@ import time
import logging
import threading
import asyncio
import datetime
from datetime import datetime
from tzlocal import get_localzone
from tzlocal.utils import ZoneInfoNotFoundError
@ -193,6 +193,14 @@ class TasksManager:
schedules = HelpersManagement.get_schedules_enabled()
self.scheduler.add_listener(self.schedule_watcher, mask=EVENT_JOB_EXECUTED)
self.scheduler.start()
self.check_for_updates()
self.scheduler.add_job(
self.check_for_updates,
"interval",
hours=12,
id="update_watcher",
start_date=datetime.now(),
)
# self.scheduler.add_job(
# self.scheduler.print_jobs, "interval", seconds=10, id="-1"
# )
@ -646,6 +654,16 @@ class TasksManager:
)
time.sleep(1)
def check_for_updates(self):
logger.info("Checking for Crafty updates...")
self.helper.update_available = self.helper.check_remote_version()
if self.helper.update_available:
logger.info(f"Found new version {self.helper.update_available}")
else:
logger.info(
"No updates found! You are on the most up to date Crafty version."
)
def log_watcher(self):
self.controller.servers.check_for_old_logs()
self.scheduler.add_job(

View File

@ -284,7 +284,7 @@ class PanelHandler(BaseHandler):
page_data: t.Dict[str, t.Any] = {
# todo: make this actually pull and compare version data
"update_available": False,
"update_available": self.helper.update_available,
"serverTZ": tz,
"version_data": self.helper.get_version_string(),
"user_data": exec_user,

View File

@ -92,6 +92,7 @@ class ServerHandler(BaseHandler):
template = "public/404.html"
page_data = {
"update_available": self.helper.update_available,
"version_data": self.helper.get_version_string(),
"user_data": exec_user,
"user_role": exec_user_role,

View File

@ -1,12 +1,27 @@
<!-- partial:partials/_footer.html -->
<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', data['lang']) }} © 2021 - <span x-data x-text="new Date().getFullYear()"></span> <a href="https://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>
<span class="float-none float-sm-right d-block mt-1 mt-sm-0">&nbsp;&nbsp;{{ translate('footer', 'version', data['lang']) }}: {{ data['version_data'] }}</span>
{% if data['update_available'] %}
<span class="float-none float-sm-right d-block mt-1 mt-sm-0"><a target="_blank" class="blink-text" href="https://gitlab.com/crafty-controller/crafty-4/-/releases">Update Available!</a></span>
{% end %}
</div>
<style>
a:hover {
text-decoration: none;
}
.blink-text{
color: #000;
font-weight: bold;
font-size: 2rem;
animation: blinkingText 2s infinite;
}
@keyframes blinkingText{
0% { color: grey;}
50% { color: red;}
100% { color: grey;}
}
</style>
</footer>
<!-- partial -->

16
main.py
View File

@ -7,8 +7,9 @@ import argparse
import logging.config
import signal
import peewee
from app.classes.shared.file_helpers import FileHelpers
from packaging import version as pkg_version
from app.classes.shared.file_helpers import FileHelpers
from app.classes.shared.import3 import Import3
from app.classes.shared.console import Console
from app.classes.shared.helpers import Helpers
@ -225,6 +226,19 @@ if __name__ == "__main__":
controller_setup_thread.join()
Console.info("Crafty has fully started and is now ready for use!")
# Check if new version available
remote_ver = helper.check_remote_version()
if remote_ver:
notice = f"""
A new version of Crafty is available!
{'/' * 37}
New version available: {remote_ver}
Current version: {pkg_version.parse(helper.get_version_string())}
{'/' * 37}
"""
Console.yellow(notice)
crafty_prompt.prompt = f"Crafty Controller v{helper.get_version_string()} > "
try:
logger.info("Removing old temp dirs")