From 6c8d6ed2ca1faf8a0dd05dd3e0df07b3748d172a Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Tue, 14 Apr 2020 18:06:42 -0700 Subject: [PATCH] Add workflow for automated Windows/MacOS builds --- .dockerignore | 1 + .github/workflows/publish-release.yml | 182 ++++++++++++- .gitignore | 6 + .../default/images/logo-circle.icns | Bin 0 -> 28453 bytes .../interfaces/default/images/logo-circle.ico | Bin 0 -> 120528 bytes package/Tautulli-macos.spec | 49 ++++ package/Tautulli-windows.spec | 38 +++ package/Tautulli.nsi | 244 ++++++++++++++++++ package/macos-scripts/preinstall | 25 ++ package/nsis-plugins/nsProcess.dll | Bin 0 -> 4608 bytes 10 files changed, 535 insertions(+), 10 deletions(-) create mode 100644 data/interfaces/default/images/logo-circle.icns create mode 100644 data/interfaces/default/images/logo-circle.ico create mode 100644 package/Tautulli-macos.spec create mode 100644 package/Tautulli-windows.spec create mode 100644 package/Tautulli.nsi create mode 100755 package/macos-scripts/preinstall create mode 100644 package/nsis-plugins/nsProcess.dll diff --git a/.dockerignore b/.dockerignore index 742c4925..d525a859 100644 --- a/.dockerignore +++ b/.dockerignore @@ -3,6 +3,7 @@ .gitignore contrib init-scripts +package pylintrc *.md !CHANGELOG*.md diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index 8834af3f..5b04c4bd 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -2,27 +2,189 @@ name: Publish Release on: push: tags: [v*] + jobs: - build: - runs-on: ubuntu-latest + build-windows: + if: ${{ !endsWith(github.ref, '-beta') }} + runs-on: windows-latest steps: - name: Checkout Code - uses: actions/checkout@master - - name: Get Release Version - run: echo ::set-env name=RELEASE_VERSION::${GITHUB_REF#refs/tags/} + uses: actions/checkout@v2.1.0 + + - name: Set Release Version + id: get_version + shell: bash + run: | + echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/v} + echo ::set-output name=RELEASE_VERSION::${GITHUB_REF#refs/tags/} + echo $GITHUB_SHA > version.txt + + - name: Set Up Python + uses: actions/setup-python@v1.2.0 + with: + python-version: 3.8 + + - name: Cache Dependencies + id: cache_dependencies + uses: actions/cache@v1 + with: + path: ~\AppData\Local\pip\Cache + key: ${{ runner.os }}-pip-${{ steps.get_version.outputs.VERSION }} + restore-keys: ${{ runner.os }}-pip- + + - name: Install Dependencies + run: | + python -m pip install --upgrade pip + pip install pyopenssl pycryptodomex pywin32 pyinstaller + + - name: Build Package + run: | + pyinstaller -y ./package/Tautulli-windows.spec + + - name: Create Installer + uses: joncloud/makensis-action@v1 + with: + script-file: ./package/Tautulli.nsi + arguments: /DVERSION=${{ steps.get_version.outputs.VERSION }}.0 /DINSTALLER_NAME=..\Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}.exe + includeMorePlugins: package/nsis-plugins + + - name: Upload Installer + uses: actions/upload-artifact@v1 + with: + name: Tautulli-windows-installer + path: Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}.exe + + - name: Post Status to Discord + uses: sarisia/actions-status-discord@v1 + if: always() + with: + webhook: ${{ secrets.DISCORD_WEBHOOK }} + status: ${{ job.status }} + job: Build Windows Installer + nofail: true + + build-macos: + if: ${{ !endsWith(github.ref, '-beta') }} + runs-on: macos-latest + steps: + - name: Checkout Code + uses: actions/checkout@v2.1.0 + + - name: Set Release Version + id: get_version + shell: bash + run: | + echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/v} + echo ::set-output name=RELEASE_VERSION::${GITHUB_REF#refs/tags/} + echo $GITHUB_SHA > version.txt + echo ::set-env name=VERSION::${GITHUB_REF#refs/tags/v} + + - name: Set Up Python + uses: actions/setup-python@v1.2.0 + with: + python-version: 3.8 + + - name: Cache Dependencies + id: cache_dependencies + uses: actions/cache@v1 + with: + path: ~/Library/Caches/pip + key: ${{ runner.os }}-pip-${{ steps.get_version.outputs.VERSION }} + restore-keys: ${{ runner.os }}-pip- + + - name: Install Dependencies + run: | + python -m pip install --upgrade pip + pip install pyopenssl pycryptodomex pyinstaller + + - name: Build Package + run: | + pyinstaller -y ./package/Tautulli-macos.spec + + - name: Create Installer + run: | + sudo pkgbuild --install-location /Applications --version ${{ steps.get_version.outputs.VERSION }} --component ./dist/Tautulli.app --scripts ./package/macos-scripts Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}.pkg + + - name: Upload Installer + uses: actions/upload-artifact@v1 + with: + name: Tautulli-macos-package + path: Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}.pkg + + - name: Post Status to Discord + uses: sarisia/actions-status-discord@v1 + if: always() + with: + webhook: ${{ secrets.DISCORD_WEBHOOK }} + status: ${{ job.status }} + job: Build MacOS Package + nofail: true + + release: + needs: [build-windows, build-macos] + if: always() + runs-on: ubuntu-latest + steps: + - name: Get Build Job Status + uses: technote-space/workflow-conclusion-action@v1 + + - name: Checkout Code + uses: actions/checkout@v2.1.0 + + - name: Set Release Version + id: get_version + run: | + echo ::set-output name=RELEASE_VERSION::${GITHUB_REF#refs/tags/} + + - name: Download Windows Installer + if: env.WORKFLOW_CONCLUSION == 'success' + uses: actions/download-artifact@v1 + with: + name: Tautulli-windows-installer + + - name: Download MacOS Package + if: env.WORKFLOW_CONCLUSION == 'success' + uses: actions/download-artifact@v1 + with: + name: Tautulli-macos-package + - name: Get Changelog - run: echo ::set-env name=CHANGELOG::"$( sed -n '/^## /{p; :loop n; p; /^## /q; b loop}' CHANGELOG.md | sed '$d' | sed '$d' | sed '$d' | sed ':a;N;$!ba;s/\n/%0A/g' )" + id: get_changelog + run: echo ::set-output name=CHANGELOG::"$( sed -n '/^## /{p; :loop n; p; /^## /q; b loop}' CHANGELOG.md | sed '$d' | sed '$d' | sed '$d' | sed ':a;N;$!ba;s/\n/%0A/g' )" + - name: Create Release id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - tag_name: ${{ env.RELEASE_VERSION }} - release_name: Tautulli ${{ env.RELEASE_VERSION }} + tag_name: ${{ steps.get_version.outputs.RELEASE_VERSION }} + release_name: Tautulli ${{ steps.get_version.outputs.RELEASE_VERSION }} body: | ## Changelog - ##${{ env.CHANGELOG }} + ##${{ steps.get_changelog.outputs.CHANGELOG }} draft: false - prerelease: ${{ endsWith(env.RELEASE_VERSION, '-beta') }} + prerelease: ${{ endsWith(steps.get_version.outputs.RELEASE_VERSION, '-beta') }} + + - name: Upload Windows Installer + if: env.WORKFLOW_CONCLUSION == 'success' + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: Tautulli-windows-installer/Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}.exe + asset_name: Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}.exe + asset_content_type: application/vnd.microsoft.portable-executable + + - name: Upload MacOS Package + if: env.WORKFLOW_CONCLUSION == 'success' + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: Tautulli-macos-package/Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}.pkg + asset_name: Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}.pkg + asset_content_type: application/vnd.apple.installer+xml diff --git a/.gitignore b/.gitignore index ded1ace0..6bb5c9b5 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,8 @@ backups/* cache/* newsletters/* *.mmdb +version.txt +branch.txt # HTTPS Cert/Key # ################## @@ -74,3 +76,7 @@ _ReSharper*/ /logs .project .pydevproject + +#Ignore files generated by pyinstaller +/build +/dist diff --git a/data/interfaces/default/images/logo-circle.icns b/data/interfaces/default/images/logo-circle.icns new file mode 100644 index 0000000000000000000000000000000000000000..3ced71f418fa63fa6c07233ed0b0bcec3cdd58d3 GIT binary patch literal 28453 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 Rz*71BbKwF0?a1%n|3BlA^M3#U literal 0 HcmV?d00001 diff --git a/data/interfaces/default/images/logo-circle.ico b/data/interfaces/default/images/logo-circle.ico new file mode 100644 index 0000000000000000000000000000000000000000..45c5d3ff7ffda52691530c3f2e2bc58ab552f947 GIT binary patch literal 120528 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 literal 0 HcmV?d00001 diff --git a/package/Tautulli-macos.spec b/package/Tautulli-macos.spec new file mode 100644 index 00000000..c1936f4e --- /dev/null +++ b/package/Tautulli-macos.spec @@ -0,0 +1,49 @@ +# -*- mode: python ; coding: utf-8 -*- + +import sys +sys.modules['FixTk'] = None + +import os +VERSION = os.getenv('VERSION', '0.0.0') + +block_cipher = None + +analysis = Analysis( + ['../Tautulli.py'], + pathex=['lib'], + datas=[ + ('../data', 'data'), + ('../CHANGELOG.md', '.'), + ('../LICENSE', '.'), + ('../version.txt', '.') + ], + excludes=['FixTk', 'tcl', 'tk', '_tkinter', 'tkinter', 'Tkinter'], + cipher=block_cipher +) +pyz = PYZ( + analysis.pure, + analysis.zipped_data, + cipher=block_cipher +) +exe = EXE( + pyz, + analysis.scripts, + exclude_binaries=True, + name='Tautulli', + console=False, + icon='../data/interfaces/default/images/logo-circle.icns' +) +coll = COLLECT( + exe, + analysis.binaries, + analysis.zipfiles, + analysis.datas, + name='Tautulli' +) +app = BUNDLE( + coll, + name='Tautulli.app', + icon='../data/interfaces/default/images/logo-circle.icns', + bundle_identifier='com.Tautulli.Tautulli', + version=VERSION +) diff --git a/package/Tautulli-windows.spec b/package/Tautulli-windows.spec new file mode 100644 index 00000000..84e78cda --- /dev/null +++ b/package/Tautulli-windows.spec @@ -0,0 +1,38 @@ +# -*- mode: python ; coding: utf-8 -*- + +import sys +sys.modules['FixTk'] = None + +block_cipher = None + +analysis = Analysis( + ['..\\Tautulli.py'], + pathex=['lib'], + datas=[('..\\data', 'data'), + ('..\\CHANGELOG.md', '.'), + ('..\\LICENSE', '.'), + ('..\\version.txt', '.') + ], + excludes=['FixTk', 'tcl', 'tk', '_tkinter', 'tkinter', 'Tkinter'], + cipher=block_cipher, +) +pyz = PYZ( + analysis.pure, + analysis.zipped_data, + cipher=block_cipher +) +exe = EXE( + pyz, + analysis.scripts, + exclude_binaries=True, + name='Tautulli', + console=False, + icon='..\\data\\interfaces\\default\\images\\logo-circle.ico' +) +coll = COLLECT( + exe, + analysis.binaries, + analysis.zipfiles, + analysis.datas, + name='Tautulli' +) diff --git a/package/Tautulli.nsi b/package/Tautulli.nsi new file mode 100644 index 00000000..ff6e59f7 --- /dev/null +++ b/package/Tautulli.nsi @@ -0,0 +1,244 @@ +############################################################################################ +# NSIS Installation Script created by NSIS Quick Setup Script Generator v1.09.18 +# Entirely Edited with NullSoft Scriptable Installation System +# by Vlasis K. Barkas aka Red Wine red_wine@freemail.gr Sep 2006 +############################################################################################ + +!define APP_NAME "Tautulli" +!define COMP_NAME "Tautulli" +!define WEB_SITE "https://tautulli.com" +!define COPYRIGHT "Tautulli © 2020" +!define DESCRIPTION "Monitor your Plex Media Server" +!define APP_ICON "..\dist\Tautulli\data\interfaces\default\images\logo-circle.ico" +!define LICENSE_TXT "..\dist\Tautulli\LICENSE" +!define MAIN_APP_EXE "Tautulli.exe" +!define INSTALL_TYPE "SetShellVarContext current" +!define REG_ROOT "HKCU" +!define REG_APP_PATH "Software\Microsoft\Windows\CurrentVersion\App Paths\${MAIN_APP_EXE}" +!define UNINSTALL_PATH "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" + +!define REG_START_MENU "Start Menu Folder" + +var SM_Folder + +###################################################################### + +VIProductVersion "${VERSION}" +VIAddVersionKey "ProductName" "${APP_NAME}" +VIAddVersionKey "CompanyName" "${COMP_NAME}" +VIAddVersionKey "LegalCopyright" "${COPYRIGHT}" +VIAddVersionKey "FileDescription" "${DESCRIPTION}" +VIAddVersionKey "FileVersion" "${VERSION}" + +###################################################################### + +SetCompressor ZLIB +Name "${APP_NAME}" +Caption "${APP_NAME}" +OutFile "${INSTALLER_NAME}" +BrandingText "${APP_NAME}" +XPStyle on +InstallDirRegKey "${REG_ROOT}" "${REG_APP_PATH}" "" +InstallDir "$PROGRAMFILES\${APP_NAME}" + +###################################################################### + +!define nsProcess::FindProcess `!insertmacro nsProcess::FindProcess` + +!macro nsProcess::FindProcess _FILE _ERR + nsProcess::_FindProcess /NOUNLOAD `${_FILE}` + Pop ${_ERR} +!macroend + + +!define nsProcess::KillProcess `!insertmacro nsProcess::KillProcess` + +!macro nsProcess::KillProcess _FILE _ERR + nsProcess::_KillProcess /NOUNLOAD `${_FILE}` + Pop ${_ERR} +!macroend + +!define nsProcess::CloseProcess `!insertmacro nsProcess::CloseProcess` + +!macro nsProcess::CloseProcess _FILE _ERR + nsProcess::_CloseProcess /NOUNLOAD `${_FILE}` + Pop ${_ERR} +!macroend + + +!define nsProcess::Unload `!insertmacro nsProcess::Unload` + +!macro nsProcess::Unload + nsProcess::_Unload +!macroend + +###################################################################### + +!include Sections.nsh + +Var /GLOBAL nolaunch + +!include "MUI.nsh" + +!define MUI_ABORTWARNING +!define MUI_UNABORTWARNING + +!define MUI_ICON "${APP_ICON}" + +!insertmacro MUI_PAGE_WELCOME + +!ifdef LICENSE_TXT +!insertmacro MUI_PAGE_LICENSE "${LICENSE_TXT}" +!endif + +!ifdef REG_START_MENU +!define MUI_STARTMENUPAGE_DEFAULTFOLDER "${APP_NAME}" +!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${REG_ROOT}" +!define MUI_STARTMENUPAGE_REGISTRY_KEY "${UNINSTALL_PATH}" +!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${REG_START_MENU}" +!insertmacro MUI_PAGE_STARTMENU Application $SM_Folder +!endif + +!insertmacro MUI_PAGE_INSTFILES + +!define MUI_FINISHPAGE_RUN "$INSTDIR\${MAIN_APP_EXE}" +!define MUI_FINISHPAGE_RUN_PARAMETERS $nolaunch +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_CONFIRM + +!insertmacro MUI_UNPAGE_INSTFILES + +!insertmacro MUI_UNPAGE_FINISH + +!insertmacro MUI_LANGUAGE "English" + +###################################################################### + +Section -MainProgram +${INSTALL_TYPE} +SetOverwrite ifnewer +SetOutPath "$INSTDIR" +File /nonfatal /a /r "..\dist\${APP_NAME}\" + +IfSilent 0 +2 +ExecShell "" "$INSTDIR\${MAIN_APP_EXE}" $nolaunch +SectionEnd + +###################################################################### + +Section -Icons_Reg +SetOutPath "$INSTDIR" +WriteUninstaller "$INSTDIR\uninstall.exe" + +!ifdef REG_START_MENU +!insertmacro MUI_STARTMENU_WRITE_BEGIN Application +CreateDirectory "$SMPROGRAMS\$SM_Folder" +CreateShortCut "$SMPROGRAMS\$SM_Folder\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}" +CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}" +CreateShortCut "$SMPROGRAMS\$SM_Folder\Uninstall ${APP_NAME}.lnk" "$INSTDIR\uninstall.exe" + +!ifdef WEB_SITE +WriteIniStr "$INSTDIR\${APP_NAME} website.url" "InternetShortcut" "URL" "${WEB_SITE}" +CreateShortCut "$SMPROGRAMS\$SM_Folder\${APP_NAME} Website.lnk" "$INSTDIR\${APP_NAME} website.url" +!endif +!insertmacro MUI_STARTMENU_WRITE_END +!endif + +!ifndef REG_START_MENU +CreateDirectory "$SMPROGRAMS\${APP_NAME}" +CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}" +CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}" +CreateShortCut "$SMPROGRAMS\${APP_NAME}\Uninstall ${APP_NAME}.lnk" "$INSTDIR\uninstall.exe" + +!ifdef WEB_SITE +WriteIniStr "$INSTDIR\${APP_NAME} website.url" "InternetShortcut" "URL" "${WEB_SITE}" +CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME} Website.lnk" "$INSTDIR\${APP_NAME} website.url" +!endif +!endif + +WriteRegStr ${REG_ROOT} "${REG_APP_PATH}" "" "$INSTDIR\${MAIN_APP_EXE}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayName" "${APP_NAME}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "UninstallString" "$INSTDIR\uninstall.exe" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayIcon" "$INSTDIR\${MAIN_APP_EXE}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayVersion" "${VERSION}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "Publisher" "${COMP_NAME}" + +!ifdef WEB_SITE +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "URLInfoAbout" "${WEB_SITE}" +!endif +SectionEnd + +###################################################################### + +Section Uninstall +${INSTALL_TYPE} +Delete "$INSTDIR\uninstall.exe" +!ifdef WEB_SITE +Delete "$INSTDIR\${APP_NAME} website.url" +!endif + +RmDir /r "$INSTDIR" +RmDir "$INSTDIR" + +!ifdef REG_START_MENU +!insertmacro MUI_STARTMENU_GETFOLDER "Application" $SM_Folder +Delete "$SMPROGRAMS\$SM_Folder\${APP_NAME}.lnk" +Delete "$SMPROGRAMS\$SM_Folder\Uninstall ${APP_NAME}.lnk" +!ifdef WEB_SITE +Delete "$SMPROGRAMS\$SM_Folder\${APP_NAME} Website.lnk" +!endif +Delete "$DESKTOP\${APP_NAME}.lnk" + +RmDir "$SMPROGRAMS\$SM_Folder" +!endif + +!ifndef REG_START_MENU +Delete "$SMPROGRAMS\${APP_NAME}\${APP_NAME}.lnk" +Delete "$SMPROGRAMS\${APP_NAME}\Uninstall ${APP_NAME}.lnk" +!ifdef WEB_SITE +Delete "$SMPROGRAMS\${APP_NAME}\${APP_NAME} Website.lnk" +!endif +Delete "$DESKTOP\${APP_NAME}.lnk" + +RmDir "$SMPROGRAMS\${APP_NAME}" +!endif + +DeleteRegKey ${REG_ROOT} "${REG_APP_PATH}" +DeleteRegKey ${REG_ROOT} "${UNINSTALL_PATH}" +SectionEnd + +###################################################################### + +Function .onInit + IfSilent 0 +2 + StrCpy $nolaunch "--nolaunch" + + IfSilent +5 0 + Loop: + ${nsProcess::FindProcess} ${MAIN_APP_EXE} $R0 + StrCmp $R0 0 0 NoAbort + MessageBox MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION "${APP_NAME} is still running. Please shutdown ${APP_NAME} before continuing.$\r$\n$\r$\nIgnore will attempt to shutdown ${APP_NAME} for you." IDABORT End IDRETRY Loop + ${nsProcess::CloseProcess} ${MAIN_APP_EXE} $R0 + StrCmp $R0 0 0 NoAbort + Goto Loop + End: + Abort + NoAbort: +FunctionEnd + +Function un.onInit + IfSilent +5 0 + Loop: + ${nsProcess::FindProcess} ${MAIN_APP_EXE} $R0 + StrCmp $R0 0 0 NoAbort + MessageBox MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION "${APP_NAME} is still running. Please shutdown ${APP_NAME} before continuing.$\r$\n$\r$\nIgnore will attempt to shutdown ${APP_NAME} for you." IDABORT End IDRETRY Loop + ${nsProcess::CloseProcess} ${MAIN_APP_EXE} $R0 + StrCmp $R0 0 0 NoAbort + Goto Loop + End: + Abort + NoAbort: +FunctionEnd + +###################################################################### diff --git a/package/macos-scripts/preinstall b/package/macos-scripts/preinstall new file mode 100755 index 00000000..75ad6a71 --- /dev/null +++ b/package/macos-scripts/preinstall @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +function check_tautulli_running () { + if pgrep -x "Tautulli" > /dev/null + then + dialogText=`osascript -e 'set dialogText to button returned of (display dialog "Tautulli is still running. Please shutdown Tautulli before continuing." buttons {"Retry", "Shutdown Tautulli", "Abort"})'`; + + if [[ $dialogText == 'Retry' ]] + then + check_tautulli_running; + elif [[ $dialogText == 'Shutdown Tautulli' ]] + then + pkill Tautulli + while pgrep Tautulli > /dev/null; do sleep 1; done + check_tautulli_running; + elif [[ $dialogText == 'Abort' ]] + then + exit 1; + fi + else + exit 0; + fi +} + +check_tautulli_running; diff --git a/package/nsis-plugins/nsProcess.dll b/package/nsis-plugins/nsProcess.dll new file mode 100644 index 0000000000000000000000000000000000000000..4ce012103f940e219f1b48eebd923e2b9c05ad01 GIT binary patch literal 4608 zcmeHKZ){sv6+d>I#_iI^8Z{~?&{r?8O022v=Za==i?igV4RzbsI<-Tae~$gq_p;~r z!uyjZD1lavJGrkO6{>&_(WcP}5bQ$*Ekx6_g_bERq9DQ4RmueYFibU)Wh&IYY$X(x4^mO z5yx79HK=iyvA0pb2+^vglSUF_rJIck+h!f| znij$6TT5oZPz-;~WX%xm7Fso3OQFur6&18dumP#2MJS#o$SNBCjq0%mwjGVLrbPgr zsu3R!|Bn^8$}U8%G{O<IAjKwX}ortqbG11}j0P%XL|7!c+ji>YGN`7FqZJ^QUC~zyh*nm$Q z@$xv|Hn3`JD{%MddW|UO7K~4wnz>hp50B{)=N|#U3Aa6A)?1vX_-G6jE?a@3S!Zz@ z6N^BfHR8o1?HL+8cJ1nsg4}Zc)Sb8SI3`$9;9lYLGyVCQzWmJaBKOL9+c;bTT{qv4 zR<{$_WoLfvjKz(O$Q@0y>k)H)fX=mH_bNmH#5d5#`UCOqM4so;?Tf~k_!5qJ;tkoV zUR3RgTRZ$HCCH8T#Uduh^D$zIWA)@nueF*Z#urc`-Y3xH6u}26^R&oV`;JKTQNh{j@~3l)XJx%UY< zG)DMXjCfnnjhIFuN0k^NgK}=c+#Jbs{cYT&$rQL@zQFbI#GED*UCTTEK}hzO9%~IE zy6Wy0FI3~a-GJcY9L4iCV{hHe52V}w*fjfBETy%B<}RMZE=F#M|rk(lkq7E4g=@W-n5{)HM4;9(dJumVeKS!xpKYPt^?>*x_`Ch-dVizF7SF_z{ul|wjeUpp-~yBeFC7U^dJjqkH7b&P+PYPiJTPsOl?J)s&qXcA#*S3Ql%m@YqoH zb@|#=tEo`Q=SmgTV&| zh?f8y@#S~#(R2{tEmS=?fR_R|#t`6g1>oB@zzZ~Jd_W`FonW+Qr(0YQxBSKy%%c%2 zRsRCbjxTh(cw)5RNufJn`&b*|c{lM!P{x83>*#IchU_ki2S%Ii7tb!Z`LPJ`cF|(* zunTn;aT;yB8Z5}Ku|f0x!7DC$^_;pxYe-CYAqN<+_%;IILFq+?*_V|3^0S1HYv}N> z-KPT6TL8`=J%@A&=~qZMk={YNiv&J^MkF7SA1RFVWu$&28EG2n3=(ZWL;gFYTS(t8 z>v&B~3A)Y(50t)Bs&coa>GC#=v7r&6y$L>7*mqtx~S4m8ra7jKEOrUU~5-2 zO63E_Ayd$%VpF;yWO|fQRm&s|NmcAQ=!Gtb;;*&L0X~-oXr?)o+jnV93|?n7x;v=D zx7~f)|GGAv&?&3Bus5lsWdXLidIc>bDOiqjkpR-JL{c)kRV^kd$7SK*$e55a;C06y z!Qdt(qZ2=-tF~<2!Er&Uh(B@3x}l}Ur<4x3Y>#CDhwv9?R86L%(ukJSrci#VWS1G2 zI^b)rgp?LK#iZ7&?l)yadTPoL@Tr~~hfk^_X3x-Mi! zM2pkB=v0>DW$2pI%;f7shKB}dZu+E;A1jLMH&_K$_d%!3$*%u zyVtK{n6ROlxm@2o2r?tnewQz)_b3zU(}Lz>OsOM9@3vjO(WI;kzTM&NRqPKsSMh5sKC*gv`v+nT zZ?7he?&0l~dhX^s_>Qiwo&$UO`pSd)6N-n9g+@asLf;6T4Sg&0z0eOr7em)WZ-#KuhwWppz&`;@9Jy}* literal 0 HcmV?d00001