diff --git a/smartd-conf.py b/smartd-conf.py deleted file mode 100755 index 5837812..0000000 --- a/smartd-conf.py +++ /dev/null @@ -1,134 +0,0 @@ -#!/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.""" - diff --git a/smartd.initd b/smartd.initd index ae7f81e..87be74f 100644 --- a/smartd.initd +++ b/smartd.initd @@ -2,7 +2,7 @@ # smartmontools init file for smartd # Copyright (C) 2002-4 Bruce Allen -# $Id: smartd.initd,v 1.6 2007/09/04 11:59:22 tsmetana Exp $ +# $Id: smartd.initd,v 1.7 2008/05/12 10:17:58 tsmetana Exp $ # For RedHat and cousins: # chkconfig: - 99 01 @@ -47,17 +47,6 @@ RETVAL=0 prog=smartd pidfile=/var/lock/subsys/smartd -genconfig() -{ - if [ -x /usr/sbin/smartd-conf.py ]; then - GEN_CONF="*SMARTD*AUTOGENERATED*" - [ ! -f /etc/smartd.conf ] || read DUMMY GEN_CONF DUMMY /dev/null >/etc/smartd.conf.new-autogenerated \ - && mv -f /etc/smartd.conf.new-autogenerated /etc/smartd.conf - fi -} - start() { echo -n $"Starting $prog: " @@ -98,14 +87,12 @@ report() case "$1" in start) - genconfig start ;; stop) stop ;; reload) - genconfig reload ;; report) @@ -113,18 +100,15 @@ case "$1" in ;; restart) stop - genconfig start ;; try-restart) if [ -f $pidfile ]; then stop - genconfig start fi ;; force-reload) - genconfig reload || (stop; start) ;; status) @@ -135,6 +119,6 @@ case "$1" in echo $"Usage: $0 {start|stop|reload|force-reload|report|restart|try-restart|status}" RETVAL=3 esac - + exit $RETVAL diff --git a/smartmontools-5.36-cciss.patch b/smartmontools-5.36-cciss.patch deleted file mode 100644 index ee01e75..0000000 --- a/smartmontools-5.36-cciss.patch +++ /dev/null @@ -1,639 +0,0 @@ -Patch for smartmontools >= 5.36, which adds CCISS support (for Compaq and HP Smart Arrays) -to smartctl and smartd. - -The initial version was published on 2005-07-22 at the smartmontools-support mailing list -at sourceforge.net: http://article.gmane.org/gmane.linux.utilities.smartmontools/2933 - -Thanks to all contributors: - - - Praveen Chidambaram (original smartctl patch) - - Guido Guenther (Debian smartmontools package maintainer) - - Frédéric Boiteux (fixes and patch applying) - - Douglas Gilbert (update to be less intrusive) - -How to use smartctl for cciss devices after applying this patch? Well, for example just do: - - $ smartctl -a -d cciss,0 /dev/cciss/c0d0 - $ smartctl -H -d cciss,0 /dev/cciss/c0d0 - -This patch was merged by Robert Scheck and successfully tested on -a Linux 2.6.16 kernel. - -Have a lot of fun... - ---- smartmontools-5.36/os_linux.c 2006-04-12 19:02:19.000000000 +0200 -+++ smartmontools-5.36/os_linux.c.cciss 2006-05-10 15:53:35.000000000 +0200 -@@ -64,12 +64,17 @@ - #include "os_linux.h" - #include "scsicmds.h" - #include "utility.h" -+#include "extern.h" -+ -+#include -+ - - #ifndef ENOTSUP - #define ENOTSUP ENOSYS - #endif - typedef unsigned long long u8; - -+ - #define ARGUSED(x) ((void)(x)) - - static const char *filenameandversion="$Id: os_linux.c,v 1.82 2006/04/12 16:28:56 ballen4705 Exp $"; -@@ -83,6 +88,23 @@ - // global variable holding byte count of allocated memory - extern long long bytes; - -+/* for passing global control variables */ -+extern smartmonctrl *con; -+ -+static int cciss_io_interface(int device, int target, -+ struct scsi_cmnd_io * iop, int report); -+ -+typedef struct _ReportLUNdata_struct -+{ -+ BYTE LUNListLength[4]; -+ DWORD reserved; -+ BYTE LUN[CISS_MAX_LUN][8]; -+} ReportLunData_struct; -+ -+/* Structure/defines of Report Physical LUNS of drive */ -+#define CISS_MAX_LUN 16 -+#define CISS_MAX_PHYS_LUN 1024 -+#define CISS_REPORT_PHYS 0xc3 - - - /* This function will setup and fix device nodes for a 3ware controller. */ -@@ -191,8 +213,15 @@ - } - return open(pathname, O_RDONLY | O_NONBLOCK); - } -+ // cciss+ -+ else if(!strcmp(type, "CCISS")) -+ { -+ // the device is a cciss smart array device. -+ return open(pathname, O_RDWR | O_NONBLOCK); -+ } - else - return -1; -+ - } - - // equivalent to close(file descriptor) -@@ -609,6 +638,93 @@ - - return 0; - } -+// cciss+ -+static int cciss_sendpassthru(unsigned int cmdtype, unsigned char *CDB, -+ unsigned int CDBlen, char *buff, -+ unsigned int size, unsigned int LunID, -+ unsigned char *scsi3addr, int fd) -+{ -+ int err ; -+ IOCTL_Command_struct iocommand; -+ -+ memset(&iocommand, 0, sizeof(iocommand)); -+ -+ if (cmdtype == 0) -+ { -+ // To controller; nothing to do -+ } -+ else if (cmdtype == 1) -+ { -+ iocommand.LUN_info.LogDev.VolId = LunID; -+ iocommand.LUN_info.LogDev.Mode = 1; -+ } -+ else if (cmdtype == 2) -+ { -+ memcpy(&iocommand.LUN_info.LunAddrBytes,scsi3addr,8); -+ iocommand.LUN_info.LogDev.Mode = 0; -+ } -+ else -+ { -+ fprintf(stderr, "cciss_sendpassthru: bad cmdtype\n"); -+ return 1; -+ } -+ -+ memcpy(&iocommand.Request.CDB[0], CDB, CDBlen); -+ iocommand.Request.CDBLen = CDBlen; -+ iocommand.Request.Type.Type = TYPE_CMD; -+ iocommand.Request.Type.Attribute = ATTR_SIMPLE; -+ iocommand.Request.Type.Direction = XFER_READ; -+ iocommand.Request.Timeout = 0; -+ -+ iocommand.buf_size = size; -+ iocommand.buf = (unsigned char *)buff; -+ -+ if ((err = ioctl(fd, CCISS_PASSTHRU, &iocommand))) -+ { -+ fprintf(stderr, "CCISS ioctl error %d\n", err); -+ } -+ return err; -+} -+ -+// cciss+ -+static int cciss_getlun(int device, int target, unsigned char *physlun) -+{ -+ unsigned char CDB[16]= {0}; -+ ReportLunData_struct *luns; -+ int reportlunsize = sizeof(*luns) + CISS_MAX_PHYS_LUN * 8; -+ int i; -+ int ret; -+ -+ luns = (ReportLunData_struct *)malloc(reportlunsize); -+ -+ memset(luns, 0, reportlunsize); -+ -+ /* Get Physical LUN Info (for physical device) */ -+ CDB[0] = CISS_REPORT_PHYS; -+ CDB[6] = (reportlunsize >> 24) & 0xFF; /* MSB */ -+ CDB[7] = (reportlunsize >> 16) & 0xFF; -+ CDB[8] = (reportlunsize >> 8) & 0xFF; -+ CDB[9] = reportlunsize & 0xFF; -+ -+ if ((ret = cciss_sendpassthru(0, CDB, 12, (char *)luns, reportlunsize, 0, NULL, device))) -+ { -+ free(luns); -+ return ret; -+ } -+ -+ for (i=0; iLUN[i][6] == target) -+ { -+ memcpy(physlun, luns->LUN[i], 8); -+ free(luns); -+ return 0; -+ } -+ } -+ -+ free(luns); -+ return ret; -+} - - // >>>>>> Start of general SCSI specific linux code - -@@ -913,7 +1029,8 @@ - * (e.g. CHECK CONDITION). If the SCSI command could not be issued - * (e.g. device not present or timeout) or some other problem - * (e.g. timeout) then returns a negative errno value */ --int do_scsi_cmnd_io(int dev_fd, struct scsi_cmnd_io * iop, int report) -+static int do_normal_scsi_cmnd_io(int dev_fd, struct scsi_cmnd_io * iop, -+ int report) - { - int res; - -@@ -937,15 +1054,104 @@ - case SG_IO_PRESENT_YES: - return sg_io_cmnd_io(dev_fd, iop, report, 0); - default: -- pout(">>>> do_scsi_cmnd_io: bad sg_io_state=%d\n", sg_io_state); -+ pout(">>>> do_normal_scsi_cmnd_io: bad sg_io_state=%d\n", -+ sg_io_state); - sg_io_state = SG_IO_PRESENT_UNKNOWN; - return -EIO; /* report error and reset state */ - } - } - -+// Check and call the right interface. May be when the do_generic_scsi_cmd_io interface is better -+// we can take off this crude way of calling the right interface -+ -+int do_scsi_cmnd_io(int dev_fd, struct scsi_cmnd_io * iop, int report) -+{ -+ switch(con->controller_type) -+ { -+ case CONTROLLER_CCISS: -+ return cciss_io_interface(dev_fd, con->controller_port-1, iop, report); -+ // not reached -+ break; -+ default: -+ return do_normal_scsi_cmnd_io(dev_fd, iop, report); -+ // not reached -+ break; -+ } -+} -+ -+ - // >>>>>> End of general SCSI specific linux code - - -+// cciss+ >> CCSISS I/O passthrough -+// This is an interface that uses the cciss passthrough to talk to the SMART controller on -+// the HP system. The cciss driver provides a way to send SCSI cmds through the CCISS passthrough -+// essentially the methods above and below pertain to SCSI, except for the SG driver which is not -+// involved. The CCISS driver does not engage the scsi subsystem. -+static int cciss_io_interface(int device, int target, struct scsi_cmnd_io * iop, int report) -+{ -+ unsigned char pBuf[512] = {0}; -+ unsigned char phylun[1024] = {0}; -+ int iBufLen = 512; -+ int status = -1; -+ int len = 0; // used later in the code. -+ report = 0; -+ -+ cciss_getlun(device, target, phylun); -+ status = cciss_sendpassthru( 2, iop->cmnd, iop->cmnd_len, (char*) pBuf, iBufLen, 1, phylun, device); -+ -+ if (0 == status) -+ { -+ if (report > 0) -+ printf(" status=0\n"); -+ if (DXFER_FROM_DEVICE == iop->dxfer_dir) -+ { -+ memcpy(iop->dxferp, pBuf, iop->dxfer_len); -+ if (report > 1) -+ { -+ int trunc = (iop->dxfer_len > 256) ? 1 : 0; -+ printf(" Incoming data, len=%d%s:\n", (int)iop->dxfer_len, -+ (trunc ? " [only first 256 bytes shown]" : "")); -+ dStrHex((const char*)iop->dxferp, (trunc ? 256 : iop->dxfer_len) , 1); -+ } -+ } -+ return 0; -+ } -+ iop->scsi_status = status & 0x7e; /* bits 0 and 7 used to be for vendors */ -+ if (LSCSI_DRIVER_SENSE == ((status >> 24) & 0xf)) -+ iop->scsi_status = SCSI_STATUS_CHECK_CONDITION; -+ len = (SEND_IOCTL_RESP_SENSE_LEN < iop->max_sense_len) ? -+ SEND_IOCTL_RESP_SENSE_LEN : iop->max_sense_len; -+ if ((SCSI_STATUS_CHECK_CONDITION == iop->scsi_status) && -+ iop->sensep && (len > 0)) -+ { -+ memcpy(iop->sensep, pBuf, len); -+ iop->resp_sense_len = iBufLen; -+ if (report > 1) -+ { -+ printf(" >>> Sense buffer, len=%d:\n", (int)len); -+ dStrHex((const char *)pBuf, len , 1); -+ } -+ } -+ if (report) -+ { -+ if (SCSI_STATUS_CHECK_CONDITION == iop->scsi_status) { -+ printf(" status=%x: sense_key=%x asc=%x ascq=%x\n", status & 0xff, -+ pBuf[2] & 0xf, pBuf[12], pBuf[13]); -+ } -+ else -+ printf(" status=0x%x\n", status); -+ } -+ if (iop->scsi_status > 0) -+ return 0; -+ else -+ { -+ if (report > 0) -+ printf(" ioctl status=0x%x but scsi status=0, fail with EIO\n", status); -+ return -EIO; /* give up, assume no device there */ -+ } -+} -+ - // prototype - void printwarning(smart_command_set command); - ---- smartmontools-5.36/smartctl.8.in 2006-04-12 17:45:38.000000000 +0200 -+++ smartmontools-5.36/smartctl.8.in.cciss 2006-05-10 15:53:35.000000000 +0200 -@@ -177,7 +177,7 @@ - .TP - .B \-d TYPE, \-\-device=TYPE - Specifies the type of the device. The valid arguments to this option --are \fIata\fP, \fIscsi\fP, \fImarvell\fP, and \fI3ware,N\fP. If this option is not -+are \fIata\fP, \fIscsi\fP, \fImarvell\fP, \fIcciss,N\fP and \fI3ware,N\fP. If this option is not - used then \fBsmartctl\fP will attempt to guess the device type from - the device name. - -@@ -257,6 +257,8 @@ - - .B 3ware controllers are currently ONLY supported under Linux and FreeBSD. - -+.B cciss controllers are currently ONLY supported under Linux. -+ - .TP - .B \-T TYPE, \-\-tolerance=TYPE - Specifies how tolerant \fBsmartctl\fP should be of ATA and SMART command -@@ -1157,6 +1159,12 @@ - power\-cycled during the read\-scan, resume the scan 45 minutes after power to the - device is restored. - .PP -+.nf -+.B smartctl \-a \-d cciss,0 /dev/cciss/c0d0 -+.fi -+Examine all SMART data for the first SCSI disk connected to a cciss -+RAID controller card. -+.PP - .SH RETURN VALUES - The return values of \fBsmartctl\fP are defined by a bitmask. If all - is well with the disk, the return value (exit status) of ---- smartmontools-5.36/smartctl.c 2006-04-12 16:54:28.000000000 +0200 -+++ smartmontools-5.36/smartctl.c.cciss 2006-05-10 15:53:35.000000000 +0200 -@@ -234,7 +234,7 @@ - case 'q': - return "errorsonly, silent"; - case 'd': -- return "ata, scsi, marvell, 3ware,N"; -+ return "ata, scsi, marvell, 3ware,N, cciss,N"; - case 'T': - return "normal, conservative, permissive, verypermissive"; - case 'b': -@@ -384,21 +384,35 @@ - con->dont_print = FALSE; - pout("No memory for argument of -d. Exiting...\n"); - exit(FAILCMD); -- } else if (strncmp(s,"3ware,",6)) { -- badarg = TRUE; -- } else if (split_report_arg2(s, &i)) { -- sprintf(extraerror, "Option -d 3ware,N requires N to be a non-negative integer\n"); -- badarg = TRUE; -- } else if (i<0 || i>15) { -- sprintf(extraerror, "Option -d 3ware,N (N=%d) must have 0 <= N <= 15\n", i); -- badarg = TRUE; -- } else { -- // NOTE: controller_port == disk number + 1 -- con->controller_type = CONTROLLER_3WARE; -- con->controller_port = i+1; -- } -- free(s); -- } -+ } else if (!strncmp(s,"3ware,",6)) { -+ if (split_report_arg2(s, &i)) { -+ sprintf(extraerror, "Option -d 3ware,N requires N to be a non-negative integer\n"); -+ badarg = TRUE; -+ } else if (i<0 || i>15) { -+ sprintf(extraerror, "Option -d 3ware,N (N=%d) must have 0 <= N <= 15\n", i); -+ badarg = TRUE; -+ } else { -+ // NOTE: controller_port == disk number + 1 -+ con->controller_type = CONTROLLER_3WARE; -+ con->controller_port = i+1; -+ } -+ free(s); -+ } else if (!strncmp(s,"cciss,",6)) { -+ if (split_report_arg2(s, &i)) { -+ sprintf(extraerror, "Option -d cciss,N requires N to be a non-negative integer\n"); -+ badarg = TRUE; -+ } else if (i<0 || i>15) { -+ sprintf(extraerror, "Option -d cciss,N (N=%d) must have 0 <= N <= 15\n", i); -+ badarg = TRUE; -+ } else { -+ // NOTE: controller_port == drive number -+ con->controller_type = CONTROLLER_CCISS; -+ con->controller_port = i+1; -+ } -+ free(s); -+ } else -+ badarg=TRUE; -+ } - break; - case 'T': - if (!strcmp(optarg,"normal")) { -@@ -856,6 +870,9 @@ - case CONTROLLER_3WARE_678K_CHAR: - mode="ATA_3WARE_678K"; - break; -+ case CONTROLLER_CCISS: -+ mode="CCISS"; -+ break; - default: - mode="ATA"; - break; -@@ -887,6 +904,11 @@ - case CONTROLLER_SCSI: - retval = scsiPrintMain(fd); - break; -+ case CONTROLLER_CCISS: -+ // route the cciss command through scsiPrintMain. -+ // cciss pass-throughs will separeate from the SCSI data-path. -+ retval = scsiPrintMain(fd); -+ break; - default: - retval = ataPrintMain(fd); - break; ---- smartmontools-5.36/smartd.8.in 2006-04-12 15:55:44.000000000 +0200 -+++ smartmontools-5.36/smartd.8.in.cciss 2006-05-10 15:53:35.000000000 +0200 -@@ -596,8 +596,8 @@ - .B \-d TYPE - Specifies the type of the device. This Directive may be used multiple - times for one device, but the arguments \fIata\fP, \fIscsi\fP, --\fImarvell\fP, and \fI3ware,N\fP are mutually-exclusive. If more than --one is given then \fBsmartd\fP will use the last one which appears. -+\fImarvell\fP, \fIcciss,N\fP and \fI3ware,N\fP are mutually-exclusive. If more -+than one is given then \fBsmartd\fP will use the last one which appears. - - If none of these three arguments is given, then \fBsmartd\fP will - first attempt to guess the device type by looking at whether the sixth -@@ -664,8 +664,14 @@ - 6/7/8000 series controllers) or /dev/twa0-15 (3ware 9000 series - controllers). - -+.I cciss,N -+\- the device consists of one or more SCSI disks connected to a cciss -+RAID controller. The non-negative integer N (in the range from 0 to 15 -+inclusive) denotes which disk on the controller is monitored. In log -+files and email messages this disk will be identified as cciss_disk_XX -+with XX in the range from 00 to 15 inclusive. - --.B 3ware controllers are currently ONLY supported under Linux. -+.B 3ware and cciss controllers are currently ONLY supported under Linux. - - .I removable - \- the device or its media is removable. This indicates to ---- smartmontools-5.36/smartd.c 2006-04-12 18:18:57.000000000 +0200 -+++ smartmontools-5.36/smartd.c.cciss 2006-05-10 15:53:35.000000000 +0200 -@@ -711,6 +711,18 @@ - *s=' '; - } - break; -+ case CONTROLLER_CCISS: -+ { -+ char *s,devicetype[16]; -+ sprintf(devicetype, "cciss,%d", cfg->controller_port-1); -+ exportenv(environ_strings[8], "SMARTD_DEVICETYPE", devicetype); -+ if ((s=strchr(cfg->name, ' '))) -+ *s='\0'; -+ exportenv(environ_strings[9], "SMARTD_DEVICE", cfg->name); -+ if (s) -+ *s=' '; -+ } -+ break; - case CONTROLLER_ATA: - exportenv(environ_strings[8], "SMARTD_DEVICETYPE", "ata"); - exportenv(environ_strings[9], "SMARTD_DEVICE", cfg->name); -@@ -722,6 +734,7 @@ - case CONTROLLER_SCSI: - exportenv(environ_strings[8], "SMARTD_DEVICETYPE", "scsi"); - exportenv(environ_strings[9], "SMARTD_DEVICE", cfg->name); -+ break; - } - - snprintf(fullmessage, 1024, -@@ -1074,7 +1087,7 @@ - void Directives() { - PrintOut(LOG_INFO, - "Configuration file (%s) Directives (after device name):\n" -- " -d TYPE Set the device type: ata, scsi, marvell, removable, 3ware,N\n" -+ " -d TYPE Set the device type: ata, scsi, marvell, removable, 3ware,N, cciss,N\n" - " -T TYPE Set the tolerance to one of: normal, permissive\n" - " -o VAL Enable/disable automatic offline tests (on/off)\n" - " -S VAL Enable/disable attribute autosave (on/off)\n" -@@ -1607,11 +1620,15 @@ - // should we try to register this as a SCSI device? - switch (cfg->controller_type) { - case CONTROLLER_SCSI: -+ case CONTROLLER_CCISS: - case CONTROLLER_UNKNOWN: - break; - default: - return 1; - } -+ // pass user settings on to low-level SCSI commands -+ con->controller_port=cfg->controller_port; -+ con->controller_type=cfg->controller_type; - - // open the device - if ((fd = OpenDevice(device, "SCSI", scanning)) < 0) -@@ -2796,26 +2813,42 @@ - PrintOut(LOG_CRIT, - "No memory to copy argument to -d option - exiting\n"); - EXIT(EXIT_NOMEM); -- } else if (strncmp(s,"3ware,",6)) { -- badarg=1; -- } else if (split_report_arg2(s, &i)){ -- PrintOut(LOG_CRIT, "File %s line %d (drive %s): Directive -d 3ware,N requires N integer\n", -- configfile, lineno, name); -- badarg=1; -- } else if ( i<0 || i>15) { -- PrintOut(LOG_CRIT, "File %s line %d (drive %s): Directive -d 3ware,N (N=%d) must have 0 <= N <= 15\n", -- configfile, lineno, name, i); -- badarg=1; -- } else { -- // determine type of escalade device from name of device -- cfg->controller_type = guess_device_type(name); -- if (cfg->controller_type!=CONTROLLER_3WARE_9000_CHAR && cfg->controller_type!=CONTROLLER_3WARE_678K_CHAR) -- cfg->controller_type=CONTROLLER_3WARE_678K; -+ } else if (!strncmp(s,"3ware,",6)) { -+ if (split_report_arg2(s, &i)){ -+ PrintOut(LOG_CRIT, "File %s line %d (drive %s): Directive -d 3ware,N requires N integer\n", -+ configfile, lineno, name); -+ badarg=1; -+ } else if ( i<0 || i>15) { -+ PrintOut(LOG_CRIT, "File %s line %d (drive %s): Directive -d 3ware,N (N=%d) must have 0 <= N <= 15\n", -+ configfile, lineno, name, i); -+ badarg=1; -+ } else { -+ // determine type of escalade device from name of device -+ cfg->controller_type = guess_device_type(name); -+ if (cfg->controller_type!=CONTROLLER_3WARE_9000_CHAR && cfg->controller_type!=CONTROLLER_3WARE_678K_CHAR) -+ cfg->controller_type=CONTROLLER_3WARE_678K; - -- // NOTE: controller_port == disk number + 1 -- cfg->controller_port = i+1; -+ // NOTE: controller_port == disk number + 1 -+ cfg->controller_port = i+1; -+ } -+ } else if (!strncmp(s,"cciss,",6)) { -+ if (split_report_arg2(s, &i)){ -+ PrintOut(LOG_CRIT, "File %s line %d (drive %s): Directive -d cciss,N requires N integer\n", -+ configfile, lineno, name); -+ badarg=1; -+ } else if ( i<0 || i>15) { -+ PrintOut(LOG_CRIT, "File %s line %d (drive %s): Directive -d cciss,N (N=%d) must have 0 <= N <= 15\n", -+ configfile, lineno, name, i); -+ badarg=1; -+ } else { -+ // NOTE: controller_port == disk number + 1 -+ cfg->controller_type = CONTROLLER_CCISS; -+ cfg->controller_port = i+1; -+ } -+ } else { -+ badarg=1; - } -- s=CheckFree(s, __LINE__,filenameandversion); -+ s=CheckFree(s, __LINE__,filenameandversion); - } - break; - case 'F': -@@ -3223,13 +3256,13 @@ - } - } - -- // If we found 3ware controller, then modify device name by adding a SPACE -- if (cfg->controller_port){ -+ // If we found 3ware/cciss controller, then modify device name by adding a SPACE -+ if (cfg->controller_port) { - int len=17+strlen(cfg->name); - char *newname; - - if (devscan){ -- PrintOut(LOG_CRIT, "smartd: can not scan for 3ware devices (line %d of file %s)\n", -+ PrintOut(LOG_CRIT, "smartd: can not scan for 3ware/cciss devices (line %d of file %s)\n", - lineno, configfile); - return -2; - } -@@ -3240,7 +3273,8 @@ - } - - // Make new device name by adding a space then RAID disk number -- snprintf(newname, len, "%s [3ware_disk_%02d]", cfg->name, cfg->controller_port-1); -+ snprintf(newname, len, "%s [%s_disk_%02d]", cfg->name, (cfg->controller_type == CONTROLLER_CCISS) ? "cciss" : "3ware", -+ cfg->controller_port-1); - cfg->name=CheckFree(cfg->name, __LINE__,filenameandversion); - cfg->name=newname; - bytes+=16; -@@ -3886,7 +3920,7 @@ - continue; - - // register ATA devices -- if (ent->controller_type!=CONTROLLER_SCSI){ -+ if (ent->controller_type!=CONTROLLER_SCSI && ent->controller_type!=CONTROLLER_CCISS){ - if (ATADeviceScan(ent, scanning)) - CanNotRegister(ent->name, "ATA", ent->lineno, scanning); - else { -@@ -3899,7 +3933,8 @@ - } - - // then register SCSI devices -- if (ent->controller_type==CONTROLLER_SCSI || ent->controller_type==CONTROLLER_UNKNOWN){ -+ if (ent->controller_type==CONTROLLER_SCSI || ent->controller_type==CONTROLLER_CCISS || -+ ent->controller_type==CONTROLLER_UNKNOWN){ - int retscsi=0; - - #if SCSITIMEOUT ---- smartmontools-5.36/smartd.conf.5.in 2006-04-12 16:03:14.000000000 +0200 -+++ smartmontools-5.36/smartd.conf.5.in.cciss 2006-05-10 15:53:35.000000000 +0200 -@@ -235,8 +235,8 @@ - .B \-d TYPE - Specifies the type of the device. This Directive may be used multiple - times for one device, but the arguments \fIata\fP, \fIscsi\fP, --\fImarvell\fP, and \fI3ware,N\fP are mutually-exclusive. If more than --one is given then \fBsmartd\fP will use the last one which appears. -+\fImarvell\fP, \fIcciss,N\fP and \fI3ware,N\fP are mutually-exclusive. If more -+than one is given then \fBsmartd\fP will use the last one which appears. - - If none of these three arguments is given, then \fBsmartd\fP will - first attempt to guess the device type by looking at whether the sixth -@@ -303,8 +303,14 @@ - 6/7/8000 series controllers) or /dev/twa0-15 (3ware 9000 series - controllers). - -+.I cciss,N -+\- the device consists of one or more SCSI disks connected to a cciss -+RAID controller. The non-negative integer N (in the range from 0 to 15 -+inclusive) denotes which disk on the controller is monitored. In log -+files and email messages this disk will be identified as cciss_disk_XX -+with XX in the range from 00 to 15 inclusive. - --.B 3ware controllers are currently ONLY supported under Linux. -+.B 3ware and cciss controllers are currently ONLY supported under Linux. - - .I removable - \- the device or its media is removable. This indicates to ---- smartmontools-5.36/utility.h 2006-04-12 16:54:28.000000000 +0200 -+++ smartmontools-5.36/utility.h.cciss 2006-05-10 15:53:35.000000000 +0200 -@@ -174,6 +174,6 @@ - #define CONTROLLER_3WARE_9000_CHAR 0x05 // set by guess_device_type() - #define CONTROLLER_3WARE_678K_CHAR 0x06 // set by guess_device_type() - #define CONTROLLER_MARVELL_SATA 0x07 // SATA drives behind Marvell controllers -- -+#define CONTROLLER_CCISS 0x08 // CCISS controller - - #endif diff --git a/smartmontools-5.36-cloexec.patch b/smartmontools-5.36-cloexec.patch deleted file mode 100644 index f03b494..0000000 --- a/smartmontools-5.36-cloexec.patch +++ /dev/null @@ -1,53 +0,0 @@ ---- smartmontools-5.36/os_linux.c.cloexec 2006-05-11 09:41:12.000000000 +0200 -+++ smartmontools-5.36/os_linux.c 2006-11-07 10:02:55.000000000 +0100 -@@ -183,14 +183,14 @@ - - // equivalent to open(path, flags) - int deviceopen(const char *pathname, char *type){ -+ int fd = -1; - if (!strcmp(type,"SCSI")) { -- int fd = open(pathname, O_RDWR | O_NONBLOCK); -+ fd = open(pathname, O_RDWR | O_NONBLOCK); - if (fd < 0 && errno == EROFS) - fd = open(pathname, O_RDONLY | O_NONBLOCK); -- return fd; - } - else if (!strcmp(type,"ATA")) -- return open(pathname, O_RDONLY | O_NONBLOCK); -+ fd = open(pathname, O_RDONLY | O_NONBLOCK); - else if (!strcmp(type,"ATA_3WARE_9000")) { - // the device nodes for this controller are dynamically assigned, - // so we need to check that they exist with the correct major -@@ -200,7 +200,7 @@ - errno=ENXIO; - return -1; - } -- return open(pathname, O_RDONLY | O_NONBLOCK); -+ fd = open(pathname, O_RDONLY | O_NONBLOCK); - } - else if (!strcmp(type,"ATA_3WARE_678K")) { - // the device nodes for this controller are dynamically assigned, -@@ -211,17 +211,21 @@ - errno=ENXIO; - return -1; - } -- return open(pathname, O_RDONLY | O_NONBLOCK); -+ fd = open(pathname, O_RDONLY | O_NONBLOCK); - } - // cciss+ - else if(!strcmp(type, "CCISS")) - { - // the device is a cciss smart array device. -- return open(pathname, O_RDWR | O_NONBLOCK); -+ fd = open(pathname, O_RDWR | O_NONBLOCK); - } - else - return -1; - -+ if (fd != -1) { -+ fcntl(fd, F_SETFD, FD_CLOEXEC); -+ } -+ return fd; - } - - // equivalent to close(file descriptor) diff --git a/smartmontools-5.36-sata.patch b/smartmontools-5.36-sata.patch deleted file mode 100644 index 834de29..0000000 --- a/smartmontools-5.36-sata.patch +++ /dev/null @@ -1,57 +0,0 @@ ---- smartmontools-5.33/scsicmds.c.sata 2004-09-05 22:57:43.000000000 +0200 -+++ smartmontools-5.33/scsicmds.c 2006-10-25 20:38:01.000000000 +0200 -@@ -1979,11 +1979,15 @@ - int k, id_len, c_set, assoc, id_type, i_len; - unsigned char * ucp; - unsigned char * ip; -+ unsigned char buff1[20]; -+ unsigned char buff2[20]; - - if (len < 4) { - /* Device identification VPD page length too short */ - return 0; - } -+ buff1[0] = '\0'; -+ buff2[0] = '\0'; - len -= 4; - ucp = vpd_di_buff + 4; - for (k = 0; k < len; k += id_len, ucp += id_len) { -@@ -1997,9 +2001,24 @@ - c_set = (ucp[0] & 0xf); - assoc = ((ucp[1] >> 4) & 0x3); - id_type = (ucp[1] & 0xf); -- if ((0 == id_type) && (2 == c_set) && (0 == assoc) && -- (0 == strncmp((const char *)ip, -- "Linux ATA-SCSI simulator", i_len))) { -+ if ((0 == id_type) && (2 == c_set) && (0 == assoc)) { -+ /* assoc=lu, c_set=ascii, id_type=vendor */ -+ if (0 == strncmp((const char *)ip, -+ "Linux ATA-SCSI simulator", i_len)) { -+ /* until lk 2.6.16 */ -+ return 1; -+ } -+ memcpy(buff1, ip, sizeof(buff1)); -+ } -+ if ((1 == id_type) && (2 == c_set) && (0 == assoc)) { -+ /* assoc=lu, c_set=ascii, id_type=t10 vendor id */ -+ if (0 == strncmp((const char *)ip, "ATA", 3)) -+ memcpy(buff2, ip + 48, sizeof(buff2)); -+ } -+ } -+ if (buff1[0] && buff2[0]) { -+ if (0 == memcmp(buff1, buff2, sizeof(buff1))) { -+ /* after lk 2.6.16, look for serial number match */ - return 1; - } - } ---- smartmontools-5.33/scsiprint.c.sata 2004-09-06 07:44:54.000000000 +0200 -+++ smartmontools-5.33/scsiprint.c 2006-10-25 20:47:58.000000000 +0200 -@@ -739,7 +739,7 @@ - /* <<<< This is Linux specific code to detect SATA disks using a - SCSI-ATA command translation layer. This may be generalized - later when the t10.org SAT project matures. >>>> */ -- req_len = 96; -+ req_len = 252; - memset(gBuf, 0, req_len); - if ((err = scsiInquiryVpd(device, 0x83, gBuf, req_len))) { - PRINT_ON(con); diff --git a/smartmontools-5.36.tar.gz.asc b/smartmontools-5.36.tar.gz.asc deleted file mode 100644 index 9a4c689..0000000 --- a/smartmontools-5.36.tar.gz.asc +++ /dev/null @@ -1,7 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.2.3 (GNU/Linux) - -iD8DBQBEPTvaIpXYFIQauugRAvZBAJ968y8JxgOnj3GxpCTa7bBi7u3jwwCeM2q9 -mGVfsOQ08M0jlcqoaEs/Lhw= -=NsuA ------END PGP SIGNATURE----- diff --git a/smartmontools-5.37-3ware.patch b/smartmontools-5.37-3ware.patch deleted file mode 100644 index 0139d76..0000000 --- a/smartmontools-5.37-3ware.patch +++ /dev/null @@ -1,50 +0,0 @@ ---- smartmontools-5.37/smartctl.cpp.3ware 2006-10-09 13:45:12.000000000 +0200 -+++ smartmontools-5.37/smartctl.cpp 2007-08-20 13:20:24.000000000 +0200 -@@ -463,8 +463,8 @@ - if (split_report_arg2(s, &i)) { - sprintf(extraerror, "Option -d 3ware,N requires N to be a non-negative integer\n"); - badarg = TRUE; -- } else if (i<0 || i>15) { -- sprintf(extraerror, "Option -d 3ware,N (N=%d) must have 0 <= N <= 15\n", i); -+ } else if (i<0 || i>23) { -+ sprintf(extraerror, "Option -d 3ware,N (N=%d) must have 0 <= N <= 23\n", i); - badarg = TRUE; - } else { - // NOTE: controller_port == disk number + 1 ---- smartmontools-5.37/smartd.cpp.3ware 2006-11-12 05:49:09.000000000 +0100 -+++ smartmontools-5.37/smartd.cpp 2007-08-20 13:20:45.000000000 +0200 -@@ -3038,8 +3038,8 @@ - PrintOut(LOG_CRIT, "File %s line %d (drive %s): Directive -d 3ware,N requires N integer\n", - configfile, lineno, name); - badarg=1; -- } else if ( i<0 || i>15) { -- PrintOut(LOG_CRIT, "File %s line %d (drive %s): Directive -d 3ware,N (N=%d) must have 0 <= N <= 15\n", -+ } else if ( i<0 || i>23) { -+ PrintOut(LOG_CRIT, "File %s line %d (drive %s): Directive -d 3ware,N (N=%d) must have 0 <= N <= 23\n", - configfile, lineno, name, i); - badarg=1; - } else { ---- smartmontools-5.37/smartd.conf.5.in.3ware 2006-12-20 08:30:43.000000000 +0100 -+++ smartmontools-5.37/smartd.conf.5.in 2007-08-20 13:16:39.000000000 +0200 -@@ -298,10 +298,10 @@ - - .I 3ware,N - \- the device consists of one or more ATA disks connected to a 3ware --RAID controller. The non-negative integer N (in the range from 0 to 15 -+RAID controller. The non-negative integer N (in the range from 0 to 23 - inclusive) denotes which disk on the controller is monitored. In log - files and email messages this disk will be identified as 3ware_disk_XX --with XX in the range from 00 to 15 inclusive. -+with XX in the range from 00 to 23 inclusive. - - This Directive may at first appear confusing, because the 3ware - controller is a SCSI device (such as /dev/sda) and should be listed as -@@ -729,7 +729,7 @@ - is set to the device path (examples: /dev/hda, /dev/sdb). - .IP \fBSMARTD_DEVICETYPE\fP 4 - is set to the device type (possible values: ata, scsi, 3ware,N, hpt,L/M/N). --Here N=0,...,15 denotes the ATA disk behind a 3ware RAID controller and -+Here N=0,...,23 denotes the ATA disk behind a 3ware RAID controller and - L/M/N denotes the SATA disk behind a HighPoint RocketRAID controller. - .IP \fBSMARTD_DEVICESTRING\fP 4 - is set to the device description. For SMARTD_DEVICETYPE of ata or diff --git a/smartmontools-5.37-buildfix.patch b/smartmontools-5.37-buildfix.patch deleted file mode 100644 index e312fbc..0000000 --- a/smartmontools-5.37-buildfix.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- smartmontools-5.37/autogen.sh.buildfix 2005-09-19 11:28:11.000000000 +0200 -+++ smartmontools-5.37/autogen.sh 2007-10-31 12:24:53.000000000 +0100 -@@ -48,7 +48,8 @@ - echo "than 1.9.x) is only added after extensive tests. If you live in" - echo "the bleeding edge, you should know what you're doing, mainly how" - echo "to test it before the developers. Be patient." --exit 1; -+#exit 1; -+AUTOMAKE=automake - } - - test -x "$ACLOCAL" || ACLOCAL="aclocal`echo "$AUTOMAKE" | sed 's/.*automake//'`" && ACLOCAL=`typep "$ACLOCAL"` || diff --git a/smartmontools-5.37-cloexec.patch b/smartmontools-5.37-cloexec.patch deleted file mode 100644 index 24d5251..0000000 --- a/smartmontools-5.37-cloexec.patch +++ /dev/null @@ -1,51 +0,0 @@ ---- smartmontools-5.37/os_linux.cpp.fix 2006-10-25 19:01:42.000000000 +0200 -+++ smartmontools-5.37/os_linux.cpp 2007-02-27 13:20:55.000000000 +0100 -@@ -190,14 +190,14 @@ - - // equivalent to open(path, flags) - int deviceopen(const char *pathname, char *type){ -+ int fd = -1; - if (!strcmp(type,"SCSI")) { -- int fd = open(pathname, O_RDWR | O_NONBLOCK); -+ fd = open(pathname, O_RDWR | O_NONBLOCK); - if (fd < 0 && errno == EROFS) - fd = open(pathname, O_RDONLY | O_NONBLOCK); -- return fd; - } - else if (!strcmp(type,"ATA")) -- return open(pathname, O_RDONLY | O_NONBLOCK); -+ fd = open(pathname, O_RDONLY | O_NONBLOCK); - else if (!strcmp(type,"ATA_3WARE_9000")) { - // the device nodes for this controller are dynamically assigned, - // so we need to check that they exist with the correct major -@@ -207,7 +207,7 @@ - errno=ENXIO; - return -1; - } -- return open(pathname, O_RDONLY | O_NONBLOCK); -+ fd = open(pathname, O_RDONLY | O_NONBLOCK); - } - else if (!strcmp(type,"ATA_3WARE_678K")) { - // the device nodes for this controller are dynamically assigned, -@@ -218,15 +218,19 @@ - errno=ENXIO; - return -1; - } -- return open(pathname, O_RDONLY | O_NONBLOCK); -+ fd = open(pathname, O_RDONLY | O_NONBLOCK); - } - else if(!strcmp(type, "CCISS")) { - // the device is a cciss smart array device. -- return open(pathname, O_RDWR | O_NONBLOCK); -+ fd = open(pathname, O_RDWR | O_NONBLOCK); - } - else - return -1; - -+ if (fd != -1) { -+ fcntl(fd, F_SETFD, FD_CLOEXEC); -+ } -+ return fd; - } - - // equivalent to close(file descriptor) diff --git a/smartmontools.spec b/smartmontools.spec index 81adb31..d4ac6cc 100644 --- a/smartmontools.spec +++ b/smartmontools.spec @@ -1,15 +1,14 @@ Summary: Tools for monitoring SMART capable hard disks Name: smartmontools Version: 5.38 -Release: 4.1%{?dist} +Release: 5%{?dist} Epoch: 1 Group: System Environment/Base License: GPLv2+ URL: http://smartmontools.sourceforge.net/ Source0: http://prdownloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz Source1: smartd.initd -Source2: smartd-conf.py -Source3: smartmontools.sysconf +Source2: smartmontools.sysconf Patch1: smartmontools-5.38-cloexec.patch Patch2: smartmontools-5.37-addrinfo.patch Patch3: smartmontools-5.38-perc.patch @@ -27,19 +26,10 @@ ExclusiveArch: i386 x86_64 %{arm} ia64 ppc ppc64 The smartmontools package contains two utility programs (smartctl and smartd) to control and monitor storage systems using the Self- Monitoring, Analysis and Reporting Technology System (SMART) built -into most modern ATA and SCSI hard disks. In many cases, these +into most modern ATA and SCSI hard disks. In many cases, these utilities will provide advanced warning of disk degradation and failure. -%package config -Group: System Environment/Base -Summary: The smartmontools configuration script -Requires: %{name} = %{epoch}:%{version}-%{release} hal >= 0.5.2 dbus-python >= 0.33 - -%description config -This package provides a smartd-conf.py script that helps to create -the /etc/smartd.conf configuration file. - %prep %setup -q %patch1 -p1 -b .cloexec @@ -59,21 +49,7 @@ make DESTDIR=$RPM_BUILD_ROOT install #rm -f $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/smartd.conf rm -f examplescripts/Makefile* install -D -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/smartd -install -D -m 755 %{SOURCE2} $RPM_BUILD_ROOT%{_sbindir}/smartd-conf.py -touch $RPM_BUILD_ROOT%{_sbindir}/smartd-conf.py{c,o} -install -D -m 644 %{SOURCE3} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/smartmontools - -%define cfgfile $RPM_BUILD_ROOT%{_sysconfdir}/smartd.conf -echo "# *SMARTD*AUTOGENERATED* /etc/smartd.conf" > %{cfgfile}.head -echo \ -"# The line above is relevant only if you have smartmontools-config installed:" \ - >> %{cfgfile}.head -echo "# Remove the line if you have edited the file and you do not want" \ - >> %{cfgfile}.head -echo "# it to be overwritten on the next smartd startup." >> %{cfgfile}.head -echo "" >> %{cfgfile}.head -cat %{cfgfile}.head smartd.conf > %{cfgfile} -rm -f %{cfgfile}.head +install -D -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/smartmontools %clean rm -rf $RPM_BUILD_ROOT @@ -104,12 +80,10 @@ exit 0 %config(noreplace) %{_sysconfdir}/smartd.conf %config(noreplace) %{_sysconfdir}/sysconfig/smartmontools -%files config -%defattr(-,root,root) -%{_sbindir}/smartd-conf.py -%exclude %{_sbindir}/smartd-conf.py[co] - %changelog +* Mon May 12 2008 Tomas Smetana - 1:5.38-5 +- remove config subpackage + * Mon May 05 2008 Tomas Smetana - 1:5.38-4.1 - add libselinux-devel to BR