diff --git a/api/tacticalrmm/core/tests.py b/api/tacticalrmm/core/tests.py index b24865cd..cd4b77de 100644 --- a/api/tacticalrmm/core/tests.py +++ b/api/tacticalrmm/core/tests.py @@ -6,3 +6,24 @@ class TestCoreTasks(BaseTestCase): def test_core_maintenance_tasks(self): task = core_maintenance_tasks.s().apply() self.assertEqual(task.state, "SUCCESS") + + def test_dashboard_info(self): + url = "/core/dashinfo/" + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + + self.check_not_authenticated("get", url) + + def test_vue_version(self): + url = "/core/version/" + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + + self.check_not_authenticated("get", url) + + def test_get_core_settings(self): + url = "/core/getcoresettings/" + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + + self.check_not_authenticated("get", url) diff --git a/api/tacticalrmm/core/urls.py b/api/tacticalrmm/core/urls.py index 210afaca..504e12bc 100644 --- a/api/tacticalrmm/core/urls.py +++ b/api/tacticalrmm/core/urls.py @@ -7,4 +7,5 @@ urlpatterns = [ path("editsettings/", views.edit_settings), path("version/", views.version), path("emailtest/", views.email_test), + path("dashinfo/", views.dashboard_info), ] diff --git a/api/tacticalrmm/core/views.py b/api/tacticalrmm/core/views.py index 65eae75f..ecd43a96 100644 --- a/api/tacticalrmm/core/views.py +++ b/api/tacticalrmm/core/views.py @@ -66,6 +66,11 @@ def version(request): return Response(settings.APP_VER) +@api_view() +def dashboard_info(request): + return Response({"trmm_version": settings.TRMM_VERSION}) + + @api_view() def email_test(request): core = CoreSettings.objects.first() diff --git a/api/tacticalrmm/tacticalrmm/settings.py b/api/tacticalrmm/tacticalrmm/settings.py index 4bc5c5a9..fc4a02fe 100644 --- a/api/tacticalrmm/tacticalrmm/settings.py +++ b/api/tacticalrmm/tacticalrmm/settings.py @@ -9,15 +9,25 @@ EXE_DIR = os.path.join(BASE_DIR, "tacticalrmm/private/exe") AUTH_USER_MODEL = "accounts.User" +# latest release +TRMM_VERSION = "0.1.0" + # bump this version everytime vue code is changed # to alert user they need to manually refresh their browser -APP_VER = "0.0.83" +APP_VER = "0.0.84" # https://github.com/wh1te909/salt LATEST_SALT_VER = "1.1.0" +# https://github.com/wh1te909/rmmagent LATEST_AGENT_VER = "1.0.1" +MESH_VER = "0.6.62" + +# for the update script, bump when need to recreate venv or npm install +PIP_VER = "1" +NPM_VER = "1" + DL_64 = f"https://github.com/wh1te909/rmmagent/releases/download/v{LATEST_AGENT_VER}/winagent-v{LATEST_AGENT_VER}.exe" DL_32 = f"https://github.com/wh1te909/rmmagent/releases/download/v{LATEST_AGENT_VER}/winagent-v{LATEST_AGENT_VER}-x86.exe" diff --git a/install.sh b/install.sh index 44ece961..5d14aac4 100755 --- a/install.sh +++ b/install.sh @@ -1,6 +1,6 @@ #!/bin/bash -SCRIPT_VERSION="16" +SCRIPT_VERSION="17" SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/develop/install.sh' GREEN='\033[0;32m' @@ -282,6 +282,8 @@ sudo chown ${USER}:${USER} /rmm sudo mkdir -p /var/log/celery sudo chown ${USER}:${USER} /var/log/celery git clone https://github.com/wh1te909/tacticalrmm.git /rmm/ +cd /rmm +git checkout master localvars="$(cat << EOF SECRET_KEY = "${DJANGO_SEKRET}" diff --git a/restore.sh b/restore.sh index a76f7ad1..0e1606b8 100755 --- a/restore.sh +++ b/restore.sh @@ -7,7 +7,7 @@ pgpw="hunter2" ##################################################### -SCRIPT_VERSION="4" +SCRIPT_VERSION="5" SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/develop/restore.sh' GREEN='\033[0;32m' @@ -212,6 +212,8 @@ sudo chown ${USER}:${USER} /rmm sudo mkdir -p /var/log/celery sudo chown ${USER}:${USER} /var/log/celery git clone https://github.com/wh1te909/tacticalrmm.git /rmm/ +cd /rmm +git checkout master cp $tmp_dir/rmm/local_settings.py /rmm/api/tacticalrmm/tacticalrmm/ cp $tmp_dir/rmm/env /rmm/web/.env diff --git a/update.sh b/update.sh index 064a12cc..30fd34e1 100644 --- a/update.sh +++ b/update.sh @@ -1,7 +1,8 @@ #!/bin/bash -SCRIPT_VERSION="93" +SCRIPT_VERSION="94" SCRIPT_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/develop/update.sh' +LATEST_SETTINGS_URL='https://raw.githubusercontent.com/wh1te909/tacticalrmm/master/api/tacticalrmm/tacticalrmm/settings.py' YELLOW='\033[1;33m' GREEN='\033[0;32m' RED='\033[0;31m' @@ -33,6 +34,38 @@ if [ "$ORIGUSER" != "$USER" ]; then exit 1 fi +TMP_SETTINGS=$(mktemp -p "" "rmmsettings_XXXXXXXXXX") +curl -s -L "${LATEST_SETTINGS_URL}" > ${TMP_SETTINGS} +SETTINGS_FILE="/rmm/api/tacticalrmm/tacticalrmm/settings.py" + +LATEST_TRMM_VER=$(grep "^TRMM_VERSION" "$TMP_SETTINGS" | awk -F'[= "]' '{print $5}') +CURRENT_TRMM_VER=$(grep "^TRMM_VERSION" "$SETTINGS_FILE" | awk -F'[= "]' '{print $5}') + +if [[ "${CURRENT_TRMM_VER}" == "${LATEST_TRMM_VER}" ]]; then + printf >&2 "${GREEN}Already on latest version. Current version: ${CURRENT_TRMM_VER} Latest version: ${LATEST_TRMM_VER}${NC}\n" + rm -f $TMP_SETTINGS + exit 0 +fi + +LATEST_MESH_VER=$(grep "^MESH_VER" "$TMP_SETTINGS" | awk -F'[= "]' '{print $5}') +LATEST_PIP_VER=$(grep "^PIP_VER" "$TMP_SETTINGS" | awk -F'[= "]' '{print $5}') +LATEST_NPM_VER=$(grep "^NPM_VER" "$TMP_SETTINGS" | awk -F'[= "]' '{print $5}') + +CURRENT_PIP_VER=$(grep "^PIP_VER" "$SETTINGS_FILE" | awk -F'[= "]' '{print $5}') +CURRENT_NPM_VER=$(grep "^NPM_VER" "$SETTINGS_FILE" | awk -F'[= "]' '{print $5}') + +for i in nginx rmm celery celerybeat celery-winupdate +do +sudo systemctl stop ${i} +done + +cd /rmm +git fetch +git checkout master +git reset --hard FETCH_HEAD +git clean -df +git pull + # added new celery queue 9-7-2020 if [ ! -f /etc/systemd/system/celery-winupdate.service ]; then celerywinupdatesvc="$(cat << EOF @@ -79,13 +112,6 @@ sudo systemctl daemon-reload sudo systemctl enable celery-winupdate fi - -for i in celery celerybeat celery-winupdate rmm nginx -do -sudo systemctl stop ${i} -done - - sudo chown ${USER}:${USER} -R /rmm sudo chown ${USER}:${USER} /var/log/celery sudo chown ${USER}:${USER} -R /srv/salt/ @@ -96,24 +122,27 @@ sudo chown -R $USER:$GROUP /home/${USER}/.config sudo chown -R $USER:$GROUP /home/${USER}/.cache sudo chmod 750 /srv/salt/scripts/userdefined -cd /rmm -git fetch origin develop -git reset --hard FETCH_HEAD -git clean -df cp /rmm/_modules/* /srv/salt/_modules/ cp /rmm/scripts/* /srv/salt/scripts/ /usr/local/rmmgo/go/bin/go get github.com/josephspurrier/goversioninfo/cmd/goversioninfo sudo cp /rmm/api/tacticalrmm/core/goinstaller/bin/goversioninfo /usr/local/bin/ sudo chown ${USER}:${USER} /usr/local/bin/goversioninfo sudo chmod +x /usr/local/bin/goversioninfo -rm -rf /rmm/api/env -cd /rmm/api -python3 -m venv env -source /rmm/api/env/bin/activate -cd /rmm/api/tacticalrmm -pip install --no-cache-dir --upgrade pip -pip install --no-cache-dir setuptools==49.6.0 wheel==0.35.1 -pip install --no-cache-dir -r requirements.txt + +if [[ "${CURRENT_PIP_VER}" != "${LATEST_PIP_VER}" ]]; then + rm -rf /rmm/api/env + cd /rmm/api + python3 -m venv env + source /rmm/api/env/bin/activate + cd /rmm/api/tacticalrmm + pip install --no-cache-dir --upgrade pip + pip install --no-cache-dir setuptools==49.6.0 wheel==0.35.1 + pip install --no-cache-dir -r requirements.txt +else + source /rmm/api/env/bin/activate + cd /rmm/api/tacticalrmm +fi + python manage.py pre_update_tasks python manage.py migrate python manage.py delete_tokens @@ -122,14 +151,16 @@ python manage.py collectstatic --no-input python manage.py post_update_tasks deactivate - -rm -rf /rmm/web/node_modules rm -rf /rmm/web/dist cd /rmm/web -npm install +if [[ "${CURRENT_NPM_VER}" != "${LATEST_NPM_VER}" ]]; then + rm -rf /rmm/web/node_modules + npm install +fi + npm run build sudo rm -rf /var/www/rmm/dist -sudo cp -pvr /rmm/web/dist /var/www/rmm/ +sudo cp -pr /rmm/web/dist /var/www/rmm/ sudo chown www-data:www-data -R /var/www/rmm/dist for i in celery celerybeat celery-winupdate rmm nginx @@ -137,12 +168,17 @@ do sudo systemctl start ${i} done -sudo systemctl stop meshcentral -sudo chown ${USER}:${USER} -R /meshcentral -cd /meshcentral -rm -rf node_modules/ -npm install meshcentral@0.6.62 -sudo systemctl start meshcentral -sleep 10 +CURRENT_MESH_VER=$(cd /meshcentral && npm list meshcentral | grep 'meshcentral@' | awk -F'[@]' '{print $2}' | tr -d " \t") +if [[ "${CURRENT_MESH_VER}" != "${LATEST_MESH_VER}" ]]; then + printf >&2 "${GREEN}Updating meshcentral from ${CURRENT_MESH_VER} to ${LATEST_MESH_VER}${NC}\n" + sudo systemctl stop meshcentral + sudo chown ${USER}:${USER} -R /meshcentral + cd /meshcentral + rm -rf node_modules/ + npm install meshcentral@${LATEST_MESH_VER} + sudo systemctl start meshcentral + sleep 10 +fi +rm -f $TMP_SETTINGS printf >&2 "${GREEN}Update finished!${NC}\n" \ No newline at end of file diff --git a/web/src/store/index.js b/web/src/store/index.js index 8fc1544c..b6d3c10e 100644 --- a/web/src/store/index.js +++ b/web/src/store/index.js @@ -153,6 +153,9 @@ export default function () { getAgentCounts(context, data = {}) { return axios.post("/agents/agent_counts/", data) }, + getDashInfo(context) { + return axios.get("/core/dashinfo/"); + }, loadAutomatedTasks(context, pk) { axios.get(`/tasks/${pk}/automatedtasks/`).then(r => { context.commit("SET_AUTOMATED_TASKS", r.data); diff --git a/web/src/views/Dashboard.vue b/web/src/views/Dashboard.vue index 5a097e54..cb3a1124 100644 --- a/web/src/views/Dashboard.vue +++ b/web/src/views/Dashboard.vue @@ -7,7 +7,9 @@ - Tactical RMM + Tactical RMM   v{{ currentTRMMVersion }} @@ -265,6 +267,7 @@ export default { frame: [], poll: null, search: null, + currentTRMMVersion: null, columns: [ { name: "smsalert", @@ -369,6 +372,7 @@ export default { methods: { refreshEntireSite() { this.$store.dispatch("loadTree"); + this.getDashInfo(); this.getAgentCounts(); if (this.allClientsActive) { @@ -468,6 +472,7 @@ export default { this.poll = setInterval(() => { this.$store.dispatch("checkVer"); this.getAgentCounts(); + this.getDashInfo(); }, 60 * 5 * 1000); }, setSplitter(val) { @@ -481,6 +486,9 @@ export default { this.workstationOfflineCount = r.data.total_workstation_offline_count; }); }, + getDashInfo() { + this.$store.dispatch("getDashInfo").then(r => (this.currentTRMMVersion = r.data.trmm_version)); + }, showToggleMaintenance(node) { let data = { id: node.id, @@ -537,6 +545,7 @@ export default { this.getTree(); this.$store.dispatch("getUpdatedSites"); this.$store.dispatch("checkVer"); + this.getDashInfo(); this.getAgentCounts(); }, mounted() {