diff --git a/Varken/helpers.py b/Varken/helpers.py index b441e3b..57afbab 100644 --- a/Varken/helpers.py +++ b/Varken/helpers.py @@ -4,7 +4,9 @@ import tarfile import hashlib import geoip2.database from typing import NamedTuple +from json.decoder import JSONDecodeError from os.path import abspath, join +from requests.exceptions import InvalidSchema, SSLError from urllib.request import urlretrieve @@ -371,3 +373,31 @@ def hashit(string): hashed = hashlib.md5(encoded).hexdigest() return hashed + + +def connection_handler(session, request, verify): + s = session + r = request + v = verify + return_json = False + + try: + get = s.send(r, verify=v) + if get.status_code == 401: + print("Your api key is incorrect for {}".format(r.url)) + elif get.status_code == 404: + print("This url doesnt even resolve: {}".format(r.url)) + elif get.status_code == 200: + try: + return_json = get.json() + except JSONDecodeError: + print("No JSON response... BORKED! Let us know in discord") + + except InvalidSchema: + print("You added http(s):// in the config file. Don't do that.") + + except SSLError as e: + print("Either your host is unreachable or you have an ssl issue.") + print("The issue was: {}".format(e)) + + return return_json diff --git a/Varken/iniparser.py b/Varken/iniparser.py index 0b71629..be390e4 100644 --- a/Varken/iniparser.py +++ b/Varken/iniparser.py @@ -60,6 +60,8 @@ class INIParser(object): apikey = self.config.get(sonarr_section, 'apikey') scheme = 'https://' if self.config.getboolean(sonarr_section, 'ssl') else 'http://' verify_ssl = self.config.getboolean(sonarr_section, 'verify_ssl') + if scheme != 'https://': + verify_ssl = False queue = self.config.getboolean(sonarr_section, 'queue') missing_days = self.config.getint(sonarr_section, 'missing_days') future_days = self.config.getint(sonarr_section, 'future_days') @@ -90,6 +92,8 @@ class INIParser(object): apikey = self.config.get(radarr_section, 'apikey') scheme = 'https://' if self.config.getboolean(radarr_section, 'ssl') else 'http://' verify_ssl = self.config.getboolean(radarr_section, 'verify_ssl') + if scheme != 'https://': + verify_ssl = False queue = self.config.getboolean(radarr_section, 'queue') queue_run_seconds = self.config.getint(radarr_section, 'queue_run_seconds') get_missing = self.config.getboolean(radarr_section, 'get_missing') @@ -118,6 +122,8 @@ class INIParser(object): apikey = self.config.get(tautulli_section, 'apikey') scheme = 'https://' if self.config.getboolean(tautulli_section, 'ssl') else 'http://' verify_ssl = self.config.getboolean(tautulli_section, 'verify_ssl') + if scheme != 'https://': + verify_ssl = False get_activity = self.config.getboolean(tautulli_section, 'get_activity') get_activity_run_seconds = self.config.getint(tautulli_section, 'get_activity_run_seconds') get_sessions = self.config.getboolean(tautulli_section, 'get_sessions') @@ -144,6 +150,8 @@ class INIParser(object): apikey = self.config.get(ombi_section, 'apikey') scheme = 'https://' if self.config.getboolean(ombi_section, 'ssl') else 'http://' verify_ssl = self.config.getboolean(ombi_section, 'verify_ssl') + if scheme != 'https://': + verify_ssl = False request_type_counts = self.config.getboolean(ombi_section, 'get_request_type_counts') request_type_run_seconds = self.config.getint(ombi_section, 'request_type_run_seconds') request_total_counts = self.config.getboolean(ombi_section, 'get_request_total_counts') @@ -161,6 +169,8 @@ class INIParser(object): password = self.config.get('asa', 'password') scheme = 'https://' if self.config.getboolean('asa', 'ssl') else 'http://' verify_ssl = self.config.getboolean('asa', 'verify_ssl') + if scheme != 'https://': + verify_ssl = False db_name = self.config.get('asa', 'influx_db') self.asa = (scheme + url, username, password, verify_ssl, db_name) diff --git a/Varken/ombi.py b/Varken/ombi.py index 5ca3d7f..50cbca5 100644 --- a/Varken/ombi.py +++ b/Varken/ombi.py @@ -1,8 +1,8 @@ -from requests import Session +from requests import Session, Request from datetime import datetime, timezone -from Varken.helpers import OmbiRequestCounts from Varken.logger import logging +from Varken.helpers import OmbiRequestCounts, connection_handler class OmbiAPI(object): @@ -19,8 +19,14 @@ class OmbiAPI(object): self.now = datetime.now(timezone.utc).astimezone().isoformat() tv_endpoint = '/api/v1/Request/tv' movie_endpoint = "/api/v1/Request/movie" - get_tv = self.session.get(self.server.url + tv_endpoint, verify=self.server.verify_ssl).json() - get_movie = self.session.get(self.server.url + movie_endpoint, verify=self.server.verify_ssl).json() + + tv_req = self.session.prepare_request(Request('GET', self.server.url + tv_endpoint)) + movie_req = self.session.prepare_request(Request('GET', self.server.url + movie_endpoint)) + get_tv = connection_handler(self.session, tv_req, self.server.verify_ssl) + get_movie = connection_handler(self.session, movie_req, self.server.verify_ssl) + + if not all([get_tv, get_movie]): + return movie_requests = len(get_movie) tv_requests = len(get_tv) @@ -46,7 +52,13 @@ class OmbiAPI(object): def get_request_counts(self): self.now = datetime.now(timezone.utc).astimezone().isoformat() endpoint = '/api/v1/Request/count' - get = self.session.get(self.server.url + endpoint, verify=self.server.verify_ssl).json() + + req = self.session.prepare_request(Request('GET', self.server.url + endpoint)) + get = connection_handler(self.session, req, self.server.verify_ssl) + + if not get: + return + requests = OmbiRequestCounts(**get) influx_payload = [ { diff --git a/Varken/radarr.py b/Varken/radarr.py index 9bff5c9..1ec3e1e 100644 --- a/Varken/radarr.py +++ b/Varken/radarr.py @@ -1,8 +1,8 @@ -from requests import Session +from requests import Session, Request from datetime import datetime, timezone from Varken.logger import logging -from Varken.helpers import Movie, Queue, hashit +from Varken.helpers import Movie, Queue, hashit, connection_handler class RadarrAPI(object): @@ -21,7 +21,12 @@ class RadarrAPI(object): influx_payload = [] missing = [] - get = self.session.get(self.server.url + endpoint, verify=self.server.verify_ssl).json() + req = self.session.prepare_request(Request('GET', self.server.url + endpoint)) + get = connection_handler(self.session, req, self.server.verify_ssl) + + if not get: + return + movies = [Movie(**movie) for movie in get] for movie in movies: @@ -60,7 +65,13 @@ class RadarrAPI(object): self.now = datetime.now(timezone.utc).astimezone().isoformat() influx_payload = [] queue = [] - get = self.session.get(self.server.url + endpoint, verify=self.server.verify_ssl).json() + + req = self.session.prepare_request(Request('GET', self.server.url + endpoint)) + get = connection_handler(self.session, req, self.server.verify_ssl) + + if not get: + return + for movie in get: movie['movie'] = Movie(**movie['movie']) download_queue = [Queue(**movie) for movie in get] diff --git a/Varken/sonarr.py b/Varken/sonarr.py index 60e73fb..cbcab0f 100644 --- a/Varken/sonarr.py +++ b/Varken/sonarr.py @@ -1,8 +1,8 @@ -from requests import Session +from requests import Session, Request from datetime import datetime, timezone, date, timedelta from Varken.logger import logging -from Varken.helpers import TVShow, Queue, hashit +from Varken.helpers import TVShow, Queue, hashit, connection_handler class SonarrAPI(object): @@ -26,7 +26,12 @@ class SonarrAPI(object): influx_payload = [] missing = [] - get = self.session.get(self.server.url + endpoint, params=params, verify=self.server.verify_ssl).json() + req = self.session.prepare_request(Request('GET', self.server.url + endpoint, params=params)) + get = connection_handler(self.session, req, self.server.verify_ssl) + + if not get: + return + # Iteratively create a list of TVShow Objects from response json tv_shows = [TVShow(**show) for show in get] @@ -69,7 +74,12 @@ class SonarrAPI(object): air_days = [] params = {'start': self.today, 'end': future} - get = self.session.get(self.server.url + endpoint, params=params, verify=self.server.verify_ssl).json() + req = self.session.prepare_request(Request('GET', self.server.url + endpoint, params=params)) + get = connection_handler(self.session, req, self.server.verify_ssl) + + if not get: + return + tv_shows = [TVShow(**show) for show in get] for show in tv_shows: @@ -111,7 +121,12 @@ class SonarrAPI(object): self.now = datetime.now(timezone.utc).astimezone().isoformat() queue = [] - get = self.session.get(self.server.url + endpoint, verify=self.server.verify_ssl).json() + req = self.session.prepare_request(Request('GET', self.server.url + endpoint)) + get = connection_handler(self.session, req, self.server.verify_ssl) + + if not get: + return + download_queue = [Queue(**show) for show in get] for show in download_queue: diff --git a/Varken/tautulli.py b/Varken/tautulli.py index 149599c..fe2629a 100644 --- a/Varken/tautulli.py +++ b/Varken/tautulli.py @@ -1,9 +1,9 @@ from datetime import datetime, timezone from geoip2.errors import AddressNotFoundError -from requests import Session +from requests import Session, Request -from Varken.helpers import TautulliStream, geo_lookup, hashit from Varken.logger import logging +from Varken.helpers import TautulliStream, geo_lookup, hashit, connection_handler class TautulliAPI(object): @@ -21,8 +21,14 @@ class TautulliAPI(object): self.now = datetime.now(timezone.utc).astimezone().isoformat() params = {'cmd': 'get_activity'} influx_payload = [] - g = self.session.get(self.server.url + self.endpoint, params=params, verify=self.server.verify_ssl) - get = g.json()['response']['data'] + + req = self.session.prepare_request(Request('GET', self.server.url + self.endpoint, params=params)) + g = connection_handler(self.session, req, self.server.verify_ssl) + + if not g: + return + else: + get = g['response']['data'] influx_payload.append( { @@ -51,8 +57,15 @@ class TautulliAPI(object): self.now = datetime.now(timezone.utc).astimezone().isoformat() params = {'cmd': 'get_activity'} influx_payload = [] - g = self.session.get(self.server.url + self.endpoint, params=params, verify=self.server.verify_ssl) - get = g.json()['response']['data']['sessions'] + + req = self.session.prepare_request(Request('GET', self.server.url + self.endpoint, params=params)) + g = connection_handler(self.session, req, self.server.verify_ssl) + + if not g: + return + else: + get = g['response']['data']['sessions'] + sessions = [TautulliStream(**session) for session in get] for session in sessions: