|
@@ -30,34 +30,57 @@ class PortAlert(BaseAlert):
|
|
|
|
|
|
def __init__(self, alert_meta, alert_source_meta):
|
|
|
super(PortAlert, self).__init__(alert_meta, alert_source_meta)
|
|
|
-
|
|
|
- # can be parameterized
|
|
|
- self.uri = self._find_lookup_property(alert_source_meta['uri'])
|
|
|
- self.port = alert_source_meta['default_port']
|
|
|
+
|
|
|
+ self.uri = None
|
|
|
+ self.default_port = None
|
|
|
+
|
|
|
+ # can be parameterized or static
|
|
|
+ if 'uri' in alert_source_meta:
|
|
|
+ self.uri = self._find_lookup_property(alert_source_meta['uri'])
|
|
|
+
|
|
|
+ # always static
|
|
|
+ if 'default_port' in alert_source_meta:
|
|
|
+ self.default_port = alert_source_meta['default_port']
|
|
|
|
|
|
def _collect(self):
|
|
|
- urivalue = self._lookup_property_value(self.uri)
|
|
|
+ # if not parameterized, this will return the static value
|
|
|
+ uri_value = self._lookup_property_value(self.uri)
|
|
|
+ if uri_value is None:
|
|
|
+ uri_value = self.host_name
|
|
|
+
|
|
|
+ # in some cases, a single property is a comma-separated list like
|
|
|
+ # host1:8080,host2:8081,host3:8083
|
|
|
+ uri_value_array = uri_value.split(',')
|
|
|
+ if len(uri_value_array) > 1:
|
|
|
+ for item in uri_value_array:
|
|
|
+ if item.startswith(self.host_name):
|
|
|
+ uri_value = item
|
|
|
|
|
|
- port = self.port
|
|
|
- host = BaseAlert.get_host_from_url(urivalue)
|
|
|
+ host = BaseAlert.get_host_from_url(uri_value)
|
|
|
if host is None:
|
|
|
host = self.host_name
|
|
|
|
|
|
try:
|
|
|
- port = int(get_port_from_url(urivalue))
|
|
|
+ port = int(get_port_from_url(uri_value))
|
|
|
except:
|
|
|
- # if port not found, default port already set to port
|
|
|
- pass
|
|
|
-
|
|
|
+ if self.default_port is None:
|
|
|
+ label = 'Unable to determine port from URI {0}'.format(uri_value)
|
|
|
+ return (self.RESULT_UNKNOWN, [label])
|
|
|
+
|
|
|
+ port = self.default_port
|
|
|
+
|
|
|
+
|
|
|
if logger.isEnabledFor(logging.DEBUG):
|
|
|
logger.debug("checking {0} listening on port {1}".format(host, str(port)))
|
|
|
|
|
|
try:
|
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
s.settimeout(1.5)
|
|
|
+
|
|
|
t = time.time()
|
|
|
s.connect((host, port))
|
|
|
millis = time.time() - t
|
|
|
+
|
|
|
return (self.RESULT_OK, [millis/1000, port])
|
|
|
except Exception as e:
|
|
|
return (self.RESULT_CRITICAL, [str(e), host, port])
|
|
@@ -66,5 +89,5 @@ class PortAlert(BaseAlert):
|
|
|
try:
|
|
|
s.close()
|
|
|
except:
|
|
|
+ # no need to log a close failure
|
|
|
pass
|
|
|
-
|