├── .github ├── FUNDING.yml └── ISSUE_TEMPLATE │ └── application-request.md ├── LICENSE ├── README.md └── application_healthchecks_generic.sh /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: tronyx # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/application-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Application request 3 | about: Suggest an application to be added 4 | title: "[New Application]" 5 | labels: new application 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Please provide the name of the application and, if applicable, the GitHub and Docker Hub repository URLs for the application** 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Chris Yocum 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HealthChecks Linux 2 | [![CodeFactor](https://www.codefactor.io/repository/github/tronyx/healthchecks-linux/badge)](https://www.codefactor.io/repository/github/christronyxyocum/healthchecks-linux) [![made-with-bash](https://img.shields.io/badge/Made%20with-Bash-1f425f.svg)](https://www.gnu.org/software/bash/) [![GitHub](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/tronyx/healthchecks-linux/blob/develop/LICENSE.md) [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/tronyx/healthchecks-linux.svg)](http://isitmaintained.com/project/tronyx/healthchecks-linux "Average time to resolve an issue") [![Percentage of issues still open](http://isitmaintained.com/badge/open/tronyx/healthchecks-linux.svg)](http://isitmaintained.com/project/tronyx/healthchecks-linux "Percentage of issues still open") 3 | 4 | Script to test various application reverse proxies, as well as their internal pages, and report to their respective [Healthchecks.io](https://healthchecks.io) checks. This is meant to work with [Organizr](https://github.com/causefx/Organizr) Authentication, leveraging the Organizr API key to check the reverse proxies. 5 | 6 | If you are not using Organizr, which you totally should be if you're not, you can remove the following from the external URL for any checks you want to use: 7 | 8 | ```bash 9 | -H "token: ${orgAPIKey}" 10 | ``` 11 | Mind the space that is at the beginning of the line too. 12 | 13 | ## Setting it up 14 | 15 | There are variables at the top that are used throughout the script to do the tests. You'll want to fill in your domain, Organizr API key, and server IP(s). If you are self-hosting Healthchecks, you can change the `hcPingDomain` variable. You'll also need to go to each of the `check_application` functions and edit the UUID for the Healthcheck and the ports and/or subdomains or subdirectories on those. Lastly, uncomment (remove the `#` from the beginning of the line) the checks that you wish to run in the main function at the bottom of the script. 16 | 17 | Once you have all of the checks configured as you need, you can run the script with `bash -x application_healthchecks_generic.sh` to make sure that all the responses are returning what's expected, an HTTP response code of `200`. 18 | 19 | If you do not have reverse proxies (external access) setup for your applications, you can simply set the external response variable to `200` so that will always pass: 20 | 21 | ```bash 22 | extResponse='200' 23 | ``` 24 | 25 | :warning: **NOTE:** You may need to tweak some of the URLs that are being used to check the applications depending on your setup and you might be using a subfolder configuration where I'm using a subdomain or vice versa. Point is, this won't work 100% for everyone, so you might need to do some trial and error to get everything working. If you run a `curl` command by hand and it comes back with a response of `302` that means there is a redirect and you will need to determine what the final URL is to check against. To help with this, you can run the following command (obviously updating the URL) to determine that final URL: 26 | 27 | `curl -Ls -o /dev/null -w %{url_effective} http://domain.com` 28 | 29 | :warning: **NOTE:** If you have the login page (authentication) enabled for any of the Arr applications, IE: Sonarr, Radarr, Prowlarr, you will most likely need to append the `/login` page to the URL that is being tested. 30 | 31 | ## Scheduling 32 | 33 | Now that you have it configured so that everything is working properly, you can use a cronjob to schedule the script to run automatically and perform the checks. 34 | 35 | Here's an example of running the script every two minutes: 36 | 37 | ```bash 38 | ## Run application healthchecks script for Healthchecks.io 39 | */2 * * * * /home/tronyx/scripts/application_healthchecks.sh 40 | ``` 41 | 42 | My HC.io checks are setup with a two minute period and a three minute grace. You can adjust all of that according to your needs. 43 | 44 | ## Tronitor 45 | 46 | This script partners up with my [Tronitor](https://github.com/christronyxyocum/tronitor) script that allows you to pause and unpause your monitors manually or via a cronjob for scheduled maintenance, etc. If you wish to use this script with Tronitor you will need to uncomment the Tronitor temp directory line and then comment out or remove the original one. 47 | 48 | ## Thanks 49 | 50 | Big thanks to [HalianElf](https://github.com/HalianElf) for creating the Powershell version of the script for Windows users. 51 | 52 | ## Questions 53 | 54 | If you have any questions, you can find me on the [Organizr Discord](https://organizr.app/discord). 55 | -------------------------------------------------------------------------------- /application_healthchecks_generic.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Script to test various application reverse proxies, as well as their internal pages, and report to their respective Healthchecks.io checks 4 | # Tronyx 5 | 6 | # Define some variables 7 | # Primary domain all of your reverse proxies are hosted on 8 | domain='domain.com' 9 | 10 | # Your Organizr API key to get through Org auth 11 | orgAPIKey='' 12 | 13 | # Primary Server IP address of the Server all of your applications/containers are hosted on 14 | # You can add/utilize more Server variables if you would like, as I did below, and if you're running more than one Server like I am 15 | primaryServerAddress='192.168.1.103' 16 | hcPingDomain='https://hc-ping.com/' 17 | 18 | # Additional hostname variables for other checks like Unraid, vCenter, Unifi Controler, Unifi Protect, etc. 19 | unraidServerAddress='' 20 | unifiControllerAddress='' 21 | vCenterServerAddress='' 22 | rNasServerAddress='' 23 | 24 | # Location of the lock file that you can utilize to keep tests paused. 25 | tempDir='/tmp/' 26 | # The below temp dir is for use with the Tronitor script, uncomment the line if you wish to use it 27 | # https://github.com/christronyxyocum/tronitor 28 | #tempDir='/tmp/tronitor/' 29 | healthchecksLockFile="${tempDir}healthchecks.lock" 30 | 31 | # You will need to adjust the subDomain, appPort, subDir, and hcUUID variables for each application's function according to your setup 32 | # I've left in some examples to show the expected format. 33 | 34 | # Function to check for healthchecks lock file 35 | check_lock_file() { 36 | if [ -e "${healthchecksLockFile}" ]; then 37 | echo "Skipping checks due to lock file being present." 38 | exit 0 39 | else 40 | main 41 | fi 42 | } 43 | 44 | # Function to check Organizr public Domain 45 | check_organizr() { 46 | appPort='8889' 47 | hcUUID='' 48 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${domain}") 49 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 50 | appLockFile="${tempDir}${hcUUID}".lock 51 | if [ -e "${appLockFile}" ]; then 52 | : 53 | else 54 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 55 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 56 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 57 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 58 | fi 59 | fi 60 | } 61 | 62 | # Function to check AdGuard 63 | check_adguard() { 64 | subDomain='adguard' 65 | appPort='80' 66 | hcUUID='' 67 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}"/login.html -H "token: ${orgAPIKey}") 68 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}"/login.html) 69 | appLockFile="${tempDir}${hcUUID}".lock 70 | if [ -e "${appLockFile}" ]; then 71 | : 72 | else 73 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 74 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 75 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 76 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 77 | fi 78 | fi 79 | } 80 | 81 | # Function to check Bazarr 82 | check_bazarr() { 83 | appPort='6767' 84 | subDir='/bazarr/' 85 | hcUUID='' 86 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}"system/status -H "token: ${orgAPIKey}") 87 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}"system/status) 88 | appLockFile="${tempDir}${hcUUID}".lock 89 | if [ -e "${appLockFile}" ]; then 90 | : 91 | else 92 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 93 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 94 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 95 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 96 | fi 97 | fi 98 | } 99 | 100 | # Function to check Bitwarden 101 | check_bitwarden() { 102 | subDomain='bitwarden' 103 | appPort='8484' 104 | hcUUID='' 105 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}") 106 | intResponse=$(curl -w "%{http_code}\n" -sIk -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 107 | appLockFile="${tempDir}${hcUUID}".lock 108 | if [ -e "${appLockFile}" ]; then 109 | : 110 | else 111 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 112 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 113 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 114 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 115 | fi 116 | fi 117 | } 118 | 119 | # Function to check Chevereto 120 | check_chevereto() { 121 | subDomain='gallery' 122 | appPort='9292' 123 | hcUUID='' 124 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}") 125 | intResponse=$(curl -w "%{http_code}\n" -sIk -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 126 | appLockFile="${tempDir}${hcUUID}".lock 127 | if [ -e "${appLockFile}" ]; then 128 | : 129 | else 130 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 131 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 132 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 133 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 134 | fi 135 | fi 136 | } 137 | 138 | # Function to check Deluge 139 | check_deluge() { 140 | appPort='8112' 141 | subDir='/deluge/' 142 | hcUUID='' 143 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}""${subDir}" -H "token: ${orgAPIKey}") 144 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 145 | appLockFile="${tempDir}${hcUUID}".lock 146 | if [ -e "${appLockFile}" ]; then 147 | : 148 | else 149 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 150 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 151 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 152 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 153 | fi 154 | fi 155 | } 156 | 157 | # Function to check Dozzle 158 | check_dozzle() { 159 | appPort='8484' 160 | subDir='/dozzle/' 161 | hcUUID='' 162 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}""${subDir}" -H "token: ${orgAPIKey}") 163 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 164 | appLockFile="${tempDir}${hcUUID}".lock 165 | if [ -e "${appLockFile}" ]; then 166 | : 167 | else 168 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 169 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 170 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 171 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 172 | fi 173 | fi 174 | } 175 | 176 | # Function to check Filebrowser 177 | check_filebrowser() { 178 | subDomain='files' 179 | appPort='8585' 180 | hcUUID='' 181 | extResponse=$(curl -w "%{http_code}" -s -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}") 182 | intResponse=$(curl -w "%{http_code}" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 183 | appLockFile="${tempDir}${hcUUID}".lock 184 | if [ -e "${appLockFile}" ]; then 185 | : 186 | else 187 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 188 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 189 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 190 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 191 | fi 192 | fi 193 | } 194 | 195 | # Function to check Forgejo 196 | check_forgejo() { 197 | subDomain='forgejo' 198 | appPort='3000' 199 | hcUUID='' 200 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}""${subDir}" -H "token: ${orgAPIKey}") 201 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 202 | appLockFile="${tempDir}${hcUUID}".lock 203 | if [ -e "${appLockFile}" ]; then 204 | : 205 | else 206 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 207 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 208 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 209 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 210 | fi 211 | fi 212 | } 213 | 214 | # Function to check Gitea 215 | check_gitea() { 216 | subDomain='gitea' 217 | appPort='1234' 218 | hcUUID='' 219 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}""${subDir}" -H "token: ${orgAPIKey}") 220 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 221 | appLockFile="${tempDir}${hcUUID}".lock 222 | if [ -e "${appLockFile}" ]; then 223 | : 224 | else 225 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 226 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 227 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 228 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 229 | fi 230 | fi 231 | } 232 | 233 | # Function to check GitLab 234 | check_gitlab() { 235 | subDomain='gitlab' 236 | appPort='444' 237 | subDir='/users/sign_in' 238 | hcUUID='' 239 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}""${subDir}" -H "token: ${orgAPIKey}") 240 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 241 | appLockFile="${tempDir}${hcUUID}".lock 242 | if [ -e "${appLockFile}" ]; then 243 | : 244 | else 245 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 246 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 247 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 248 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 249 | fi 250 | fi 251 | } 252 | 253 | # Function to check Grafana 254 | check_grafana() { 255 | subDomain='grafana' 256 | appPort='3000' 257 | hcUUID='' 258 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}") 259 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 260 | appLockFile="${tempDir}${hcUUID}".lock 261 | if [ -e "${appLockFile}" ]; then 262 | : 263 | else 264 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 265 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 266 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 267 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 268 | fi 269 | fi 270 | } 271 | 272 | # Function to check Guacamole 273 | check_guacamole() { 274 | appPort='8080' 275 | subDir='/guac/' 276 | hcUUID='' 277 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 278 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 279 | appLockFile="${tempDir}${hcUUID}".lock 280 | if [ -e "${appLockFile}" ]; then 281 | : 282 | else 283 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 284 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 285 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 286 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 287 | fi 288 | fi 289 | } 290 | 291 | # Function to check Immich 292 | check_immich() { 293 | subDomain='immich' 294 | appPort='2283' 295 | hcUUID='' 296 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}""${subDir}" -H "token: ${orgAPIKey}") 297 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 298 | appLockFile="${tempDir}${hcUUID}".lock 299 | if [ -e "${appLockFile}" ]; then 300 | : 301 | else 302 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 303 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 304 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 305 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 306 | fi 307 | fi 308 | } 309 | 310 | # Function to check Jackett 311 | check_jackett() { 312 | appPort='9117' 313 | subDir='/jackett/UI/Login' 314 | hcUUID='' 315 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}""${subDir}" -H "token: ${orgAPIKey}") 316 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 317 | appLockFile="${tempDir}${hcUUID}".lock 318 | if [ -e "${appLockFile}" ]; then 319 | : 320 | else 321 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 322 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 323 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 324 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 325 | fi 326 | fi 327 | } 328 | 329 | # Function to check PLPP 330 | check_library() { 331 | subDomain='library' 332 | appPort='8383' 333 | hcUUID='' 334 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}") 335 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 336 | appLockFile="${tempDir}${hcUUID}".lock 337 | if [ -e "${appLockFile}" ]; then 338 | : 339 | else 340 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 341 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 342 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 343 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 344 | fi 345 | fi 346 | } 347 | 348 | # Function to check Lidarr 349 | check_lidarr() { 350 | appPort='8686' 351 | subDir='/lidarr/' 352 | hcUUID='' 353 | # For newer versions you need to drop the I from the curl command 354 | # Older 355 | #extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 356 | #intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 357 | # Newer 358 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 359 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 360 | appLockFile="${tempDir}${hcUUID}".lock 361 | if [ -e "${appLockFile}" ]; then 362 | : 363 | else 364 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 365 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 366 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 367 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 368 | fi 369 | fi 370 | } 371 | 372 | # Function to check Logarr 373 | check_logarr() { 374 | appPort='8000' 375 | subDir='/logarr/' 376 | hcUUID='' 377 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 378 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 379 | appLockFile="${tempDir}${hcUUID}".lock 380 | if [ -e "${appLockFile}" ]; then 381 | : 382 | else 383 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 384 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 385 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 386 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 387 | fi 388 | fi 389 | } 390 | 391 | # Function to check TheLounge 392 | check_thelounge() { 393 | appPort='9090' 394 | subDir='/thelounge/' 395 | hcUUID='' 396 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${domain}""${subDir}" -H "token: ${orgAPIKey}") 397 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 398 | appLockFile="${tempDir}${hcUUID}".lock 399 | if [ -e "${appLockFile}" ]; then 400 | : 401 | else 402 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 403 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 404 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 405 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 406 | fi 407 | fi 408 | } 409 | 410 | # Function to check Mediabutler 411 | check_mediabutler() { 412 | appPort='9876' 413 | extSubDir='/mediabutler/version/' 414 | intSubDir='/version/' 415 | hcUUID='' 416 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}""${extSubDir}" -H "token: ${orgAPIKey}") 417 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${intSubDir}") 418 | appLockFile="${tempDir}${hcUUID}".lock 419 | if [ -e "${appLockFile}" ]; then 420 | : 421 | else 422 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 423 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 424 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 425 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 426 | fi 427 | fi 428 | } 429 | 430 | # Function to check Monitorr 431 | check_monitorr() { 432 | appPort='8001' 433 | subDir='/monitorr/' 434 | hcUUID='' 435 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 436 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 437 | appLockFile="${tempDir}${hcUUID}".lock 438 | if [ -e "${appLockFile}" ]; then 439 | : 440 | else 441 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 442 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 443 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 444 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 445 | fi 446 | fi 447 | } 448 | 449 | # Function to check Nagios 450 | check_nagios() { 451 | subDomain='nagios' 452 | appPort='8787' 453 | subDir='' 454 | nagUser='' 455 | nagPass='' 456 | hcUUID='' 457 | extResponse=$(curl -u "${nagUser}:${nagPass}" -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}""${subDir}" -H "token: ${orgAPIKey}") 458 | intResponse=$(curl -u "${nagUser}:${nagPass}" -w "%{http_code}\n" -sIk -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 459 | appLockFile="${tempDir}${hcUUID}".lock 460 | if [ -e "${appLockFile}" ]; then 461 | : 462 | else 463 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 464 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 465 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 466 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 467 | fi 468 | fi 469 | } 470 | 471 | # Function to check Navidrome 472 | check_navidrome() { 473 | appPort='4533' 474 | subDir='/navidrome' 475 | hcUUID='' 476 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${domain}""${subDir}"/app -H "token: ${orgAPIKey}") 477 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}"/app) 478 | appLockFile="${tempDir}${hcUUID}".lock 479 | if [ -e "${appLockFile}" ]; then 480 | : 481 | else 482 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 483 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 484 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 485 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 486 | fi 487 | fi 488 | } 489 | 490 | # Function to check Netdata 491 | check_netdata() { 492 | appPort='9999' 493 | extSubDir='/netdata/' 494 | intSubDir='/#menu_system;theme=slate;help=true' 495 | hcUUID='' 496 | extResponse=$(curl -w "%{http_code}\n" -sIL -o /dev/null --connect-timeout 10 -m 10 https://"${domain}""${extSubDir}" -H "token: ${orgAPIKey}") 497 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${intSubDir}") 498 | appLockFile="${tempDir}${hcUUID}".lock 499 | if [ -e "${appLockFile}" ]; then 500 | : 501 | else 502 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 503 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 504 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 505 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 506 | fi 507 | fi 508 | } 509 | 510 | # Function to check Nextcloud 511 | check_nextcloud() { 512 | subDomain='nextcloud' 513 | appPort='9393' 514 | hcUUID='' 515 | extResponse=$(curl -w "%{http_code}\n" -sIL -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}" -H "token: ${orgAPIKey}") 516 | intResponse=$(curl -w "%{http_code}\n" -sILk -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 517 | appLockFile="${tempDir}${hcUUID}".lock 518 | if [ -e "${appLockFile}" ]; then 519 | : 520 | else 521 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 522 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 523 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 524 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 525 | fi 526 | fi 527 | } 528 | 529 | # Function to check Notifiarr 530 | check_notifiarr() { 531 | appPort='5454' 532 | subDir='/notifiarr/' 533 | hcUUID='' 534 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}""${subDir}" -H "token: ${orgAPIKey}") 535 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 536 | appLockFile="${tempDir}${hcUUID}".lock 537 | if [ -e "${appLockFile}" ]; then 538 | : 539 | else 540 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 541 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 542 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 543 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 544 | fi 545 | fi 546 | } 547 | 548 | # Function to check NZBGet 549 | check_nzbget() { 550 | appPort='6789' 551 | subDir='/nzbget/' 552 | hcUUID='' 553 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 554 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 555 | appLockFile="${tempDir}${hcUUID}".lock 556 | if [ -e "${appLockFile}" ]; then 557 | : 558 | else 559 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 560 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 561 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 562 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 563 | fi 564 | fi 565 | } 566 | 567 | # Function to check NZBHydra/NZBHydra2 568 | check_nzbhydra() { 569 | appPort='5076' 570 | subDir='/nzbhydra/' 571 | hcUUID='' 572 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 573 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 574 | appLockFile="${tempDir}${hcUUID}".lock 575 | if [ -e "${appLockFile}" ]; then 576 | : 577 | else 578 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 579 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 580 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 581 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 582 | fi 583 | fi 584 | } 585 | 586 | # Function to check Ombi 587 | check_ombi() { 588 | appPort='3579' 589 | subDir='/ombi/' 590 | hcUUID='' 591 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 592 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 593 | appLockFile="${tempDir}${hcUUID}".lock 594 | if [ -e "${appLockFile}" ]; then 595 | : 596 | else 597 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 598 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 599 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 600 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 601 | fi 602 | fi 603 | } 604 | 605 | # Function to check Overseerr 606 | check_overseerr() { 607 | appPort='5055' 608 | subDomain='overseerr' 609 | subDir='/login' 610 | hcUUID='' 611 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}.${domain}${subDir}" -H "token: ${orgAPIKey}") 612 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 613 | appLockFile="${tempDir}${hcUUID}".lock 614 | if [ -e "${appLockFile}" ]; then 615 | : 616 | else 617 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 618 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 619 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 620 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 621 | fi 622 | fi 623 | } 624 | 625 | # Function to check Petio 626 | # Comment out whichever one you do not use. 627 | check_petio() { 628 | subDomain='petio' 629 | #subDir='/petio/' 630 | appPort='7777' 631 | hcUUID='' 632 | # Subdomain 633 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}" -H "token: ${orgAPIKey}") 634 | # Subdirectory 635 | #extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 636 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 637 | appLockFile="${tempDir}${hcUUID}".lock 638 | if [ -e "${appLockFile}" ]; then 639 | : 640 | else 641 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 642 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 643 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 644 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 645 | fi 646 | fi 647 | } 648 | 649 | # Function to check PiHole 650 | check_pihole() { 651 | subDomain='pihole' 652 | subDir='/admin/login.php' 653 | hcUUID='' 654 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}""${subDir}" -H "token: ${orgAPIKey}") 655 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}") 656 | appLockFile="${tempDir}${hcUUID}".lock 657 | if [ -e "${appLockFile}" ]; then 658 | : 659 | else 660 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 661 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 662 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 663 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 664 | fi 665 | fi 666 | } 667 | 668 | # Function to check Plex 669 | check_plex() { 670 | subDir='/plex/' 671 | appPort='32400' 672 | hcUUID='' 673 | plexExtResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${domain}""${subDir}") 674 | plexIntResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}"/identity) 675 | appLockFile="${tempDir}${hcUUID}".lock 676 | if [ -e "${appLockFile}" ]; then 677 | : 678 | else 679 | if [[ "${plexExtResponse}" = '200' ]] && [[ "${plexIntResponse}" = '200' ]]; then 680 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 681 | elif [[ "${plexExtResponse}" != '200' ]] || [[ "${plexIntResponse}" != '200' ]]; then 682 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 683 | fi 684 | fi 685 | } 686 | 687 | # Function to check status of Plex Auth Service 688 | check_plex_auth() { 689 | hcUUID='' 690 | plexAuthStatus=$(curl -s https://status.plex.tv/ | grep -B4 'Authentication and API server' | grep status | awk -F= '{print $2}' | tr -d '"') 691 | appLockFile="${tempDir}${hcUUID}".lock 692 | if [ -e "${appLockFile}" ]; then 693 | : 694 | else 695 | if [[ "${plexAuthStatus}" = 'operational' ]]; then 696 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 697 | elif [[ "${plexAuthStatus}" != 'operational' ]]; then 698 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 699 | fi 700 | fi 701 | } 702 | 703 | # Function to check Portainer 704 | check_portainer() { 705 | appPort='9000' 706 | subDir='/portainer/' 707 | hcUUID='' 708 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 709 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 710 | appLockFile="${tempDir}${hcUUID}".lock 711 | if [ -e "${appLockFile}" ]; then 712 | : 713 | else 714 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 715 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 716 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 717 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 718 | fi 719 | fi 720 | } 721 | 722 | # Function to check Prowlarr 723 | check_prowlarr() { 724 | appPort='9696' 725 | subDir='/prowlarr/' 726 | hcUUID='' 727 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 728 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 729 | appLockFile="${tempDir}${hcUUID}".lock 730 | if [ -e "${appLockFile}" ]; then 731 | : 732 | else 733 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 734 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 735 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 736 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 737 | fi 738 | fi 739 | } 740 | 741 | # Function to check qBittorrent 742 | check_qbittorrent() { 743 | appPort='8080' 744 | subDir='/qbit/' 745 | hcUUID='' 746 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}""${subDir}" -H "token: ${orgAPIKey}") 747 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 748 | appLockFile="${tempDir}${hcUUID}".lock 749 | if [ -e "${appLockFile}" ]; then 750 | : 751 | else 752 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 753 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 754 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 755 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 756 | fi 757 | fi 758 | } 759 | 760 | # Function to check Radarr 761 | check_radarr() { 762 | appPort='7878' 763 | subDir='/radarr/' 764 | hcUUID='' 765 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 766 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 767 | appLockFile="${tempDir}${hcUUID}".lock 768 | if [ -e "${appLockFile}" ]; then 769 | : 770 | else 771 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 772 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 773 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 774 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 775 | fi 776 | fi 777 | } 778 | 779 | # Function to check Radarr v4 780 | check_radarr_v4() { 781 | appPort='7878' 782 | subDir='/radarr/' 783 | hcUUID='' 784 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 785 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 786 | appLockFile="${tempDir}${hcUUID}".lock 787 | if [ -e "${appLockFile}" ]; then 788 | : 789 | else 790 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 791 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 792 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 793 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 794 | fi 795 | fi 796 | } 797 | 798 | # Function to check ReadyNAS 799 | # No external check because you should not reverse proxy your ReadyNAS panel 800 | check_readynas() { 801 | subDir='/admin/' 802 | rNasUser='' 803 | rNasPass='' 804 | hcUUID='' 805 | extResponse='200' 806 | intResponse=$(curl -u "${rNasUser}:${rNasPass}" -w "%{http_code}\n" -sILk -o /dev/null --connect-timeout 10 -m 10 https://"${rNasServerAddress}""${subDir}") 807 | appLockFile="${tempDir}${hcUUID}".lock 808 | if [ -e "${appLockFile}" ]; then 809 | : 810 | else 811 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 812 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 813 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 814 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 815 | fi 816 | fi 817 | } 818 | 819 | # Function to check ruTorrent 820 | check_rutorrent() { 821 | subDomain='rutorrent' 822 | appPort='9080' 823 | hcUUID='' 824 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}" -H "token: ${orgAPIKey}") 825 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 826 | appLockFile="${tempDir}${hcUUID}".lock 827 | if [ -e "${appLockFile}" ]; then 828 | : 829 | else 830 | if [[ "${extResponse}" = '401' ]] && [[ "${intResponse}" = '401' ]]; then 831 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 832 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '401' ]]; then 833 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 834 | fi 835 | fi 836 | } 837 | 838 | # Function to check SABnzbd 839 | check_sabnzbd() { 840 | appPort='8580' 841 | subDir='/sabnzbd/' 842 | hcUUID='' 843 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 844 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 845 | appLockFile="${tempDir}${hcUUID}".lock 846 | if [ -e "${appLockFile}" ]; then 847 | : 848 | else 849 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 850 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 851 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 852 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 853 | fi 854 | fi 855 | } 856 | 857 | # Function to check Sonarr 858 | check_sonarr() { 859 | appPort='9898' 860 | subDir='/sonarr/' 861 | hcUUID='' 862 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 863 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 864 | appLockFile="${tempDir}${hcUUID}".lock 865 | if [ -e "${appLockFile}" ]; then 866 | : 867 | else 868 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 869 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 870 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 871 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 872 | fi 873 | fi 874 | } 875 | 876 | # Function to check Sonarr v4 877 | check_sonarr_v4() { 878 | appPort='9898' 879 | subDir='/sonarr/' 880 | hcUUID='' 881 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}"login -H "token: ${orgAPIKey}") 882 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}"login) 883 | appLockFile="${tempDir}${hcUUID}".lock 884 | if [ -e "${appLockFile}" ]; then 885 | : 886 | else 887 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 888 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 889 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 890 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 891 | fi 892 | fi 893 | } 894 | 895 | # Function to check Tautulli 896 | check_tautulli() { 897 | appPort='8181' 898 | subDir='/tautulli/status' 899 | hcUUID='' 900 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${domain}${subDir}" -H "token: ${orgAPIKey}") 901 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 902 | appLockFile="${tempDir}${hcUUID}".lock 903 | if [ -e "${appLockFile}" ]; then 904 | : 905 | else 906 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 907 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 908 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 909 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 910 | fi 911 | fi 912 | } 913 | 914 | # Function to check Tdarr 915 | check_tdarr() { 916 | appPort='8265' 917 | subDomain='tdarr' 918 | hcUUID='' 919 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}.${domain}" -H "token: ${orgAPIKey}") 920 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}") 921 | appLockFile="${tempDir}${hcUUID}".lock 922 | if [ -e "${appLockFile}" ]; then 923 | : 924 | else 925 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 926 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 927 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 928 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 929 | fi 930 | fi 931 | } 932 | 933 | # Function to check Transmission 934 | check_transmission() { 935 | appPort='9091' 936 | subDir='/transmission/web/index.html' 937 | hcUUID='' 938 | extResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 https://"${domain}""${subDir}" -H "token: ${orgAPIKey}") 939 | intResponse=$(curl -w "%{http_code}\n" -s -o /dev/null --connect-timeout 10 -m 10 http://"${primaryServerAddress}":"${appPort}""${subDir}") 940 | appLockFile="${tempDir}${hcUUID}".lock 941 | if [ -e "${appLockFile}" ]; then 942 | : 943 | else 944 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 945 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 946 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 947 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 948 | fi 949 | fi 950 | } 951 | 952 | # Function to check Unifi Controller 953 | check_unifi_controller() { 954 | subDomain='unifi' 955 | appPort='8443' 956 | subDir='/manage/account/login' 957 | hcUUID='' 958 | extResponse=$(curl -w "%{http_code}\n" -sIL -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}" -H "token: ${orgAPIKey}") 959 | intResponse=$(curl -w "%{http_code}\n" -sILk -o /dev/null --connect-timeout 10 -m 10 https://"${unifiControllerAddress}":"${appPort}""${subDir}") 960 | # With the 2.3.10 update it seems you have to drop the -I option with curl 961 | #intResponse=$(curl -w "%{http_code}\n" -sLk -o /dev/null --connect-timeout 10 -m 10 https://"${unifiControllerAddress}":"${appPort}""${subDir}") 962 | appLockFile="${tempDir}${hcUUID}".lock 963 | if [ -e "${appLockFile}" ]; then 964 | : 965 | else 966 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 967 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 968 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 969 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 970 | fi 971 | fi 972 | } 973 | 974 | # Function to check Unifi Protect 975 | check_unifi_protect() { 976 | subDomain='nvr' 977 | appPort='7443' 978 | hcUUID='' 979 | extResponse=$(curl -w "%{http_code}\n" -sIL -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}" -H "token: ${orgAPIKey}") 980 | intResponse=$(curl -w "%{http_code}\n" -sILk -o /dev/null --connect-timeout 10 -m 10 https://"${unifiControllerAddress}":"${appPort}") 981 | # With the 1.21.0 update it seems you have to drop the -I option with curl 982 | #intResponse=$(curl -w "%{http_code}\n" -sLk -o /dev/null --connect-timeout 10 -m 10 https://"${unifiControllerAddress}":"${appPort}") 983 | appLockFile="${tempDir}${hcUUID}".lock 984 | if [ -e "${appLockFile}" ]; then 985 | : 986 | else 987 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 988 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 989 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 990 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 991 | fi 992 | fi 993 | } 994 | 995 | # Function to check Unraid 996 | # No external check because you should not reverse proxy your Unraid 997 | check_unraid() { 998 | appPort='80' 999 | hcUUID='' 1000 | extResponse='200' 1001 | intResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 http://"${unraidServerAddress}"/login) 1002 | appLockFile="${tempDir}${hcUUID}".lock 1003 | if [ -e "${appLockFile}" ]; then 1004 | : 1005 | else 1006 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 1007 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 1008 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 1009 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 1010 | fi 1011 | fi 1012 | } 1013 | 1014 | # Function to check vCenter 1015 | # No external check because you should not reverse proxy your vCenter 1016 | check_vcenter() { 1017 | hcUUID='' 1018 | extResponse='200' 1019 | intResponse=$(curl -w "%{http_code}\n" -sIk -o /dev/null --connect-timeout 10 -m 10 https://"${vCenterServerAddress}") 1020 | appLockFile="${tempDir}${hcUUID}".lock 1021 | if [ -e "${appLockFile}" ]; then 1022 | : 1023 | else 1024 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 1025 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 1026 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 1027 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 1028 | fi 1029 | fi 1030 | } 1031 | 1032 | # Function to check XBackBone 1033 | # Internal check response set to 200 since XBackBone redirects you to the 1034 | # domain you have associated with it if you try to browse to it locally 1035 | check_xbackbone() { 1036 | subDomain='sharex' 1037 | hcUUID='' 1038 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}"/login -H "token: ${orgAPIKey}") 1039 | intResponse='200' 1040 | appLockFile="${tempDir}${hcUUID}".lock 1041 | if [ -e "${appLockFile}" ]; then 1042 | : 1043 | else 1044 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 1045 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 1046 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 1047 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 1048 | fi 1049 | fi 1050 | } 1051 | 1052 | # Function to check Zipline 1053 | check_zipline() { 1054 | subDomain='zipline' 1055 | subDir='/auth/login' 1056 | hcUUID='' 1057 | extResponse=$(curl -w "%{http_code}\n" -sI -o /dev/null --connect-timeout 10 -m 10 https://"${subDomain}"."${domain}""${subDir}" -H "token: ${orgAPIKey}") 1058 | intResponse='200' 1059 | appLockFile="${tempDir}${hcUUID}".lock 1060 | if [ -e "${appLockFile}" ]; then 1061 | : 1062 | else 1063 | if [[ "${extResponse}" = '200' ]] && [[ "${intResponse}" = '200' ]]; then 1064 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}" -H "token: ${orgAPIKey}" >/dev/null 1065 | elif [[ "${extResponse}" != '200' ]] || [[ "${intResponse}" != '200' ]]; then 1066 | curl -fsS --retry 3 "${hcPingDomain}${hcUUID}"/fail -H "token: ${orgAPIKey}" >/dev/null 1067 | fi 1068 | fi 1069 | } 1070 | 1071 | # Main function to run all other functions 1072 | # Uncomment (remove the # at the beginning of the line) to enable the checks you want 1073 | main() { 1074 | check_organizr 1075 | #check_adguard 1076 | #check_bazarr 1077 | #check_bitwarden 1078 | #check_chevereto 1079 | #check_deluge 1080 | #check_dozzle 1081 | #check_filebrowser 1082 | #check_forgejo 1083 | #check_gitea 1084 | #check_gitlab 1085 | #check_grafana 1086 | #check_guacamole 1087 | #check_immich 1088 | #check_jackett 1089 | #check_library 1090 | #check_lidarr 1091 | #check_logarr 1092 | #check_thelounge 1093 | #check_mediabutler 1094 | #check_monitorr 1095 | #check_nagios 1096 | #check_navidrome 1097 | #check_netdata 1098 | #check_nextcloud 1099 | #check_notifiarr 1100 | #check_nzbget 1101 | #check_nzbhydra 1102 | #check_ombi 1103 | #check_overseerr 1104 | #check_petio 1105 | #check_pihole 1106 | #check_plex 1107 | #check_plex_auth 1108 | #check_portainer 1109 | #check_prowlarr 1110 | #check_qbittorrent 1111 | #check_radarr 1112 | #check_radarr_v4 1113 | #check_readynas 1114 | #check_rutorrent 1115 | #check_sabnzbd 1116 | #check_sonarr 1117 | #check_sonarr_v4 1118 | #check_tautulli 1119 | #check_tdarr 1120 | #check_transmission 1121 | #check_unifi_controller 1122 | #check_unifi_protect 1123 | #check_unraid 1124 | #check_vcenter 1125 | #check_xbackbone 1126 | #check_zipline 1127 | } 1128 | 1129 | check_lock_file 1130 | --------------------------------------------------------------------------------