Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

file 203 lines (174 sloc) 5.676 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
# -*- sh -*-
# Support functions for shell munin plugins
#

clean_fieldname () {
    # Clean up field name so it complies with munin requirements.
    # Even though most versions of munin sanitises field names
    # this at least avoids getting .s in field names which will
    # very much still break munin.
    #
    # usage: name="$(clean_fieldname "$item")"

    # "root" is *not* allowed due to a 2.0 bug
    echo "$@" | sed -e 's/^[^A-Za-z_]/_/' -e 's/[^A-Za-z0-9_]/_/g' -e 's/^root$/__root/'
}


# Look up warning environment variables. Takes these two options:
# $1 = field name
# $2 = optional override of environment variable name
#
# Checks for "$2" in the environment, then "$1_warning", then "warning"

get_warning () {
    # Skip $2 if it isn't defined
    if [ -n "$2" ]; then
        local warntmp=$(eval "echo \$$2")
        if [ -n "$warntmp" ]; then
            echo "${warntmp}"
            return
        fi
    fi
    local warntmp=$(eval "echo \$${1}_warning")
    if [ -n "$warntmp" ]; then
        echo "${warntmp}"
        return
    fi
    local warntmp=$warning
    if [ -n "$warntmp" ]; then
        echo "${warntmp}"
        return
    fi
}


# Usage:
# warning=${warning:-92}
# print_warning "$name"

print_warning () {
    warnout=$(get_warning $1 $2)
    if [ -n "${warnout}" ]; then
        echo "${1}.warning ${warnout}"
    fi
}

# Ditto for critical values

get_critical () {
    # Skip $2 if it isn't defined
    if [ -n "$2" ]; then
        local crittmp=$(eval "echo \$$2")
        if [ -n "$crittmp" ]; then
            echo "${crittmp}"
            return
        fi
    fi
    local crittmp=$(eval "echo \$${1}_critical")
    if [ -n "$crittmp" ]; then
        echo "${crittmp}"
        return
    fi
    local crittmp=$critical
    if [ -n "$crittmp" ]; then
        echo "${crittmp}"
        return
    fi
}

print_critical () {
    critout=$(get_critical $1 $2)
    if [ -n "${critout}" ]; then
        echo "${1}.critical ${critout}"
    fi
}

# adjust_threshold() takes a threshold string and a base value in, and returns
# the threshold string adjusted for percentages if percent sizes are present.
# If not, the threshold is left unchanged.
# Usage:
# adjust_threshold "50%:50%" 200
# Returns:
# 100:100
#
adjust_threshold () {

    if [ -n "$1" -a -n "$2" ]; then
        echo "$1" | awk "BEGIN { FS=\":\"; OFS=\":\" }
        \$1 ~ /.*%/ {\$1 = $2 * substr(\$1, 0, length(\$1) - 1) / 100}
        \$2 ~ /.*%/ {\$2 = $2 * substr(\$2, 0, length(\$2) - 1) / 100}

        { print }"
    fi

}

# print_thresholds() takes three arguments. The first is the field name, the
# second is the default environment variable for warnings (see the second
# argument to get_warning), and the third is the default environment variable
# for criticals (see the second argument to get_critical).
#
# This is a convenience function for plugins that don't need to do anything
# special for warnings vs criticals.
#
# Usage:
# warning='20' critical='40' print_thresholds user
# Returns:
# user.warning 20
# user.critical 40

print_thresholds() {
    print_warning $1 $2
    print_critical $1 $3
}

# print_adjusted_thresholds() takes four arguments. The first is the field
# name, the second is the base value (see the second argument to
# adjust_threshold), the third is the default environment variable for
# warnings (see the second argument to get_warning), and the fourth is the
# default environment variable for criticals (see the second argument to
# get_critical).
#
# Usage:
# warning=20% critical=40% print_adjusted_thresholds "user" 800
# Returns:
# user.warning 160
# user.critical 320
#
print_adjusted_thresholds () {
    tempthresh=$(get_warning $1 $3)
    if [ -n "$tempthresh" ]; then
        echo "$1.warning $(adjust_threshold "$tempthresh" "$2")"
    fi
    tempthresh=$(get_critical $1 $4)
    if [ -n "$tempthresh" ]; then
        echo "$1.critical $(adjust_threshold "$tempthresh" "$2")"
    fi
    unset tempthresh
}



is_multigraph () {
    # Multigraph feature is available in Munin 1.4.0 and later.
    # But it also needs support on the node to stay perfectly
    # compatible with old munin-masters.
    #
    # Using this procedure at the start of a multigraph plugin makes
    # sure it does not interact with old node installations at all
    # and thus does not break anything.
    #
    case $MUNIN_CAP_MULTIGRAPH:$1 in
    1:*) return;; # Yes! Rock and roll!
    *:autoconf)
        echo 'no (no multigraph support)'
        exit 0
        ;;

    *:config)
        echo 'graph_title This plugin needs multigraph support'
        echo 'multigraph.label No multigraph here'
        echo 'multigraph.info This plugin has been installed in a munin-node that is too old to know about multigraph plugins. Even if your munin master understands multigraph plugins this is not enough, the node too needs to be new enough. Version 1.4.0 or later should work.'
        exit 0
        ;;

    *: ) echo 'multigraph.value 0'
        exit 0
        ;;
    esac
}


is_dirtyconfig () {
    # Detect if node/server supports dirty config (feature not yet supported)
    case $MUNIN_CAP_DIRTYCONFIG in
    1) exit 1;;
    *) exit 0;;
    esac
}



# janl_: can I in a shell script save STDOUT so I can restore it after
# a "exec >>somefile"?
# james: exec 2>&4 etc.
# janl_: this saves handle 2 in handle 4?
# james: yes, that's basically the same as dup
# james: dup2, even
# janl_: so... ... "exec 4>&2" to restore?
# james: Actually you can do: exec 4>&2- ... which closes 4 afterwards ...
# I think that's historical behaviour and not a newish extension

# vim: ft=sh sw=4 ts=4 et
Something went wrong with that request. Please try again.