#!/usr/bin/python # Copyright 2004-2006 Red Hat, Inc. Distributed under the GPL. # Authors: Will Woods , Tomas Mraz import os import dbus class Drive: def __init__(self, bus, device, sysfspath): self.bus = bus self.device = device self.sysfspath = sysfspath def listDrivesbyHAL(): drives = [] bus = dbus.SystemBus() halm_obj = bus.get_object('org.freedesktop.Hal', '/org/freedesktop/Hal/Manager') halm = dbus.Interface(halm_obj, 'org.freedesktop.Hal.Manager') storage_udi_list = halm.FindDeviceByCapability('storage') for udi in storage_udi_list: drive_obj = bus.get_object('org.freedesktop.Hal', udi) drive = dbus.Interface(drive_obj, 'org.freedesktop.Hal.Device') storage_bus = drive.GetProperty('storage.bus') drive_type = drive.GetProperty('storage.drive_type') if (storage_bus == 'ide' or storage_bus == 'scsi') and drive_type == 'disk': device_file = drive.GetProperty('block.device') sysfs_path = drive.GetProperty('linux.sysfs_path') drv = Drive(storage_bus, device_file, sysfs_path) drives += [drv] return drives drives = listDrivesbyHAL() print """# *SMARTD*AUTOGENERATED* /etc/smartd.conf # Remove the line above if you have edited the file and you do not want # it to be overwritten on the next smartd startup. # Sample configuration file for smartd. See man 5 smartd.conf. # Home page is: http://smartmontools.sourceforge.net # The file gives a list of devices to monitor using smartd, with one # device per line. Text after a hash (#) is ignored, and you may use # spaces and tabs for white space. You may use '\\' to continue lines. # You can usually identify which hard disks are on your system by # looking in /proc/ide and in /proc/scsi. # The word DEVICESCAN will cause any remaining lines in this # configuration file to be ignored: it tells smartd to scan for all # ATA and SCSI devices. DEVICESCAN may be followed by any of the # Directives listed below, which will be applied to all devices that # are found. Most users should comment out DEVICESCAN and explicitly # list the devices that they wish to monitor. # DEVICESCAN # First (primary) ATA/IDE hard disk. Monitor all attributes # /dev/hda -a # Monitor SMART status, ATA Error Log, Self-test log, and track # changes in all attributes except for attribute 194 # /dev/hdb -H -l error -l selftest -t -I 194 # A very silent check. Only report SMART health status if it fails # But send an email in this case""" def getfile(fname): try: fh = open(fname) line = fh.read().rstrip() fh.close() except IOError: line = '' return line try: execfile('/etc/sysconfig/smartmontools') except IOError: pass for drive in drives: if getfile("%s/removable" % drive.sysfspath) == '0': driver = '' comment = '' if getfile("%s/device/vendor" % drive.sysfspath) == 'ATA': driver = '-d sat' if float(getfile("/sys/module/libata/version")) < 1.20: comment = "# not yet supported in this kernel version\n# " if not comment: status = os.system("/usr/sbin/smartctl -s on -i %s %s 2>&1 >/dev/null" % (driver, drive.device)) if not os.WIFEXITED(status) or os.WEXITSTATUS(status) != 0: comment = "# smartctl -i returns error for this drive\n# " try: print "%s%s %s %s" % (comment, drive.device, driver, smartd_conf_opts) except NameError: print "%s%s %s -H -m root" % (comment, drive.device, driver) print """ # First two SCSI disks. This will monitor everything that smartd can # monitor. # /dev/sda -d scsi # /dev/sdb -d scsi # HERE IS A LIST OF DIRECTIVES FOR THIS CONFIGURATION FILE # -d TYPE Set the device type to one of: ata, scsi # -T TYPE set the tolerance to one of: normal, permissive # -o VAL Enable/disable automatic offline tests (on/off) # -S VAL Enable/disable attribute autosave (on/off) # -H Monitor SMART Health Status, report if failed # -l TYPE Monitor SMART log. Type is one of: error, selftest # -f Monitor for failure of any 'Usage' Attributes # -m ADD Send warning email to ADD for -H, -l error, -l selftest, and -f # -M TYPE Modify email warning behavior (see man page) # -p Report changes in 'Prefailure' Normalized Attributes # -u Report changes in 'Usage' Normalized Attributes # -t Equivalent to -p and -u Directives # -r ID Also report Raw values of Attribute ID with -p, -u or -t # -R ID Track changes in Attribute ID Raw value with -p, -u or -t # -i ID Ignore Attribute ID for -f Directive # -I ID Ignore Attribute ID for -p, -u or -t Directive # -v N,ST Modifies labeling of Attribute N (see man page) # -a Default: equivalent to -H -f -t -l error -l selftest # -F TYPE Use firmware bug workaround. Type is one of: none, samsung # -P TYPE Drive-specific presets: use, ignore, show, showall # # Comment: text after a hash sign is ignored # \ Line continuation character # Attribute ID is a decimal integer 1 <= ID <= 255 # All but -d, -m and -M Directives are only implemented for ATA devices # # If the test string DEVICESCAN is the first uncommented text # then smartd will scan for devices /dev/hd[a-l] and /dev/sd[a-z] # DEVICESCAN may be followed by any desired Directives."""