]> arthur.barton.de Git - netdata.git/blobdiff - python.d/python_modules/base.py
Merge pull request #1165 from kesslerm/fix/python-plugin-crash
[netdata.git] / python.d / python_modules / base.py
index 14c7ca11401c99322fb291db4a2f8b118f768c0a..201128f876fec33a9d89c6f0ae4de73ed8c2b4ab 100644 (file)
@@ -168,7 +168,7 @@ class SimpleService(threading.Thread):
                 return
 
             if status:  # handle retries if update failed
-                time.sleep(self.timetable['next'] - time.time())
+                time.sleep(max (0, self.timetable['next'] - time.time()))
                 self.retries_left = self.retries
             else:
                 self.retries_left -= 1
@@ -357,10 +357,18 @@ class SimpleService(threading.Thread):
         :return: boolean
         """
         self.debug("Module", str(self.__module__), "doesn't implement check() function. Using default.")
-        if self._get_data() is None or len(self._get_data()) == 0:
+        data = self._get_data()
+
+        if data is None:
+            self.debug("failed to receive data during check().")
             return False
-        else:
-            return True
+
+        if len(data) == 0:
+            self.debug("empty data during check().")
+            return False
+
+        self.debug("successfully received data during check(): '" + str(data) + "'")
+        return True
 
     def create(self):
         """
@@ -369,6 +377,7 @@ class SimpleService(threading.Thread):
         """
         data = self._get_data()
         if data is None:
+            self.debug("failed to receive data during create().")
             return False
 
         idx = 0
@@ -392,7 +401,7 @@ class SimpleService(threading.Thread):
         """
         data = self._get_data()
         if data is None:
-            self.debug("_get_data() returned no data")
+            self.debug("failed to receive data during update().")
             return False
 
         updated = False
@@ -565,32 +574,33 @@ class SocketService(SimpleService):
         self.__socket_config = res
         return True
 
-    def _connect2unixsocket(self, path=None):
+    def _connect2unixsocket(self):
         """
         Connect to a unix socket, given its filename
         :return: boolean
         """
-        if path is None:
+        if self.unix_socket is None:
             self.error("cannot connect to unix socket 'None'")
             return False
 
         try:
-            self.debug("attempting DGRAM unix socket '" + str(path) + "'")
+            self.debug("attempting DGRAM unix socket '" + str(self.unix_socket) + "'")
             self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
-            self._sock.connect(path)
-            self.debug("connected DGRAM unix socket '" + str(path) + "'")
+            self._sock.connect(self.unix_socket)
+            self.debug("connected DGRAM unix socket '" + str(self.unix_socket) + "'")
             return True
         except socket.error as e:
-            self.error("Failed to connect DGRAM unix socket '" + str(path) + "':", str(e))
+            self.debug("Failed to connect DGRAM unix socket '" + str(self.unix_socket) + "':", str(e))
 
         try:
-            self.debug("attempting STREAM unix socket '" + str(path) + "'")
+            self.debug("attempting STREAM unix socket '" + str(self.unix_socket) + "'")
             self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
-            self._sock.connect(path)
-            self.debug("connected STREAM unix socket '" + str(path) + "'")
+            self._sock.connect(self.unix_socket)
+            self.debug("connected STREAM unix socket '" + str(self.unix_socket) + "'")
             return True
         except socket.error as e:
-            self.error("Failed to connect STREAM unix socket '" + str(path) + "':", str(e))
+            self.debug("Failed to connect STREAM unix socket '" + str(self.unix_socket) + "':", str(e))
+            self.error("Failed to connect to unix socket '" + str(self.unix_socket) + "':", str(e))
             self._sock = None
             return False
 
@@ -602,7 +612,7 @@ class SocketService(SimpleService):
         """
         try:
             if self.unix_socket is not None:
-                _connect2unixsocket(self.unix_socket)
+                self._connect2unixsocket()
 
             else:
                 if self.__socket_config is not None:
@@ -666,7 +676,10 @@ class SocketService(SimpleService):
                 break
 
             if buf is None or len(buf) == 0:  # handle server disconnect
-                self.debug("server closed the connection")
+                if data == "":
+                    self._socketerror("unexpectedly disconnected")
+                else:
+                    self.debug("server closed the connection")
                 self._disconnect()
                 break
 
@@ -716,6 +729,7 @@ class SocketService(SimpleService):
             self.name = ""
         else:
             self.name = str(self.name)
+
         try:
             self.unix_socket = str(self.configuration['socket'])
         except (KeyError, TypeError):
@@ -729,10 +743,12 @@ class SocketService(SimpleService):
                 self.port = int(self.configuration['port'])
             except (KeyError, TypeError):
                 self.debug("No port specified. Using: '" + str(self.port) + "'")
+
         try:
             self.request = str(self.configuration['request'])
         except (KeyError, TypeError):
             self.debug("No request specified. Using: '" + str(self.request) + "'")
+
         self.request = self.request.encode()
 
     def check(self):