root / plugins / powermta / pmta_ @ 942bda31
Historique | Voir | Annoter | Télécharger (8,73 ko)
| 1 | e5ecd263 | azet | #!/bin/sh |
|---|---|---|---|
| 2 | ####################################################################################################################### |
||
| 3 | # |
||
| 4 | # = PowerMTA Munin multi-monitor = |
||
| 5 | # |
||
| 6 | # -- developer: aaron.zauner@emarsys.com |
||
| 7 | # -- start date: 11.11.2011 |
||
| 8 | # |
||
| 9 | # |
||
| 10 | # = LICENSE = |
||
| 11 | # |
||
| 12 | # Copyright (c) 2011, emarsys eMarketing Systems AG |
||
| 13 | # All rights reserved. |
||
| 14 | # |
||
| 15 | # Redistribution and use in source and binary forms, with or without modification, are permitted provided that |
||
| 16 | # the following conditions are met: |
||
| 17 | # |
||
| 18 | # Redistributions of source code must retain the above copyright notice, this list of conditions and the |
||
| 19 | # following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list |
||
| 20 | # of conditions and the following disclaimer in the documentation and/or other materials provided with the |
||
| 21 | # distribution. Neither the name of the emarsys eMarketing Systems AG nor the names of its contributors may |
||
| 22 | # be used to endorse or promote products derived from this software without specific prior written permission. |
||
| 23 | # |
||
| 24 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, |
||
| 25 | # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
||
| 26 | # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||
| 27 | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
||
| 28 | # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||
| 29 | # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE |
||
| 30 | # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||
| 31 | # |
||
| 32 | # |
||
| 33 | ####################################################################################################################### |
||
| 34 | # |
||
| 35 | # -> "xpath" cli tool required (ships with your linux distribution) |
||
| 36 | # -> install: |
||
| 37 | # |
||
| 38 | # o check config (/etc/munin/plugin-conf.d) set "env.REMOTEHOST" and "env.PORT", e.g.: |
||
| 39 | # [pmta*] |
||
| 40 | # env.REMOTEHOST 127.0.0.1 |
||
| 41 | # env.PORT 8080 |
||
| 42 | # |
||
| 43 | # o chmod +x pmta_ |
||
| 44 | # |
||
| 45 | # o link: |
||
| 46 | # lrwxrwxrwx 1 root root 5 2011-11-14 14:52 pmta_traffic_in -> pmta_ |
||
| 47 | # lrwxrwxrwx 1 root root 5 2011-11-14 14:52 pmta_traffic_out -> pmta_ |
||
| 48 | # lrwxrwxrwx 1 root root 5 2011-11-14 14:52 pmta_conn_in -> pmta_ |
||
| 49 | # lrwxrwxrwx 1 root root 5 2011-11-14 14:52 pmta_conn_out -> pmta_ |
||
| 50 | # lrwxrwxrwx 1 root root 5 2011-11-14 14:52 pmta_queue_domains -> pmta_ |
||
| 51 | # lrwxrwxrwx 1 root root 5 2011-11-14 14:52 pmta_queue_recipients -> pmta_ |
||
| 52 | # lrwxrwxrwx 1 root root 5 2011-11-14 14:52 pmta_queue_megabytes -> pmta_ |
||
| 53 | # lrwxrwxrwx 1 root root 5 2011-11-15 16:31 pmta_top_domains -> pmta_ |
||
| 54 | # |
||
| 55 | # o alternative multi-host configuration: |
||
| 56 | # you can also link the pmta_ script to various hosts and configure munin to respond |
||
| 57 | # to multiple REMOTEHOSTs, just link pmta_ in this schema and configure munin |
||
| 58 | # accordingly - DO NOT USE DOTS IN YOUR IDENTIFIER VARIABLE, USE UNDERSCORE INSTEAD! |
||
| 59 | # for example: |
||
| 60 | # lrwxrwxrwx 1 root root 5 2011-11-18 12:18 mailhost1_domain_com_pmta_top_domains -> pmta_ |
||
| 61 | # lrwxrwxrwx 1 root root 5 2011-11-18 12:18 mailhost2_domain_com_pmta_top_domains -> pmta_ |
||
| 62 | # lrwxrwxrwx 1 root root 5 2011-11-18 12:18 mailhost3_domain_com_pmta_top_domains -> pmta_ |
||
| 63 | # lrwxrwxrwx 1 root root 5 2011-11-18 12:18 mailhost4_domain_com_pmta_top_domains -> pmta_ |
||
| 64 | # [...] |
||
| 65 | # |
||
| 66 | # conf.: |
||
| 67 | # [mailhost1_domain_com_pmta*] |
||
| 68 | # env.REMOTEHOST somehostORip |
||
| 69 | # env.PORT portnumber |
||
| 70 | # [mailhost2_domain_com_pmta*] |
||
| 71 | # env.REMOTEHOST someotherhostORip |
||
| 72 | # env.PORT portnumber |
||
| 73 | # [...] |
||
| 74 | # |
||
| 75 | # o restart munin. |
||
| 76 | # |
||
| 77 | ################################################################################################################### |
||
| 78 | # debug (munin-run --pidebug --debug <script>): |
||
| 79 | if [ "$MUNIN_DEBUG" = "1" ]; then |
||
| 80 | set -vx |
||
| 81 | fi |
||
| 82 | |||
| 83 | NAME_SELF=`basename ${0}`
|
||
| 84 | trap 'echo "\n$NAME_SELF - >> interrupt. \n$NAME_SELF - >> exiting."' 1 2 9 11 15 |
||
| 85 | |||
| 86 | if [ -z "${REMOTEHOST}" ] || [ -z "${PORT}" ]; then
|
||
| 87 | echo "\n$NAME_SELF - >> no enviroment variable set for host and/or port. \n$NAME_SELF - >> exiting." |
||
| 88 | exit 1 |
||
| 89 | fi |
||
| 90 | |||
| 91 | fetch_xml() {
|
||
| 92 | # o arg1 specifies xpath or false |
||
| 93 | # o arg2 specifies sed/regex or false |
||
| 94 | # o arg3 specifies category ('status', 'domains',..) or false
|
||
| 95 | HTTPQUERY="GET /${3}?format=xml HTTP/1.1\n\n"
|
||
| 96 | REMOTE=`echo ${HTTPQUERY} | nc -q 1 -w 5 ${REMOTEHOST} ${PORT} | tail -1`
|
||
| 97 | XML_DATA=${REMOTE}
|
||
| 98 | SED="s/.*<$2>\([^<]*\)<\/$2>.*/\1/p" |
||
| 99 | |||
| 100 | if [ "$3" = "status" ]; then |
||
| 101 | RET=`echo $XML_DATA | xpath -q -e $1 | sed -n $SED | cut -f1 -d '.'` |
||
| 102 | elif [ "$3" = "domains" ]; then |
||
| 103 | RET=`echo $XML_DATA | xpath -q -e '//domain/*[self::name or self::rcp]' | sed 's/<[^>]*>//g' | sed 's/\./_/g'` |
||
| 104 | fi |
||
| 105 | |||
| 106 | if [ "$RET" ]; then |
||
| 107 | echo $RET |
||
| 108 | return 0 |
||
| 109 | else |
||
| 110 | echo 'no_result' |
||
| 111 | return 1 |
||
| 112 | fi |
||
| 113 | } |
||
| 114 | |||
| 115 | case $NAME_SELF in |
||
| 116 | *pmta_traffic_in | *pmta_traffic_out) |
||
| 117 | if [ `expr match "$NAME_SELF" ".*pmta_traffic_in"` != 0 ]; then |
||
| 118 | WHAT="in" |
||
| 119 | elif [ `expr match "$NAME_SELF" ".*pmta_traffic_out"` != 0 ]; then |
||
| 120 | WHAT="out" |
||
| 121 | fi |
||
| 122 | CONF_TITLE="powermta ${WHAT}bound traffic"
|
||
| 123 | CONF_LABEL="traffic_${WHAT}"
|
||
| 124 | CONF_SELF="traffic_${WHAT}bound"
|
||
| 125 | |||
| 126 | if [ -z $1 ]; then |
||
| 127 | GET=`fetch_xml //traffic//lastMin/${WHAT} kb status`
|
||
| 128 | RETURN=`echo $GET / 1024 | bc` |
||
| 129 | RCPT=`fetch_xml //traffic//lastMin/${WHAT} rcp status`
|
||
| 130 | MSGS=`fetch_xml //traffic//lastMin/${WHAT} msg status`
|
||
| 131 | echo "megabytes.value $RETURN" |
||
| 132 | echo "recipients.value $RCPT" |
||
| 133 | echo "messages.value $MSGS" |
||
| 134 | exit 0 |
||
| 135 | elif [ $1 = config ]; then |
||
| 136 | echo "megabytes.label megabytes" |
||
| 137 | echo "megabytes.draw AREA" |
||
| 138 | echo "megabytes.colour 0000A0" |
||
| 139 | echo "recipients.label recipients" |
||
| 140 | echo "recipients.draw STACK" |
||
| 141 | echo "recipients.colour FF0000" |
||
| 142 | echo "messages.label messages" |
||
| 143 | echo "messages.draw STACK" |
||
| 144 | echo "messages.colour FF6F00" |
||
| 145 | AUTOLABEL="no" |
||
| 146 | fi |
||
| 147 | ;; |
||
| 148 | *pmta_conn_in | *pmta_conn_out) |
||
| 149 | if [ `expr match "$NAME_SELF" ".*pmta_conn_in"` != 0 ]; then |
||
| 150 | WHAT="In" |
||
| 151 | elif [ `expr match "$NAME_SELF" ".*pmta_conn_out"` != 0 ]; then |
||
| 152 | WHAT="Out" |
||
| 153 | fi |
||
| 154 | CONF_TITLE=`echo "powermta ${WHAT}bound connections" | tr [:upper:] [:lower:]`
|
||
| 155 | CONF_LABEL=`echo "conn_${WHAT}" | tr [:upper:] [:lower:]`
|
||
| 156 | CONF_SELF=`echo "connections_${WHAT}bound" | tr [:upper:] [:lower:]`
|
||
| 157 | if [ -z $1 ]; then |
||
| 158 | GET=`fetch_xml //conn//smtp${WHAT} cur status`
|
||
| 159 | echo "${CONF_SELF}.value $GET"
|
||
| 160 | exit 0 |
||
| 161 | elif [ $1 = config ]; then |
||
| 162 | echo "${CONF_SELF}.label ${WHAT}bound connections"
|
||
| 163 | echo "${CONF_SELF}.draw LINE1"
|
||
| 164 | echo "${CONF_SELF}.colour FF0000"
|
||
| 165 | AUTOLABEL="no" |
||
| 166 | fi |
||
| 167 | ;; |
||
| 168 | *pmta_queue_domains | *pmta_queue_recipients | *pmta_queue_megabytes) |
||
| 169 | if [ `expr match "$NAME_SELF" ".*pmta_queue_domains"` != 0 ]; then |
||
| 170 | WHAT="domains" |
||
| 171 | elif [ `expr match "$NAME_SELF" ".*pmta_queue_recipients"` != 0 ]; then |
||
| 172 | WHAT="recipients" |
||
| 173 | elif [ `expr match "$NAME_SELF" ".*pmta_queue_megabytes"` != 0 ]; then |
||
| 174 | WHAT="megabytes" |
||
| 175 | UNIT_KB="true" |
||
| 176 | fi |
||
| 177 | CONF_TITLE="powermta ${WHAT} in queue"
|
||
| 178 | CONF_LABEL="queue_${WHAT}"
|
||
| 179 | CONF_SELF="${WHAT}"
|
||
| 180 | |||
| 181 | if [ -z $1 ]; then |
||
| 182 | if [ !$UNIT_KB ]; then |
||
| 183 | GET=`fetch_xml //queue/smtp dom status` |
||
| 184 | echo "${CONF_SELF}.value $GET"
|
||
| 185 | exit 0 |
||
| 186 | else |
||
| 187 | GET=`fetch_xml //queue/smtp kb status` |
||
| 188 | RETURN=`echo $GET / 1024 | bc` |
||
| 189 | echo "${CONF_SELF}.value $RETURN"
|
||
| 190 | exit 0 |
||
| 191 | fi |
||
| 192 | fi |
||
| 193 | ;; |
||
| 194 | *pmta_top_domains) |
||
| 195 | CONF_TITLE="powermta top 10 domains by recipients" |
||
| 196 | CONF_LABEL="top_domains" |
||
| 197 | CONF_SELF="domains" |
||
| 198 | AUTOLABEL="no" |
||
| 199 | |||
| 200 | GET=`fetch_xml false false domains` |
||
| 201 | if [ -z $1 ]; then |
||
| 202 | for values in $GET; do |
||
| 203 | if [ $values -ge 0 2>/dev/null ]; then |
||
| 204 | echo $values |
||
| 205 | else |
||
| 206 | echo -n "$values.value#" |
||
| 207 | fi |
||
| 208 | done | tr ' ' '\n' | tr '#' ' ' # restore newline - replace hashtag with whitespace |
||
| 209 | exit 0 |
||
| 210 | elif [ $1 = config ]; then |
||
| 211 | for values in $GET; do |
||
| 212 | [ $values -ge 0 2>/dev/null ] || echo "$values.label $values\n$values.draw LINE2" |
||
| 213 | done |
||
| 214 | fi |
||
| 215 | ;; |
||
| 216 | esac |
||
| 217 | |||
| 218 | case $1 in |
||
| 219 | suggest) |
||
| 220 | if [ $NAME_SELF = "pmta_" ]; then |
||
| 221 | # suggest plugins to munin: |
||
| 222 | echo "traffic_in\ntraffic_out\nconn_in\nconn_out\nqueue_domains\nqueue_recipients\nqueue_megabytes\ntop_domains" |
||
| 223 | exit 0 |
||
| 224 | fi |
||
| 225 | ;; |
||
| 226 | config) |
||
| 227 | if [ -n "$CONF_TITLE" ] && [ -n "$CONF_LABEL" ]; then |
||
| 228 | echo "graph_category PowerMTA" |
||
| 229 | echo "graph_title $CONF_TITLE on ${REMOTEHOST}"
|
||
| 230 | echo "graph_vlabel $CONF_LABEL" |
||
| 231 | echo "graph_scale yes" |
||
| 232 | echo "graph_width 1400" |
||
| 233 | echo "graph_height 450" |
||
| 234 | echo "graph_args --step 10 --rigid --base 1000 -l 0" |
||
| 235 | if [ "$AUTOLABEL" != "no" ]; then |
||
| 236 | echo "${CONF_SELF}.label $CONF_LABEL"
|
||
| 237 | echo "${CONF_SELF}.draw AREA"
|
||
| 238 | echo "${CONF_SELF}.colour FF6F00"
|
||
| 239 | fi |
||
| 240 | fi |
||
| 241 | exit 0 |
||
| 242 | ;; |
||
| 243 | autoconf) |
||
| 244 | # tell munin this script supports autoconfiguration: |
||
| 245 | echo "yes" |
||
| 246 | ;; |
||
| 247 | *) |
||
| 248 | exit 1 |
||
| 249 | ;; |
||
| 250 | esac |
||
| 251 | #EOF |
