diff --git a/data/interfaces/default/settings.html b/data/interfaces/default/settings.html index 2a4f45d1..ad29c0c6 100644 --- a/data/interfaces/default/settings.html +++ b/data/interfaces/default/settings.html @@ -405,9 +405,9 @@ available_notification_agents = sorted(notifiers.available_notification_agents()
-

Enable to have PlexPy check if remote access to the Plex Media Server goes down. (Must have remote access set up in Plex.)

+

Enable to have PlexPy check if remote access to the Plex Media Server goes down. Your server needs to have remote access enabled.

diff --git a/plexpy/activity_pinger.py b/plexpy/activity_pinger.py index d2340d4a..e890e719 100644 --- a/plexpy/activity_pinger.py +++ b/plexpy/activity_pinger.py @@ -18,7 +18,6 @@ from plexpy import logger, pmsconnect, plextv, notification_handler, database, h import threading import plexpy import time -import urllib2 monitor_lock = threading.Lock() ext_ping_count = 0 @@ -226,39 +225,39 @@ def check_server_response(): with monitor_lock: pms_connect = pmsconnect.PmsConnect() - internal_response = pms_connect.get_server_response() - global int_ping_count + server_response = pms_connect.get_server_response() - if not internal_response: + global int_ping_count + global ext_ping_count + + # Check for internal server response + if not server_response: int_ping_count += 1 logger.warn(u"PlexPy Monitor :: Unable to get an internal response from the server, ping attempt %s." \ % str(int_ping_count)) + # Reset internal ping counter else: int_ping_count = 0 - if plexpy.CONFIG.MONITOR_REMOTE_ACCESS: - plex_tv = plextv.PlexTV() - external_response = plex_tv.get_server_response() - global ext_ping_count + # Check for remote access + if server_response and plexpy.CONFIG.MONITOR_REMOTE_ACCESS: - if not external_response: - ext_ping_count += 1 - logger.warn(u"PlexPy Monitor :: Plex remote access port mapping failed, ping attempt %s." \ - % str(ext_ping_count)) - else: - host = external_response[0]['host'] - port = external_response[0]['port'] + mapping_state = server_response['mapping_state'] + mapping_error = server_response['mapping_error'] - try: - http_response = urllib2.urlopen('http://' + host + ':' + port) - except urllib2.HTTPError, e: - ext_ping_count = 0 - except urllib2.URLError, e: - ext_ping_count += 1 - logger.warn(u"PlexPy Monitor :: Unable to get an external response from the server, ping attempt %s." \ - % str(ext_ping_count)) - else: - ext_ping_count = 0 + # Check if the port is mapped + if not mapping_state == 'mapped': + ext_ping_count += 1 + logger.warn(u"PlexPy Monitor :: Plex remote access port not mapped, ping attempt %s." \ + % str(ext_ping_count)) + # Check if the port is open + elif mapping_error == 'unreachable': + ext_ping_count += 1 + logger.warn(u"PlexPy Monitor :: Plex remote access port mapped, but mapping failed, ping attempt %s." \ + % str(ext_ping_count)) + # Reset external ping counter + else: + ext_ping_count = 0 if int_ping_count == 3: # Fire off notifications diff --git a/plexpy/plextv.py b/plexpy/plextv.py index 76c55d69..1c6682a1 100644 --- a/plexpy/plextv.py +++ b/plexpy/plextv.py @@ -462,23 +462,4 @@ class PlexTV(object): }) break - return server_times - - def get_server_response(self): - response = self.get_plextv_server_list(output_format='xml') - - server_url = [] - - try: - xml_head = response.getElementsByTagName('Server') - except: - return False - - for a in xml_head: - if helpers.get_xml_attr(a, 'machineIdentifier') == plexpy.CONFIG.PMS_IDENTIFIER: - server_url.append({"host": helpers.get_xml_attr(a, 'host'), - "port": helpers.get_xml_attr(a, 'port') - }) - break - - return server_url \ No newline at end of file + return server_times \ No newline at end of file diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py index e647b34c..76df52dd 100644 --- a/plexpy/pmsconnect.py +++ b/plexpy/pmsconnect.py @@ -270,6 +270,22 @@ class PmsConnect(object): return request + """ + Return account details. + + Optional parameters: output_format { dict, json } + + Output: array + """ + def get_account(self, output_format=''): + uri = '/myplex/account' + request = self.request_handler.make_request(uri=uri, + proto=self.protocol, + request_type='GET', + output_format=output_format) + + return request + """ Return processed and validated list of recently added items. @@ -1650,15 +1666,22 @@ class PmsConnect(object): return key_list - """ - Check for a server response. - - Output: bool - """ def get_server_response(self): - response = self.get_server_list() + account_data = self.get_account(output_format='xml') + + try: + xml_head = account_data.getElementsByTagName('MyPlex') + except: + logger.warn("Unable to parse XML for get_server_response.") + return None + + server_response = {} - if not response: - return False - else: - return True + for a in xml_head: + server_response = {'mapping_state': helpers.get_xml_attr(a, 'mappingState'), + 'mapping_error': helpers.get_xml_attr(a, 'mappingError'), + 'public_address': helpers.get_xml_attr(a, 'publicAddress'), + 'public_port': helpers.get_xml_attr(a, 'publicPort') + } + + return server_response \ No newline at end of file