diff --git a/README.md b/README.md index 02530cf..eb2ba29 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,12 @@ Note: The `config.conf` is disregarded when running via docker-compose.yml - Permissible Values: True, False - Is Mandatory: No (Defaults to False) +**SSL_VERIFICATION** +- Turns SSL certificate verification on or off for all API calls. +- Type: Boolean +- Permissible Values: True, False +- Is Mandatory: No (Defaults to True) + --- ### **Features settings** diff --git a/config/config.py b/config/config.py index 575bc29..66858df 100644 --- a/config/config.py +++ b/config/config.py @@ -80,6 +80,7 @@ config.read(config_file_full_path) # General LOG_LEVEL = get_config_value('LOG_LEVEL', 'general', False, str, 'INFO') TEST_RUN = get_config_value('TEST_RUN', 'general', False, bool, False) +SSL_VERIFICATION = get_config_value('SSL_VERIFICATION', 'general', False, bool, True) # Features REMOVE_TIMER = get_config_value('REMOVE_TIMER', 'features', False, float, 10) diff --git a/main.py b/main.py index 0a864c9..64e58c5 100644 --- a/main.py +++ b/main.py @@ -12,6 +12,11 @@ import requests import platform from packaging import version +# Hide SSL Verification Warnings +if settings_dict['SSL_VERIFICATION']==False: + import warnings + warnings.filterwarnings("ignore", message="Unverified HTTPS request") + ########### Enabling Logging # Set up logging log_level_num=logging.getLevelName(settings_dict['LOG_LEVEL']) @@ -94,7 +99,7 @@ async def main(): if settings_dict['RADARR_URL']: error_occured = False try: - await asyncio.get_event_loop().run_in_executor(None, lambda: requests.get(settings_dict['RADARR_URL']+'/system/status', params=None, headers={'X-Api-Key': settings_dict['RADARR_KEY']})) + await asyncio.get_event_loop().run_in_executor(None, lambda: requests.get(settings_dict['RADARR_URL']+'/system/status', params=None, headers={'X-Api-Key': settings_dict['RADARR_KEY']}, verify=settings_dict['SSL_VERIFICATION'])) except Exception as error: error_occured = True logger.error('-- | %s *** Error: %s ***', settings_dict['RADARR_NAME'], error) @@ -108,7 +113,7 @@ async def main(): if settings_dict['SONARR_URL']: try: - await asyncio.get_event_loop().run_in_executor(None, lambda: requests.get(settings_dict['SONARR_URL']+'/system/status', params=None, headers={'X-Api-Key': settings_dict['SONARR_KEY']})) + await asyncio.get_event_loop().run_in_executor(None, lambda: requests.get(settings_dict['SONARR_URL']+'/system/status', params=None, headers={'X-Api-Key': settings_dict['SONARR_KEY']}, verify=settings_dict['SSL_VERIFICATION'])) except Exception as error: error_occured = True logger.error('-- | %s *** Error: %s ***', settings_dict['SONARR_NAME'], error) @@ -122,7 +127,7 @@ async def main(): if settings_dict['LIDARR_URL']: try: - await asyncio.get_event_loop().run_in_executor(None, lambda: requests.get(settings_dict['LIDARR_URL']+'/system/status', params=None, headers={'X-Api-Key': settings_dict['LIDARR_KEY']})) + await asyncio.get_event_loop().run_in_executor(None, lambda: requests.get(settings_dict['LIDARR_URL']+'/system/status', params=None, headers={'X-Api-Key': settings_dict['LIDARR_KEY']}, verify=settings_dict['SSL_VERIFICATION'])) logger.info('OK | %s', settings_dict['LIDARR_NAME']) except Exception as error: error_occured = True @@ -130,7 +135,7 @@ async def main(): if settings_dict['READARR_URL']: try: - await asyncio.get_event_loop().run_in_executor(None, lambda: requests.get(settings_dict['READARR_URL']+'/system/status', params=None, headers={'X-Api-Key': settings_dict['READARR_KEY']})) + await asyncio.get_event_loop().run_in_executor(None, lambda: requests.get(settings_dict['READARR_URL']+'/system/status', params=None, headers={'X-Api-Key': settings_dict['READARR_KEY']}, verify=settings_dict['SSL_VERIFICATION'])) logger.info('OK | %s', settings_dict['READARR_NAME']) except Exception as error: error_occured = True @@ -139,7 +144,7 @@ async def main(): if settings_dict['QBITTORRENT_URL']: # Checking if qbit can be reached, and checking if version is OK try: - response = await asyncio.get_event_loop().run_in_executor(None, lambda: requests.post(settings_dict['QBITTORRENT_URL']+'/auth/login', data={'username': settings_dict['QBITTORRENT_USERNAME'], 'password': settings_dict['QBITTORRENT_PASSWORD']}, headers={'content-type': 'application/x-www-form-urlencoded'})) + response = await asyncio.get_event_loop().run_in_executor(None, lambda: requests.post(settings_dict['QBITTORRENT_URL']+'/auth/login', data={'username': settings_dict['QBITTORRENT_USERNAME'], 'password': settings_dict['QBITTORRENT_PASSWORD']}, headers={'content-type': 'application/x-www-form-urlencoded'}, verify=settings_dict['SSL_VERIFICATION'])) if response.text == 'Fails.': raise ConnectionError('Login failed.') response.raise_for_status() diff --git a/src/utils/rest.py b/src/utils/rest.py index 895813f..f58c414 100644 --- a/src/utils/rest.py +++ b/src/utils/rest.py @@ -10,7 +10,7 @@ from config.config import settings_dict async def rest_get(url, api_key=None, params=None, cookies=None): try: headers = {'X-Api-Key': api_key} if api_key else None - response = await asyncio.get_event_loop().run_in_executor(None, lambda: requests.get(url, params=params, headers=headers, cookies=cookies)) + response = await asyncio.get_event_loop().run_in_executor(None, lambda: requests.get(url, params=params, headers=headers, cookies=cookies, verify=settings_dict['SSL_VERIFICATION'])) response.raise_for_status() return response.json() except requests.exceptions.HTTPError as e: @@ -26,7 +26,7 @@ async def rest_delete(url, api_key, params=None): if settings_dict['TEST_RUN']: return try: headers = {'X-Api-Key': api_key} - response = await asyncio.get_event_loop().run_in_executor(None, lambda: requests.delete(url, params=params, headers=headers)) + response = await asyncio.get_event_loop().run_in_executor(None, lambda: requests.delete(url, params=params, headers=headers, verify=settings_dict['SSL_VERIFICATION'])) response.raise_for_status() if response.status_code in [200, 204]: return None @@ -42,7 +42,7 @@ async def rest_delete(url, api_key, params=None): async def rest_post(url, data=None, json=None, headers=None, cookies=None): if settings_dict['TEST_RUN']: return try: - response = await asyncio.get_event_loop().run_in_executor(None, lambda: requests.post(url, data=data, json=json, headers=headers, cookies=cookies)) + response = await asyncio.get_event_loop().run_in_executor(None, lambda: requests.post(url, data=data, json=json, headers=headers, cookies=cookies, verify=settings_dict['SSL_VERIFICATION'])) response.raise_for_status() if response.status_code in (200,201): return None @@ -60,7 +60,7 @@ async def rest_put(url, api_key, data): if settings_dict['TEST_RUN']: return try: headers = {'X-Api-Key': api_key} | {"content-type": "application/json"} - response = await asyncio.get_event_loop().run_in_executor(None, lambda: requests.put(url, data=data, headers=headers)) + response = await asyncio.get_event_loop().run_in_executor(None, lambda: requests.put(url, data=data, headers=headers, verify=settings_dict['SSL_VERIFICATION'])) response.raise_for_status() return response.json() except RequestException as e: