cd /usr/lib/zabbix/externalscripts
#cat check_ssl
<code>#/bin/bash</code>
<code>host=$1</code>
<code>port=$2</code>
<code>end_date=`openssl s_client -host $host -port $port -showcerts </dev/</code><code>null</code> <code>2>/dev/</code><code>null</code> <code>|</code>
<code> </code><code>sed -n </code><code>'/BEGIN CERTIFICATE/,/END CERT/p'</code> <code>|</code>
<code> </code><code>openssl x509 -text 2>/dev/</code><code>null</code> <code>|</code>
<code> </code><code>sed -n </code><code>'s/ *Not After : *//p'</code><code>`</code>
<code>if</code> <code>[ -n </code><code>"$end_date"</code> <code>]</code>
<code>then</code>
<code> </code><code>end_date_seconds=`date </code><code>'+%s'</code> <code>--date </code><code>"$end_date"</code><code>`</code>
<code># date指令format字元串時間。</code>
<code> </code><code>now_seconds=`date </code><code>'+%s'</code><code>`</code>
<code> </code><code>echo </code><code>"($end_date_seconds-$now_seconds)/24/3600"</code> <code>| bc</code>
<code>fi</code>
zabbix 界面配置如下
<a href="https://s4.51cto.com/wyfs02/M02/06/EA/wKiom1nAjRfhHRFmAAPNQptYbCc027.png" target="_blank"></a>
check_rabbitmq_stats
cat check_rabbitmq_stats
<code>[root@it-zabbix03 externalscripts]#</code>
<code>[root@it-zabbix03 externalscripts]#ls</code>
<code>check_rabbitmq_stats check_ssl digium_active_calls digium_active_ports mikoomi-mongodb-plugin.php mikoomi-mongodb-plugin.sh rbl.check rblwatch.py rblwatch.pyc ronglianyun.php ronglianyun.sh</code>
<code>[root@it-zabbix03 externalscripts]#cat check_rabbitmq_stats</code>
<code>#!/usr/bin/python</code>
<code>import sys</code>
<code>import socket</code>
<code>import re</code>
<code>import ZabbixSender</code>
<code>#from ZabbixSender.ZabbixSender import ZabbixSender</code>
<code>import json</code>
<code>import urllib2</code>
<code>import requests</code>
<code>from</code> <code>collections import defaultdict</code>
<code>class</code> <code>RabbitMQAPI(</code><code>object</code><code>):</code>
<code> </code><code>''</code><code>'Class for RabbitMQ Management API'</code><code>''</code>
<code> </code><code>def __init__(self, username=</code><code>'guest'</code><code>, password=</code><code>'guest'</code><code>, hostname=</code><code>''</code><code>,</code>
<code> </code><code>port=15672, interval=60):</code>
<code> </code><code>self.username = username</code>
<code> </code><code>self.password = password</code>
<code> </code><code>self.hostname = hostname or socket.gethostname()</code>
<code> </code><code>self.port = port</code>
<code> </code><code>self.stat_interval = interval</code>
<code> </code><code>def call_api(self, path):</code>
<code> </code><code>''</code><code>'Call the REST API and convert the results into JSON.'</code><code>''</code>
<code> </code><code>url = </code><code>'http://{0}:{1}/api/{2}'</code><code>.format(self.hostname, self.port, path)</code>
<code> </code><code>response = requests.</code><code>get</code><code>(url, auth=(self.username, self.password))</code>
<code> </code><code>''</code><code>'</code>
<code> </code><code>password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()</code>
<code> </code><code>password_mgr.add_password(None, url, self.username, self.password)</code>
<code> </code><code>handler = urllib2.HTTPBasicAuthHandler(password_mgr)</code>
<code> </code><code>return</code> <code>json.loads(response.content)</code>
<code> </code><code>def get_message_details(self):</code>
<code> </code><code>''</code><code>'get messages overview'</code><code>''</code>
<code> </code><code>messages = {}</code>
<code> </code><code>cluster = self.call_api(</code><code>'overview'</code><code>)</code>
<code> </code><code>messages[</code><code>'cluster.messages_ready'</code><code>] = cluster.</code><code>get</code><code>(</code><code>'queue_totals'</code><code>, {}).</code><code>get</code><code>(</code><code>'messages_ready'</code><code>,0)</code>
<code> </code><code>messages[</code><code>'cluster.messages_unacknowledged'</code><code>] = cluster.</code><code>get</code><code>(</code>
<code> </code><code>'queue_totals'</code><code>, {}).</code><code>get</code><code>(</code><code>'messages_unacknowledged'</code><code>, 0)</code>
<code> </code><code>messages[</code><code>'cluster.messages_deliver_get'</code><code>] = </code><code>float</code><code>(format(cluster.</code><code>get</code><code>(</code><code>'message_stats'</code><code>, {}).</code><code>get</code><code>(</code>
<code> </code><code>'deliver_get_details'</code><code>,{}).</code><code>get</code><code>(</code><code>'rate'</code><code>,0),</code><code>'.2f'</code><code>))</code>
<code> </code><code>messages[</code><code>'cluster.messages_publish'</code><code>] = </code><code>float</code><code>(format(cluster.</code><code>get</code><code>(</code><code>'message_stats'</code><code>, {}).</code><code>get</code><code>(</code>
<code> </code><code>'publish_details'</code><code>,{}).</code><code>get</code><code>(</code><code>'rate'</code><code>, 0), </code><code>'.2f'</code><code>))</code>
<code> </code><code>messages[</code><code>'cluster.messages_redeliver'</code><code>] = </code><code>float</code><code>(format(cluster.</code><code>get</code><code>(</code><code>'message_stats'</code><code>, {}).</code><code>get</code><code>(</code>
<code> </code><code>'redeliver_details'</code><code>,{}).</code><code>get</code><code>(</code><code>'rate'</code><code>, 0), </code><code>'.2f'</code><code>))</code>
<code> </code><code>messages[</code><code>'cluster.messages_ack'</code><code>] = </code><code>float</code><code>(format(cluster.</code><code>get</code><code>(</code><code>'message_stats'</code><code>,{}).</code><code>get</code><code>(</code>
<code> </code><code>'ack_details'</code><code>,{}).</code><code>get</code><code>(</code><code>'rate'</code><code>,0), </code><code>'.2f'</code><code>))</code>
<code> </code><code>return</code> <code>messages</code>
<code> </code><code>def get_nodes_details(self):</code>
<code> </code><code>detail = defaultdict(</code><code>float</code><code>)</code>
<code> </code><code>for</code> <code>node </code><code>in</code> <code>self.call_api(</code><code>'nodes'</code><code>):</code>
<code> </code><code>name = node[</code><code>'name'</code><code>].split(</code><code>'@'</code><code>)[1]</code>
<code> </code><code>if</code> <code>name == self.hostname.split(</code><code>'.'</code><code>)[0]:</code>
<code> </code><code>detail[</code><code>'nodes.proc_used'</code><code>] = node[</code><code>'proc_used'</code><code>]</code>
<code> </code><code>detail[</code><code>'nodes.proc_total'</code><code>] = node[</code><code>'proc_total'</code><code>]</code>
<code> </code><code>detail[</code><code>'nodes.proc_used_ratio'</code><code>] =format(</code>
<code> </code><code>node[</code><code>'proc_used'</code><code>]/</code><code>float</code><code>(node[</code><code>'proc_total'</code><code>]) * 100, </code><code>'.2f'</code><code>)</code>
<code> </code><code>detail[</code><code>'nodes.fd_used'</code><code>] = node[</code><code>'fd_used'</code><code>]</code>
<code> </code><code>detail[</code><code>'nodes.fd_total'</code><code>] = node[</code><code>'fd_total'</code><code>]</code>
<code> </code><code>detail[</code><code>'nodes.fd_used_ratio'</code><code>] = format(</code>
<code> </code><code>node[</code><code>'fd_used'</code><code>]/</code><code>float</code><code>(node[</code><code>'fd_total'</code><code>]) * 100, </code><code>'.2f'</code><code>)</code>
<code> </code><code>detail[</code><code>'nodes.sockets_used'</code><code>] = node[</code><code>'sockets_used'</code><code>]</code>
<code> </code><code>detail[</code><code>'nodes.sockets_total'</code><code>] = node[</code><code>'sockets_total'</code><code>]</code>
<code> </code><code>detail[</code><code>'nodes.sockets_used_ratio'</code><code>] = format(</code>
<code> </code><code>node[</code><code>'sockets_used'</code><code>]/</code><code>float</code><code>(node[</code><code>'sockets_total'</code><code>]) * 100, </code><code>'.2f'</code><code>)</code>
<code> </code><code>detail[</code><code>'nodes.mem_used'</code><code>] = format(</code>
<code> </code><code>node[</code><code>'mem_used'</code><code>]/1024.0/1024.0,</code><code>'.2f'</code><code>)</code>
<code> </code><code>detail[</code><code>'nodes.mem_limit'</code><code>] = format(</code>
<code> </code><code>node[</code><code>'mem_limit'</code><code>]/1024.0/1024.0,</code><code>'.2f'</code><code>)</code>
<code> </code><code>detail[</code><code>'nodes.mem_used_ratio'</code><code>] = format(</code>
<code> </code><code>node[</code><code>'mem_used'</code><code>]/</code><code>float</code><code>(node[</code><code>'mem_limit'</code><code>]) * 100, </code><code>'.2f'</code><code>)</code>
<code> </code><code>detail[</code><code>'nodes.disk_free'</code><code>] = format(</code>
<code> </code><code>node[</code><code>'disk_free'</code><code>]/1024.0/1024.0/1024.0,</code><code>'.2f'</code><code>)</code>
<code> </code><code>detail[</code><code>'nodes.disk_free_limit'</code><code>] = format(</code>
<code> </code><code>node[</code><code>'disk_free_limit'</code><code>]/1024.0/1024.0/1024.0,</code><code>'.2f'</code><code>)</code>
<code> </code><code>detail[</code><code>'nodes.disk_free_ratio'</code><code>] = format(</code>
<code> </code><code>node[</code><code>'disk_free'</code><code>]/</code><code>float</code><code>(node[</code><code>'disk_free_limit'</code><code>]), </code><code>'.2f'</code><code>)</code>
<code> </code><code>return</code> <code>detail</code>
<code> </code><code>def get_channels_details(self):</code>
<code> </code><code>channels = defaultdict(</code><code>float</code><code>)</code>
<code> </code><code>for</code> <code>channel </code><code>in</code> <code>self.call_api(</code><code>'channels'</code><code>):</code>
<code> </code><code>channels[</code><code>'cluster.channels'</code><code>] += 1</code>
<code> </code><code>name = channel[</code><code>'node'</code><code>].split(</code><code>'@'</code><code>)[1]</code>
<code> </code><code>channels[</code><code>'nodes.channels'</code><code>] += 1</code>
<code> </code><code>if</code> <code>'nodes.channels_blocked'</code> <code>not </code><code>in</code> <code>channels:</code>
<code> </code><code>channels[</code><code>'nodes.channels_blocked'</code><code>] = 0</code>
<code> </code><code>if</code> <code>'client_flow_blocked'</code> <code>in</code> <code>channel and channel[</code><code>'client_flow_blocked'</code><code>]:</code>
<code> </code><code>channels[</code><code>'nodes.channels_blocked'</code><code>] += 1</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>channels[</code><code>'nodes.channels_blocked'</code><code>] += 0</code>
<code> </code><code>channels[</code><code>'nodes.messages_ack'</code><code>] += </code><code>float</code><code>(format(channel.</code><code>get</code><code>(</code>
<code> </code><code>'message_stats'</code><code>,{}).</code><code>get</code><code>(</code><code>'ack_details'</code><code>,{}).</code><code>get</code><code>(</code><code>'rate'</code><code>,0), </code><code>'.2f'</code><code>))</code>
<code> </code><code>channels[</code><code>'nodes.messages_deliver_get'</code><code>] += </code><code>float</code><code>(format(channel.</code><code>get</code><code>(</code>
<code> </code><code>'message_stats'</code><code>,{}).</code><code>get</code><code>(</code><code>'deliver_get_details'</code><code>,{}).</code><code>get</code><code>(</code><code>'rate'</code><code>,0), </code><code>'.2f'</code><code>))</code>
<code> </code><code>channels[</code><code>'nodes.messages_redeliver'</code><code>] += </code><code>float</code><code>(format(channel.</code><code>get</code><code>(</code>
<code> </code><code>'message_stats'</code><code>,{}).</code><code>get</code><code>(</code><code>'redeliver_details'</code><code>,{}).</code><code>get</code><code>(</code><code>'rate'</code><code>,0), </code><code>'.2f'</code><code>))</code>
<code> </code><code>channels[</code><code>'nodes.messages_publish'</code><code>] += </code><code>float</code><code>(format(channel.</code><code>get</code><code>(</code>
<code> </code><code>'message_stats'</code><code>,{}).</code><code>get</code><code>(</code><code>'publish_details'</code><code>,{}).</code><code>get</code><code>(</code><code>'rate'</code><code>,0), </code><code>'.2f'</code><code>))</code>
<code> </code><code>return</code> <code>channels</code>
<code> </code><code>def get_queues_details(self):</code>
<code> </code><code>queues = defaultdict(</code><code>int</code><code>)</code>
<code> </code><code>max_queue_message_ready = 0</code>
<code> </code><code>max_queue_message_ready_queue = </code><code>''</code>
<code> </code><code>max_queue_message_unack = 0</code>
<code> </code><code>max_queue_message_unack_queue = </code><code>''</code>
<code> </code><code>for</code> <code>queue </code><code>in</code> <code>self.call_api(</code><code>'queues'</code><code>):</code>
<code> </code><code>queues[</code><code>'cluster.queues'</code><code>] += 1</code>
<code> </code><code>queues[</code><code>'cluster.consumers'</code><code>] += queue[</code><code>'consumers'</code><code>]</code>
<code> </code><code>vhost_name = queue[</code><code>'vhost'</code><code>].replace(</code><code>'.'</code><code>, </code><code>'-'</code><code>)</code>
<code> </code><code>if</code> <code>vhost_name == </code><code>'/'</code><code>:</code>
<code> </code><code>vhost_name = </code><code>'default'</code>
<code> </code><code>node_name = queue[</code><code>'node'</code><code>].split(</code><code>'@'</code><code>)[1]</code>
<code> </code><code>queue_name = queue[</code><code>'name'</code><code>].replace(</code><code>'.'</code><code>, </code><code>'-'</code><code>)</code>
<code> </code><code>if</code> <code>node_name == self.hostname.split(</code><code>'.'</code><code>)[0]:</code>
<code> </code><code>queues[</code><code>'nodes.consumers'</code><code>] += queue[</code><code>'consumers'</code><code>]</code>
<code> </code><code>queues[</code><code>'nodes.queues'</code><code>] += 1</code>
<code> </code><code>queues[</code><code>'nodes.messages_ready'</code><code>] += \</code>
<code> </code><code>queue.</code><code>get</code><code>(</code><code>'messages_ready'</code><code>, 0)</code>
<code> </code><code>queues[</code><code>'nodes.messages_unacknowledged'</code><code>] += \</code>
<code> </code><code>queue.</code><code>get</code><code>(</code><code>'messages_unacknowledged'</code><code>,0)</code>
<code> </code><code>queues[</code><code>'queues_'</code> <code>+ vhost_name + </code><code>'_'</code> <code>+ queue_name + </code><code>'.messages_ready'</code><code>] = \</code>
<code> </code><code>queue.</code><code>get</code><code>(</code><code>'messages_ready'</code><code>,0)</code>
<code> </code><code>if</code> <code>queue.</code><code>get</code><code>(</code><code>'messages_ready'</code><code>, 0) >= max_queue_message_ready:</code>
<code> </code><code>max_queue_message_ready = queue.</code><code>get</code><code>(</code><code>'messages_ready'</code><code>,0)</code>
<code> </code><code>max_queue_message_ready_queue = queue_name</code>
<code> </code><code>queues[</code><code>'queues_'</code> <code>+ vhost_name + </code><code>'_'</code> <code>+ queue_name + </code><code>'.messages_unacknowledged'</code><code>] = \</code>
<code> </code><code>queue.</code><code>get</code><code>(</code><code>'messages_unacknowledged'</code><code>, 0)</code>
<code> </code><code>if</code> <code>queue.</code><code>get</code><code>(</code><code>'messages_unacknowledged'</code><code>,0) >= max_queue_message_unack:</code>
<code> </code><code>max_queue_message_unack = queue.</code><code>get</code><code>(</code><code>'messages_unacknowledged'</code><code>, 0)</code>
<code> </code><code>max_queue_message_unack_queue = queue_name</code>
<code> </code><code>queues[</code><code>'queues_'</code> <code>+ vhost_name + </code><code>'_'</code> <code>+ queue_name + </code><code>'.messages_ack'</code><code>] = </code><code>float</code><code>(format(queue.</code><code>get</code><code>(</code>
<code> </code><code>'message_stats'</code><code>,{}).</code><code>get</code><code>(</code><code>'ack_details'</code><code>,{}).</code><code>get</code><code>(</code><code>'rate'</code><code>,0), </code><code>'.2f'</code><code>))</code>
<code> </code><code>queues[</code><code>'queues_'</code> <code>+ vhost_name + </code><code>'_'</code> <code>+ queue_name + </code><code>'.messages_deliver_get'</code><code>] = </code><code>float</code><code>(format(queue.</code><code>get</code><code>(</code>
<code> </code><code>'message_stats'</code><code>,{}).</code><code>get</code><code>(</code><code>'deliver_get_details'</code><code>,{}).</code><code>get</code><code>(</code><code>'rate'</code><code>,0), </code><code>'.2f'</code><code>))</code>
<code> </code><code>queues[</code><code>'queues_'</code> <code>+ vhost_name + </code><code>'_'</code> <code>+ queue_name + </code><code>'.messages_publish'</code><code>] = </code><code>float</code><code>(format(queue.</code><code>get</code><code>(</code>
<code> </code><code>'message_stats'</code><code>,{}).</code><code>get</code><code>(</code><code>'publish_details'</code><code>,{}).</code><code>get</code><code>(</code><code>'rate'</code><code>,0), </code><code>'.2f'</code><code>))</code>
<code> </code><code>queues[</code><code>'queues_'</code> <code>+ vhost_name + </code><code>'_'</code> <code>+ queue_name + </code><code>'.messages_redeliver'</code><code>] = </code><code>float</code><code>(format(queue.</code><code>get</code><code>(</code>
<code> </code><code>'message_stats'</code><code>,{}).</code><code>get</code><code>(</code><code>'redeliver_details'</code><code>,{}).</code><code>get</code><code>(</code><code>'rate'</code><code>,0), </code><code>'.2f'</code><code>))</code>
<code> </code><code>queues[</code><code>'queues_max-queue-message-ready'</code><code>] = max_queue_message_ready</code>
<code> </code><code>queues[</code><code>'queues_max-queue-message-ready-queue'</code><code>] = max_queue_message_ready_queue</code>
<code> </code><code>queues[</code><code>'queues_max-queue-message-unack'</code><code>] = max_queue_message_unack</code>
<code> </code><code>queues[</code><code>'queues_max-queue-message-unack-queue'</code><code>] = max_queue_message_unack_queue</code>
<code> </code><code>return</code> <code>queues</code>
<code> </code><code>def get_connections_details(self):</code>
<code> </code><code>connections = defaultdict(</code><code>int</code><code>)</code>
<code> </code><code>for</code> <code>connection </code><code>in</code> <code>self.call_api(</code><code>'connections'</code><code>):</code>
<code> </code><code>connections[</code><code>'cluster.connections'</code><code>] += 1</code>
<code> </code><code>node_name = connection[</code><code>'node'</code><code>].split(</code><code>'@'</code><code>)[1]</code>
<code> </code><code>connections[</code><code>'nodes.connections'</code><code>] += 1</code>
<code> </code><code>key = </code><code>'nodes.connections_blocked'</code>
<code> </code><code>if</code> <code>key not </code><code>in</code> <code>connections:</code>
<code> </code><code>connections[key] = 0</code>
<code> </code><code>if</code> <code>'last_blocked_age'</code> <code>in</code> <code>connection and \</code>
<code> </code><code>connection[</code><code>'last_blocked_age'</code><code>] != </code><code>'infinity'</code> <code>and \</code>
<code> </code><code>connection[</code><code>'last_blocked_age'</code><code>] <= self.stat_interval:</code>
<code> </code><code>connections[key] += 1</code>
<code> </code><code>connections[key] += 0</code>
<code> </code><code>return</code> <code>connections</code>
<code> </code><code>def get_bindings_details(self):</code>
<code> </code><code>bindings = defaultdict(</code><code>int</code><code>)</code>
<code> </code><code>for</code> <code>binding </code><code>in</code> <code>self.call_api(</code><code>'bindings'</code><code>):</code>
<code> </code><code>bindings[</code><code>'cluster.bindings'</code><code>] += 1</code>
<code> </code><code>return</code> <code>bindings</code>
<code> </code><code>def get_stats(self):</code>
<code> </code><code>stats = {}</code>
<code> </code><code>stats.update(self.get_message_details())</code>
<code> </code><code>stats.update(self.get_nodes_details())</code>
<code> </code><code>stats.update(self.get_channels_details())</code>
<code> </code><code>stats.update(self.get_queues_details())</code>
<code> </code><code>stats.update(self.get_connections_details())</code>
<code> </code><code>stats.update(self.get_bindings_details())</code>
<code> </code><code>return</code> <code>stats</code>
<code>if</code> <code>__name__ == </code><code>'__main__'</code><code>:</code>
<code> </code><code># </code><code>set</code> <code>zabix server</code>
<code> </code><code>zabbix = </code><code>'zabbix.test.com'</code>
<code> </code><code>sender = ZabbixSender(zabbix)</code>
<code> </code><code># monitor key</code>
<code> </code><code>host = sys.argv[1]</code>
<code> </code><code>port = sys.argv[2]</code>
<code> </code><code># gethostname </code><code>if</code> <code>ip</code>
<code> </code><code>ipr = re.compile(r</code><code>'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'</code><code>)</code>
<code> </code><code>if</code> <code>ipr.match(host):</code>
<code> </code><code>result = socket.gethostbyaddr(host)</code>
<code> </code><code>host = result[0]</code>
<code> </code><code>if</code> <code>re.search(</code><code>'.'</code><code>, host):</code>
<code> </code><code>host = host.split(</code><code>'.'</code><code>)[0]</code>
<code> </code><code>api = RabbitMQAPI(username=</code><code>'zabbix'</code><code>, password=</code><code>'zabbix'</code><code>,hostname=host, port=port)</code>
<code> </code><code>stats = api.get_stats()</code>
<code> </code><code>for</code> <code>key </code><code>in</code> <code>stats:</code>
<code> </code><code>sender.AddData(host,</code><code>"rabbitmq_"</code><code>+key, stats[key])</code>
<code> </code><code>sender.Send()</code>
<code> </code><code>print 1</code>
rbl.check
<code>#!/usr/bin/env python</code>
<code>#fileencoding: utf-8</code>
<code>#Author: </code>
<code>from</code> <code>rblwatch import RBLSearch</code>
<code>ip = sys.argv[1]</code>
<code># Do the lookup (for smtp.gmail.com)</code>
<code>searcher = RBLSearch(ip)</code>
<code># Display a simply formatted report of the results</code>
<code>results = searcher.get_results()</code>
<code>if</code> <code>results == </code><code>"DNSBL Report"</code><code>:</code>
<code> </code><code>print 0</code>
<code>else</code><code>:</code>
<code> </code><code>print results</code>
<code># Use the result data for something else</code>
<code>#result_data = searcher.listed</code>
本文轉自Tenderrain 51CTO部落格,原文連結:http://blog.51cto.com/tenderrain/1966611,如需轉載請自行聯系原作者