Differences

This shows you the differences between two versions of the page.

Link to this comparison view

monitors:dell-warranty [2009/11/23 05:43] (current)
Line 1: Line 1:
 +====== My Monitor (CHANGEME) ======
 +
 +^ Author | [[ butchdeal@yahoo.com | Butch Deal ]] |
 +^ Compatibility | Xymon 4.2 |
 +^ Requirements | Linux, python, dmidecode |
 +^ Download | None |
 +^ Last Update | 2009-06-02 |
 +
 +===== Description =====
 +Check the Dell service tag against the Dell website to see how many days are remaining of warranty.
 +
 +returns this information:​
 +<​code>​
 +Warranty start date: 12/8/2008
 +End Date: 1/17/2010
 +Days Left : 229 green
 +Serial Number: C2T8L61
 +</​code>​
 +
 +===== Installation =====
 +=== Client side ===
 +Configure sudo so that dmidecode can be run.
 +add these lines to the clientlaunch.cfg file:
 +<​code>​
 +[warranty]
 + ENVFILE $HOBBITCLIENTHOME/​etc/​hobbitclient.cfg
 + CMD $HOBBITCLIENTHOME/​ext/​check_dell_warranty.py
 + LOGFILE $HOBBITCLIENTHOME/​logs/​check-warranty.log
 + INTERVAL 1d
 +</​code>​
 +=== Server side ===
 +
 +===== Source =====
 +==== check_dell_warranty.py ====
 +<hidden onHidden="​Show Code ⇲" onVisible="​Hide Code ⇱">​
 +<​code>​
 +#​!/​usr/​bin/​env python
 +
 +#​=============================================================================
 +# Nagios plugin to pull the Dell service tag and check it 
 +# against Dell's website to see how many days remain. By default it 
 +# issues a warning when there is less than thirty days remaining and critical when 
 +# there is less than ten days remaining. These values can be adjusted using
 +# the command line, see --help. ​                                                
 +# Version: 1.1                                                                ​
 +# Created: 2009-02-12 ​                                                        
 +# Author: Erinn Looney-Triggs ​                                                
 +# Revised: 2009-05-27 ​                                                               ​
 +# Revised by: Erinn Looney-Triggs ​                                                                
 +# Revision history:
 +# 1.1 Fixed string conversions to do int comparisons properly. Remove import
 +# csv as I am not using that yet. Add a license to the file.  ​
 +# License:
 +#    This program is free software: you can redistribute it and/or modify
 +#    it under the terms of the GNU General Public License as published by
 +#    the Free Software Foundation, either version 3 of the License, or
 +#    (at your option) any later version.
 +#
 +#    This program is distributed in the hope that it will be useful,
 +#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ​ See the
 +#    GNU General Public License for more details.
 +#
 +#    You should have received a copy of the GNU General Public License
 +#    along with this program. ​ If not, see <​http://​www.gnu.org/​licenses/>​.
 +#
 +#
 +#  Ported to Xymon by Butch Deal of GreenIT Corp.
 +# needs sudo dmidecode capabilities for serial number
 +#  sudo dmidecode -s system-serial-number
 +#
 +# add these lines to  etc/​clientlaunch.cfg
 +#  [warranty]
 +#        ENVFILE $HOBBITCLIENTHOME/​etc/​hobbitclient.cfg
 +#        CMD $HOBBITCLIENTHOME/​ext/​check_dell_warranty.py
 +#        LOGFILE $HOBBITCLIENTHOME/​logs/​check-warranty.log
 +#        INTERVAL 1d
 +#
 +#                                       
 +#​=============================================================================
 +
 +import re
 +import subprocess
 +import sys
 +import urllib2
 +
 +# converted to Xymon
 +LINE = ""​
 +
 +def extract_serial_number():​
 +    '''​Extracts the serial number from the localhost using dmidecode.
 +    ​
 +    This function takes no arguments but expects dmidecode to exist and
 +    also expects dmidecode to accept -s system-serial-number
 +    ​
 +    '''​
 +    ​
 +    #Gather the information from dmidecode
 +    try:
 +        p = subprocess.Popen(["​sudo",​ "​dmidecode",​ "​-s",​
 +                               "​system-serial-number"​], ​
 +                               ​stdout=subprocess.PIPE, ​
 +                               ​stderr=subprocess.PIPE)
 +    except OSError:
 +        print '​Error:',​ sys.exc_value,​ '​exiting!'​
 +        sys.exit(1)
 +    ​
 +    #Strip the newline off of result
 +    serial_number = p.stdout.read()
 +    ​
 +    #Basic check of the serial number, can they be longer, maybe
 +    if len( serial_number.strip() ) != 7:
 +        print '​Invalid serial number:%s exiting!'​ % (serial_number)
 +        sys.exit(WARNING)
 +    ​
 +    return serial_number.strip()
 +
 +def get_warranty(serial_number):​
 +    global LINE
 +    #The URL to Dell's site
 +#    dell_url='​http://​support.dell.com/​support/​topics/​global.aspx/​support/​my_systems_info/​details?​c=us&​l=en&​s=gen&​ServiceTag='​
 +    dell_url='​http://​support.dell.com/​support/​topics/​global.aspx/​support/​my_systems_info/​details?​ServiceTag='​
 +
 +    #Regex to pull the information from Dell's site
 +    pattern=r"""​.*> ​                         #Match anything up to >
 +                (\d{1,​2}/​\d{1,​2}/​\d{4})< ​    #​Match North American style date
 +                .*>​(\d{1,​2}/​\d{1,​2}/​\d{4})< ​ #Match date, good for 8000 years
 +                .*> ​                         #Match anything up to >
 +                (\d+)                        #Match number of days
 +                <​.* ​                         #Match <and the rest of the line
 +                """​
 +    ​
 +    #Build the full
 +    full_url = dell_url + serial_number
 +    LINE = LINE + full_url
 +    ​
 +    #Try to open the page, exit on failure
 +    try:
 +        response = urllib2.urlopen(full_url)
 +    except URLError:
 +        print '​Unable to open URL: %s exiting!'​ % (full_url)
 +        sys.exit(UNKNOWN)
 +    ​
 +    #Build our regex
 +    regex = re.compile(pattern,​ re.X)
 +
 +    #Gather the results returns a list of tuples
 +    result = regex.findall(response.read())
 +    ​
 +    return result
 +
 +def parse_exit(result):​
 +    global LINE
 +    if len(result) == 0:
 +        print "​Dell'​s database appears to be down for this system."​
 +        sys.exit(WARNING)
 +    ​
 +    start_date, end_date, days_left = result[0]
 +    COLOR = "​green"​
 +    ​
 +    if int(days_left) < options.critical_days:​
 + COLOR = "​red"​
 +    elif int(days_left) < options.warning_days:​
 + COLOR = "​yellow"​
 +    else:
 + COLOR = "​green"​
 +    LINE = LINE + "​\nWarranty start date: " + start_date + "\nEnd Date: " + end_date + "​\nDays Left : " + days_left + " &" + COLOR
 +    return COLOR
 +        ​
 +def sigalarm_handler(signum,​ frame):
 +    print '%s timed out after %d seconds'​ % (sys.argv[0],​ options.timeout)
 +    sys.exit(CRITICAL)
 +    ​
 +if __name__ == '​__main__':​
 +    import optparse
 +    import signal
 +    import os
 +    from datetime import date, datetime, timedelta
 +
 +    BB = os.environ["​BB"​]
 +    BBDISP = os.environ["​BBDISP"​]
 +    MACHINE = os.environ["​MACHINE"​]
 +
 +    parser = optparse.OptionParser(version="​%prog 1.1")
 +    parser.add_option('​-c',​ '​--critical',​ dest='​critical_days',​ default=10,
 +                     ​help='​Number of days under which to return critical \
 +                     ​(Default:​ 10)', type='​int'​)
 +    parser.add_option('​-t',​ '​--timeout',​ dest='​timeout',​ default=10,
 +                      help='​Set the timeout for the program to run \
 +                      (Default: 10 seconds)',​ type='​int'​)
 +    parser.add_option('​-w',​ '​--warning',​ dest='​warning_days',​ default=30,
 +                      help='​Number of days under which to return a warning \
 +                      (Default: 30)', type='​int'​ )
 +    ​
 +    (options, args) = parser.parse_args()
 +    ​
 +    signal.signal(signal.SIGALRM,​ sigalarm_handler)
 +    signal.alarm(options.timeout)
 +    ​
 +    serial_number = extract_serial_number()
 +    ​
 +    result = get_warranty(serial_number)
 +    ​
 +    signal.alarm(0)
 +    ​
 +    COLOR = parse_exit(result)
 +
 +#    d = datetime.now() + timedelta(hours=24)
 +    d = datetime.now()
 +    P1 = "​\"​status+25h " + MACHINE + "​.support " + COLOR + d.strftime("​ %a %b %d %H:%M:%S %Z %Y") + " - \n" + LINE + "​\nSerial Num
 +ber: " + serial_number + "​\""​
 +    LL = BB + " " + BBDISP + " " + P1
 +#    print '​%s'​ % (LL)
 +    os.system(LL)
 +</​code>​
 +</​hidden>​
 +
 +===== Known  Bugs and Issues =====
 +some servers have multiple lines of support on the dell site.  the script only uses the bottom line though occasionally one of the other lines has longer support.
 +===== To Do =====
 +Someone that knows python could really clean this up and probably easily add some features. (please do).
 +===== Credits =====
 +  * Original Nagios author: Erinn Looney-Triggs
 +  * port to Xymon: Butch Deal
 +===== Changelog =====
 +
 +  * **YYYY-MM-DD**
 +    * Initial release
  
  • monitors/dell-warranty.txt
  • Last modified: 2009/11/23 05:43
  • (external edit)