Adding GUI update feature (server-side)

This commit is contained in:
Félix Aime 2021-02-17 20:16:39 +01:00
parent 85228e77f7
commit 5334f30edf
5 changed files with 91 additions and 6 deletions

View File

@ -104,6 +104,10 @@ create_directory() {
cp -Rf ./* /usr/share/tinycheck cp -Rf ./* /usr/share/tinycheck
} }
get_version() {
git tag | tail -n 1 > /usr/share/tinycheck/VERSION
}
generate_certificate() { generate_certificate() {
# Generating SSL certificate for the backend. # Generating SSL certificate for the backend.
echo -e "[+] Generating SSL certificate for the backend" echo -e "[+] Generating SSL certificate for the backend"
@ -444,6 +448,7 @@ else
check_operating_system check_operating_system
check_interfaces check_interfaces
create_directory create_directory
get_version
set_userlang set_userlang
set_credentials set_credentials
set_kioskmode set_kioskmode

View File

@ -0,0 +1,19 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from flask import jsonify, Blueprint
from app.classes.update import Update
update_bp = Blueprint("update", __name__)
@update_bp.route("/check", methods=["GET"])
def check():
""" Check the presence of new version """
return jsonify(Update().check_version())
@update_bp.route("/process", methods=["GET"])
def process():
""" Check the presence of new version """
return jsonify(Update().update_instance())

View File

@ -0,0 +1,56 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from app.utils import read_config
import subprocess as sp
import requests
import json
import os
import re
class Update(object):
def __init__(self):
self.project_url = "https://api.github.com/repos/KasperskyLab/TinyCheck/tags"
self.app_path = "/usr/share/tinycheck"
return None
def check_version(self):
"""
Check if a new version of TinyCheck is available
by quering the Github api and comparing the last
tag with the VERSION file content.
"""
if read_config(("frontend", "update")):
res = requests.get(self.project_url)
res = json.loads(res.content.decode("utf8"))
with open(os.path.join(self.app_path, "VERSION")) as f:
if f.read() != res[0]["name"]:
return {"status": True,
"message": "A new version is available"}
else:
return {"status": True,
"message": "This is the latest version"}
else:
return {"status": False,
"message": "You don't have rights to do this operation."}
def update_instance(self):
"""
Update the instance by executing
the update script.
"""
if read_config(("frontend", "update")):
try:
os.chdir(self.app_path)
sp.Popen(["bash", os.path.join(self.app_path, "update.sh")])
return {"status": True,
"message": "Update successfully launched"}
except:
return {"status": False,
"message": "Issue during the update"}
else:
return {"status": False,
"message": "You don't have rights to do this operation."}

View File

@ -8,6 +8,7 @@ from app.blueprints.device import device_bp
from app.blueprints.analysis import analysis_bp from app.blueprints.analysis import analysis_bp
from app.blueprints.save import save_bp from app.blueprints.save import save_bp
from app.blueprints.misc import misc_bp from app.blueprints.misc import misc_bp
from app.blueprints.update import update_bp
from app.utils import read_config from app.utils import read_config
app = Flask(__name__, template_folder="../../app/frontend/dist") app = Flask(__name__, template_folder="../../app/frontend/dist")
@ -42,6 +43,7 @@ app.register_blueprint(device_bp, url_prefix='/api/device')
app.register_blueprint(analysis_bp, url_prefix='/api/analysis') app.register_blueprint(analysis_bp, url_prefix='/api/analysis')
app.register_blueprint(save_bp, url_prefix='/api/save') app.register_blueprint(save_bp, url_prefix='/api/save')
app.register_blueprint(misc_bp, url_prefix='/api/misc') app.register_blueprint(misc_bp, url_prefix='/api/misc')
app.register_blueprint(update_bp, url_prefix='/api/update')
if __name__ == '__main__': if __name__ == '__main__':
if read_config(("frontend", "remote_access")): if read_config(("frontend", "remote_access")):

View File

@ -40,12 +40,7 @@ elif [ $PWD = "/tmp/tinycheck" ]; then
cd /usr/share/tinycheck/app/frontend/ && npm install && npm run build cd /usr/share/tinycheck/app/frontend/ && npm install && npm run build
cd /usr/share/tinycheck/app/backend/ && npm install && npm run build cd /usr/share/tinycheck/app/backend/ && npm install && npm run build
echo "[+] Restarting services" echo "[+] Updating current configuration with new values."
service tinycheck-backend restart
service tinycheck-frontend restart
service tinycheck-watchers restart
# Updating configuration with new values.
if ! grep -q reboot_option /usr/share/tinycheck/config.yaml; then if ! grep -q reboot_option /usr/share/tinycheck/config.yaml; then
sed -i 's/frontend:/frontend:\n reboot_option: true/g' /usr/share/tinycheck/config.yaml sed -i 's/frontend:/frontend:\n reboot_option: true/g' /usr/share/tinycheck/config.yaml
fi fi
@ -70,5 +65,13 @@ elif [ $PWD = "/tmp/tinycheck" ]; then
sed -i "s/free_issuers:/free_issuers:\n - CN=R3,O=Let's Encrypt,C=US/g" /usr/share/tinycheck/config.yaml sed -i "s/free_issuers:/free_issuers:\n - CN=R3,O=Let's Encrypt,C=US/g" /usr/share/tinycheck/config.yaml
fi fi
echo "[+] Restarting services"
service tinycheck-backend restart
service tinycheck-frontend restart
service tinycheck-watchers restart
echo "[+] Updating the TinyCheck version"
cd /tmp/tinycheck && git tag | tail -n 1 > /usr/share/tinycheck/VERSION
echo "[+] TinyCheck updated!" echo "[+] TinyCheck updated!"
fi fi