diff --git a/check_file_age b/check_file_age deleted file mode 100755 index 2c2bbab..0000000 --- a/check_file_age +++ /dev/null @@ -1,170 +0,0 @@ -#! /bin/bash -# -# check_file_age -# Alerts if a file's age is beyond a specific threshold -# Copyright (C) 2021 Vintage Salt -# -# Distributed under terms of the MIT license. -# -set -e - -# Read-only set-once variables -declare -r _name="$(basename -- "$0")" -# Options -declare -i _optcritthresh -declare -i _optwarnthresh -declare -i _opthelp -declare -i _optverbose -# Working variables -declare -a _args -declare _return - -# Helper functions -log() { - # Print a line to the terminal if _optverbose is greater than $2 - # $2 defaults to 0 - # loglevel 0: Daily-use messages - # loglevel 1: Detailed but not quite debugging - # loglevel 2: Definitely debugging - [ -z "$1" ] && return 1 - if (( _optverbose >= ${2:-0} )); then - printf "%s\\n" "$1" - fi -} -warn() { - # Print a yellow line to the terminal, respecting _optverbose - [ -z "$1" ] && return 1 - if (( _optverbose >= ${2:-0} )); then - if [ -t 1 ]; then - printf "\\e[33m%s\\e[0m\\n" "$1" - else - printf "WARN: %s\\n" "$1" - fi - fi -} -error() { - # Print a red line to the terminal, exit if $2 is specified - [ -z "$1" ] && return 1 - if [ -t 2 ]; then - printf "\\e[31m%s\\e[0m\\n" "$1" 1>&2 - else - printf "ERROR: %s\\n" "$1" 1>&2 - fi - [ -z "$2" ] && return - exit "${2:-1}" -} -has() { - # Parse out all arguments and try to find them in path - # If an argument cannot be found, set _return and fail - for prog in "$@"; do - if ! command -v "$prog" > /dev/null 2>&1; then - _return="$prog" - return 1 - fi - done - return 0 -} - -# Core program functions -checkage() { - # Check a file's age against the values of _optwarnthres and _optcritthresh - file="${_args[0]}" - log "Checking file $file" 1 - # Get some times - filetimestamp="$(stat -c %Y -- "$file")" - now="$(date +%s)" - # Get our age - age="$(( now - filetimestamp ))" - log "File is $age seconds old" 1 - # Throw out warns and crits as necessary - if (( age >= _optcritthresh )); then - echo "CRITICAL: $file is $age seconds old (max $_optcritthresh)" - exit 2 - elif (( age >= _optwarnthresh)); then - echo "WARNING: $file is $age seconds old (max $_optwarnthresh)" - exit 1 - else - echo "OK: $file" - exit 0 - fi -} -printhelp() { - cat << EOF -Usage: $_name [OPTION]... -A Nagios monitoring plugin for checking a file's age - -Arguments: - FILE The file to monitor - -Flags: - -c The maximum age of the file in seconds before a CRITICAL status is - returned - -h Print this help text - -v Print more status messages. Stacks - -w The maximum age of the file in seconds before a WARNING status is - returned - -Copyright (c) 2021 rehashedsalt@cock.li -Licensed under the MIT license -EOF -} - -# Main -main() { - # Parse out arguments - while [ -n "$1" ]; do - # Parse out flags - while getopts ":c:hvw:" opt; do - case $opt in - c) - _optcritthresh="$OPTARG" - ;; - h) - _opthelp=1 - ;; - v) - _optverbose+=1 - ;; - w) - _optwarnthresh="$OPTARG" - ;; - :) - error "Option requires argument: -$OPTARG" 2 - ;; - *) - error "Invalid option: -$OPTARG" 2 - ;; - esac - done - # Store arguments - shift $((OPTIND - 1)) - if [ -n "$1" ]; then - _args+=("$1") - shift - fi - unset OPTIND - done - # Early hook for help - [ -n "$_opthelp" ] && printhelp && exit 0 - # Validate critical options - if [ -z "${_args[0]}" ]; then - error "Must specify a file" 50 - fi - if ! (( _optcritthresh > 0 )) 2>/dev/null; then - error "Critical threshold must be an integer greater than 0" 50 - fi - if ! (( _optwarnthresh > 0 )) 2>/dev/null; then - error "Warning threshold must be an integer greater than 0" 50 - fi - # Validate core program dependencies - log "Validating dependencies" 2 - if ! has basename; then - error "Failed to find program: $_return" 50 - fi - - # Do the do - checkage -} - -main "$@" - diff --git a/check_mem_justintime b/check_mem_justintime deleted file mode 100755 index f64fdb8..0000000 --- a/check_mem_justintime +++ /dev/null @@ -1,409 +0,0 @@ -#!/usr/bin/perl -w - -# Heavily based on the script from: -# check_mem.pl Copyright (C) 2000 Dan Larsson -# heavily modified by -# Justin Ellison -# -# The MIT License (MIT) -# Copyright (c) 2011 justin@techadvise.com - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this -# software and associated documentation files (the "Software"), to deal in the Software -# without restriction, including without limitation the rights to use, copy, modify, -# merge, publish, distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies -# or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE -# FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT -# OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. - -# Tell Perl what we need to use -use strict; -use Getopt::Std; - -#TODO - Convert to Nagios::Plugin -#TODO - Use an alarm - -# Predefined exit codes for Nagios -use vars qw($opt_c $opt_f $opt_u $opt_w $opt_C $opt_v $opt_h %exit_codes); -%exit_codes = ('UNKNOWN' , 3, - 'OK' , 0, - 'WARNING' , 1, - 'CRITICAL', 2, - ); - -# Get our variables, do our checking: -init(); - -# Get the numbers: -my ($free_memory_kb,$used_memory_kb,$caches_kb,$hugepages_kb) = get_memory_info(); -print "$free_memory_kb Free\n$used_memory_kb Used\n$caches_kb Cache\n" if ($opt_v); -print "$hugepages_kb Hugepages\n" if ($opt_v and $opt_h); - -if ($opt_C) { #Do we count caches as free? - $used_memory_kb -= $caches_kb; - $free_memory_kb += $caches_kb; -} - -if ($opt_h) { - $used_memory_kb -= $hugepages_kb; -} - -print "$used_memory_kb Used (after Hugepages)\n" if ($opt_v); - -# Round to the nearest KB -$free_memory_kb = sprintf('%.0f',$free_memory_kb); -$used_memory_kb = sprintf('%.0f',$used_memory_kb); -$caches_kb = sprintf('%.0f',$caches_kb); - -# Tell Nagios what we came up with -tell_nagios($used_memory_kb,$free_memory_kb,$caches_kb,$hugepages_kb); - - -sub tell_nagios { - my ($used,$free,$caches,$hugepages) = @_; - - # Calculate Total Memory - my $total = $free + $used; - print "$total Total\n" if ($opt_v); - - my $perf_warn; - my $perf_crit; - if ( $opt_u ) { - $perf_warn = int(${total} * $opt_w / 100); - $perf_crit = int(${total} * $opt_c / 100); - } else { - $perf_warn = int(${total} * ( 100 - $opt_w ) / 100); - $perf_crit = int(${total} * ( 100 - $opt_c ) / 100); - } - - my $perfdata = "|TOTAL=${total}KB;;;; USED=${used}KB;${perf_warn};${perf_crit};; FREE=${free}KB;;;; CACHES=${caches}KB;;;;"; - $perfdata .= " HUGEPAGES=${hugepages}KB;;;;" if ($opt_h); - - if ($opt_f) { - my $percent = sprintf "%.1f", ($free / $total * 100); - if ($percent <= $opt_c) { - finish("CRITICAL - $percent% ($free kB) free!$perfdata",$exit_codes{'CRITICAL'}); - } - elsif ($percent <= $opt_w) { - finish("WARNING - $percent% ($free kB) free!$perfdata",$exit_codes{'WARNING'}); - } - else { - finish("OK - $percent% ($free kB) free.$perfdata",$exit_codes{'OK'}); - } - } - elsif ($opt_u) { - my $percent = sprintf "%.1f", ($used / $total * 100); - if ($percent >= $opt_c) { - finish("CRITICAL - $percent% ($used kB) used!$perfdata",$exit_codes{'CRITICAL'}); - } - elsif ($percent >= $opt_w) { - finish("WARNING - $percent% ($used kB) used!$perfdata",$exit_codes{'WARNING'}); - } - else { - finish("OK - $percent% ($used kB) used.$perfdata",$exit_codes{'OK'}); - } - } -} - -# Show usage -sub usage() { - print "\ncheck_mem.pl v1.0 - Nagios Plugin\n\n"; - print "usage:\n"; - print " check_mem.pl - -w -c \n\n"; - print "options:\n"; - print " -f Check FREE memory\n"; - print " -u Check USED memory\n"; - print " -C Count OS caches as FREE memory\n"; - print " -h Remove hugepages from the total memory count\n"; - print " -w PERCENT Percent free/used when to warn\n"; - print " -c PERCENT Percent free/used when critical\n"; - print "\nCopyright (C) 2000 Dan Larsson \n"; - print "check_mem.pl comes with absolutely NO WARRANTY either implied or explicit\n"; - print "This program is licensed under the terms of the\n"; - print "MIT License (check source code for details)\n"; - exit $exit_codes{'UNKNOWN'}; -} - -sub get_memory_info { - my $used_memory_kb = 0; - my $free_memory_kb = 0; - my $total_memory_kb = 0; - my $caches_kb = 0; - my $hugepages_nr = 0; - my $hugepages_size = 0; - my $hugepages_kb = 0; - - my $uname; - if ( -e '/usr/bin/uname') { - $uname = `/usr/bin/uname -a`; - } - elsif ( -e '/bin/uname') { - $uname = `/bin/uname -a`; - } - else { - die "Unable to find uname in /usr/bin or /bin!\n"; - } - print "uname returns $uname" if ($opt_v); - if ( $uname =~ /Linux/ ) { - my @meminfo = `/bin/cat /proc/meminfo`; - foreach (@meminfo) { - chomp; - if (/^Mem(Total|Free):\s+(\d+) kB/) { - my $counter_name = $1; - if ($counter_name eq 'Free') { - $free_memory_kb = $2; - } - elsif ($counter_name eq 'Total') { - $total_memory_kb = $2; - } - } - elsif (/^(Buffers|Cached|SReclaimable):\s+(\d+) kB/) { - $caches_kb += $2; - } - elsif (/^Shmem:\s+(\d+) kB/) { - $caches_kb -= $1; - } - # These variables will most likely be overwritten once we look into - # /sys/kernel/mm/hugepages, unless we are running on linux <2.6.27 - # and have to rely on them - elsif (/^HugePages_Total:\s+(\d+)/) { - $hugepages_nr = $1; - } - elsif (/^Hugepagesize:\s+(\d+) kB/) { - $hugepages_size = $1; - } - } - $hugepages_kb = $hugepages_nr * $hugepages_size; - $used_memory_kb = $total_memory_kb - $free_memory_kb; - - # Read hugepages info from the newer sysfs interface if available - my $hugepages_sysfs_dir = '/sys/kernel/mm/hugepages'; - if ( -d $hugepages_sysfs_dir ) { - # Reset what we read from /proc/meminfo - $hugepages_kb = 0; - opendir(my $dh, $hugepages_sysfs_dir) - || die "Can't open $hugepages_sysfs_dir: $!"; - while (my $entry = readdir $dh) { - if ($entry =~ /^hugepages-(\d+)kB/) { - $hugepages_size = $1; - my $hugepages_nr_file = "$hugepages_sysfs_dir/$entry/nr_hugepages"; - open(my $fh, '<', $hugepages_nr_file) - || die "Can't open $hugepages_nr_file for reading: $!"; - $hugepages_nr = <$fh>; - close($fh); - $hugepages_kb += $hugepages_nr * $hugepages_size; - } - } - closedir($dh); - } - } - elsif ( $uname =~ /HP-UX/ ) { - # HP-UX, thanks to Christoph Fürstaller - my @meminfo = `/usr/bin/sudo /usr/local/bin/kmeminfo`; - foreach (@meminfo) { - chomp; - if (/^Physical memory\s\s+=\s+(\d+)\s+(\d+.\d)g/) { - $total_memory_kb = ($2 * 1024 * 1024); - } - elsif (/^Free memory\s\s+=\s+(\d+)\s+(\d+.\d)g/) { - $free_memory_kb = ($2 * 1024 * 1024); - } - } - $used_memory_kb = $total_memory_kb - $free_memory_kb; - } - elsif ( $uname =~ /FreeBSD/ ) { - # The FreeBSD case. 2013-03-19 www.claudiokuenzler.com - # free mem = Inactive*Page Size + Cache*Page Size + Free*Page Size - my $pagesize = `sysctl vm.stats.vm.v_page_size`; - $pagesize =~ s/[^0-9]//g; - my $mem_inactive = 0; - my $mem_cache = 0; - my $mem_free = 0; - my $mem_total = 0; - my $free_memory = 0; - my @meminfo = `/sbin/sysctl vm.stats.vm`; - foreach (@meminfo) { - chomp; - if (/^vm.stats.vm.v_inactive_count:\s+(\d+)/) { - $mem_inactive = ($1 * $pagesize); - } - elsif (/^vm.stats.vm.v_cache_count:\s+(\d+)/) { - $mem_cache = ($1 * $pagesize); - } - elsif (/^vm.stats.vm.v_free_count:\s+(\d+)/) { - $mem_free = ($1 * $pagesize); - } - elsif (/^vm.stats.vm.v_page_count:\s+(\d+)/) { - $mem_total = ($1 * $pagesize); - } - } - $free_memory = $mem_inactive + $mem_cache + $mem_free; - $free_memory_kb = ( $free_memory / 1024); - $total_memory_kb = ( $mem_total / 1024); - $used_memory_kb = $total_memory_kb - $free_memory_kb; - $caches_kb = ($mem_cache / 1024); - } - elsif ( $uname =~ /joyent/ ) { - # The SmartOS case. 2014-01-10 www.claudiokuenzler.com - # free mem = pagesfree * pagesize - my $pagesize = `pagesize`; - my $phys_pages = `kstat -p unix:0:system_pages:pagestotal | awk '{print \$NF}'`; - my $free_pages = `kstat -p unix:0:system_pages:pagesfree | awk '{print \$NF}'`; - my $arc_size = `kstat -p zfs:0:arcstats:size | awk '{print \$NF}'`; - my $arc_size_kb = $arc_size / 1024; - - print "Pagesize is $pagesize" if ($opt_v); - print "Total pages is $phys_pages" if ($opt_v); - print "Free pages is $free_pages" if ($opt_v); - print "Arc size is $arc_size" if ($opt_v); - - $caches_kb += $arc_size_kb; - - $total_memory_kb = $phys_pages * $pagesize / 1024; - $free_memory_kb = $free_pages * $pagesize / 1024; - $used_memory_kb = $total_memory_kb - $free_memory_kb; - } - elsif ( $uname =~ /SunOS/ ) { - eval "use Sun::Solaris::Kstat"; - if ($@) { #Kstat not available - if ($opt_C) { - print "You can't report on Solaris caches without Sun::Solaris::Kstat available!\n"; - exit $exit_codes{UNKNOWN}; - } - my @vmstat = `/usr/bin/vmstat 1 2`; - my $line; - foreach (@vmstat) { - chomp; - $line = $_; - } - $free_memory_kb = (split(/ /,$line))[5] / 1024; - my @prtconf = `/usr/sbin/prtconf`; - foreach (@prtconf) { - if (/^Memory size: (\d+) Megabytes/) { - $total_memory_kb = $1 * 1024; - } - } - $used_memory_kb = $total_memory_kb - $free_memory_kb; - - } - else { # We have kstat - my $kstat = Sun::Solaris::Kstat->new(); - my $phys_pages = ${kstat}->{unix}->{0}->{system_pages}->{physmem}; - my $free_pages = ${kstat}->{unix}->{0}->{system_pages}->{freemem}; - # We probably should account for UFS caching here, but it's unclear - # to me how to determine UFS's cache size. There's inode_cache, - # and maybe the physmem variable in the system_pages module?? - # In the real world, it looks to be so small as not to really matter, - # so we don't grab it. If someone can give me code that does this, - # I'd be glad to put it in. - my $arc_size = (exists ${kstat}->{zfs} && ${kstat}->{zfs}->{0}->{arcstats}->{size}) ? - ${kstat}->{zfs}->{0}->{arcstats}->{size} / 1024 - : 0; - $caches_kb += $arc_size; - my $pagesize = `pagesize`; - - $total_memory_kb = $phys_pages * $pagesize / 1024; - $free_memory_kb = $free_pages * $pagesize / 1024; - $used_memory_kb = $total_memory_kb - $free_memory_kb; - } - } - elsif ( $uname =~ /Darwin/ ) { - $total_memory_kb = (split(/ /,`/usr/sbin/sysctl hw.memsize`))[1]/1024; - my $pagesize = (split(/ /,`/usr/sbin/sysctl hw.pagesize`))[1]; - $caches_kb = 0; - my @vm_stat = `/usr/bin/vm_stat`; - foreach (@vm_stat) { - chomp; - if (/^(Pages free):\s+(\d+)\.$/) { - $free_memory_kb = $2*$pagesize/1024; - } - # 'caching' concept works different on MACH - # this should be a reasonable approximation - elsif (/^Pages (inactive|purgable):\s+(\d+).$/) { - $caches_kb += $2*$pagesize/1024; - } - } - $used_memory_kb = $total_memory_kb - $free_memory_kb; - } - elsif ( $uname =~ /AIX/ ) { - my @meminfo = `/usr/bin/vmstat -vh`; - foreach (@meminfo) { - chomp; - if (/^\s*([0-9.]+)\s+(.*)/) { - my $counter_name = $2; - if ($counter_name eq 'memory pages') { - $total_memory_kb = $1*4; - } - if ($counter_name eq 'free pages') { - $free_memory_kb = $1*4; - } - if ($counter_name eq 'file pages') { - $caches_kb = $1*4; - } - if ($counter_name eq 'Number of 4k page frames loaned') { - $free_memory_kb += $1*4; - } - } - } - $used_memory_kb = $total_memory_kb - $free_memory_kb; - } - else { - if ($opt_C) { - print "You can't report on $uname caches!\n"; - exit $exit_codes{UNKNOWN}; - } - my $command_line = `vmstat | tail -1 | awk '{print \$4,\$5}'`; - chomp $command_line; - my @memlist = split(/ /, $command_line); - - # Define the calculating scalars - $used_memory_kb = $memlist[0]/1024; - $free_memory_kb = $memlist[1]/1024; - $total_memory_kb = $used_memory_kb + $free_memory_kb; - } - return ($free_memory_kb,$used_memory_kb,$caches_kb,$hugepages_kb); -} - -sub init { - # Get the options - if ($#ARGV le 0) { - &usage; - } - else { - getopts('c:fuChvw:'); - } - - # Shortcircuit the switches - if (!$opt_w or $opt_w == 0 or !$opt_c or $opt_c == 0) { - print "*** You must define WARN and CRITICAL levels!\n"; - &usage; - } - elsif (!$opt_f and !$opt_u) { - print "*** You must select to monitor either USED or FREE memory!\n"; - &usage; - } - - # Check if levels are sane - if ($opt_w <= $opt_c and $opt_f) { - print "*** WARN level must not be less than CRITICAL when checking FREE memory!\n"; - &usage; - } - elsif ($opt_w >= $opt_c and $opt_u) { - print "*** WARN level must not be greater than CRITICAL when checking USED memory!\n"; - &usage; - } -} - -sub finish { - my ($msg,$state) = @_; - print "$msg\n"; - exit $state; -}