mirror of
https://github.com/systemd/systemd.git
synced 2024-12-26 03:22:00 +03:00
scsi_id: add long options
This commit is contained in:
parent
87cf9f5aac
commit
9eaa50d0e7
@ -17,7 +17,7 @@ with a non\-zero value.
|
||||
\fBscsi_id\fP is primarily for use by other utilities such as \fBudev\fP
|
||||
that require a unique SCSI identifier.
|
||||
|
||||
By default all devices are assume black listed, the \fB\-g\fP option must
|
||||
By default all devices are assume black listed, the \fB\-\-whitelisted\fP option must
|
||||
be specified on the command line or in the config file for any useful
|
||||
behaviour.
|
||||
|
||||
@ -33,7 +33,7 @@ by page 0x80. For example:
|
||||
|
||||
.sp
|
||||
.nf
|
||||
# scsi_id -p 0x80 -s /block/sdg
|
||||
# scsi_id --page=0x80 --devpath=/block/sdg
|
||||
SIBM 3542 1T05078453
|
||||
.fi
|
||||
.P
|
||||
@ -45,28 +45,26 @@ identifier starts with the NAA value of 6):
|
||||
|
||||
.sp
|
||||
.nf
|
||||
# /sbin/scsi_id -p 0x83 -s /block/sdg
|
||||
# /sbin/scsi_id --page=0x83 --devpath=/block/sdg
|
||||
3600a0b80000b174b000000d63efc5c8c
|
||||
.fi
|
||||
.P
|
||||
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.BI subsystem
|
||||
Deprecated method: when called with only a single argument without a
|
||||
leading \-, runs in a hotplug mode, and expects the environment variable
|
||||
DEVPATH to specify the corresponding sysfs device. See section below on
|
||||
usage with \fBudev\fP.
|
||||
.TP
|
||||
.BI \-a
|
||||
.BI \-\-fallback-to-sysfs
|
||||
Always print information (model, vendor strings) about the device even
|
||||
if it does not support VPD pages.
|
||||
.TP
|
||||
.BI \-b
|
||||
.BI \-\-ignore-sysfs
|
||||
Ignore sysfs entries. Used for devices which are not represented as SCSI
|
||||
devices, but understand SG_IO commands.
|
||||
.TP
|
||||
.BI \-\-blacklisted
|
||||
The default behaviour \- treat the device as black listed, and do nothing
|
||||
unless a white listed device is found in the scsi_id config\-file.
|
||||
.TP
|
||||
.BI \-d "\| device\^"
|
||||
.BI \-\-device=\| device\^
|
||||
Instead
|
||||
of determining and creating a device node based on a sysfs dev
|
||||
entry as done for the \fB\-s\fP, send SG_IO commands to
|
||||
@ -74,24 +72,24 @@ entry as done for the \fB\-s\fP, send SG_IO commands to
|
||||
This argument should also be used when invoked via udev to avoid problems
|
||||
with creation of temporary files on not-yet writable directories.
|
||||
.TP
|
||||
.BI \-f "\| config\-file"
|
||||
.BI \-\-config=\| config\-file
|
||||
Read configuration and black/white list entries from
|
||||
.B config\-file
|
||||
rather than the default
|
||||
.B /etc/scsi_id.config
|
||||
file.
|
||||
.TP
|
||||
.BI \-g
|
||||
Treat the device as white listed. The \fB\-g\fP option must be specified
|
||||
.BI \-\-whitelisted
|
||||
Treat the device as white listed. The \fB\-\-whitelisted\fP option must be specified
|
||||
on the command line or in the scsi_id configuration file for
|
||||
.B scsi_id
|
||||
to generate any output.
|
||||
.TP
|
||||
.BI \-i
|
||||
.BI \-\-prefix-bus-id
|
||||
Prefix the identification string with the driver model (sysfs) bus id of
|
||||
the SCSI device.
|
||||
.TP
|
||||
.BI \-p "\| 0x80 | 0x83 | pre-spc3-83"
|
||||
.BI \-\-page=\| 0x80 | 0x83 | pre-spc3-83
|
||||
Use SCSI INQUIRY VPD page code 0x80, 0x83, or pre-spc3-83.
|
||||
.sp
|
||||
The default
|
||||
@ -104,58 +102,29 @@ option is used for older model 4, 5, and 6 EMC Symmetrix devices, its
|
||||
use with SPC-2 or SPC-3 compliant devices will fallback to the page 83
|
||||
format supported by these devices.
|
||||
.TP
|
||||
.BI \-s "\| sysfs\-device"
|
||||
.BI \-\-devpath=\| sysfs\-devpath
|
||||
Generate an id for the
|
||||
.B sysfs\-device.
|
||||
The sysfs mount point must not be included. For example, use /block/sd,
|
||||
not /sys/block/sd.
|
||||
.B sysfs\-devpath.
|
||||
The sysfs mount point must not be included.
|
||||
.TP
|
||||
.BI \-u
|
||||
.BI \-\-replace-whitespace
|
||||
Reformat the output : replace all whitespaces by underscores.
|
||||
.TP
|
||||
.BI \-x
|
||||
.BI \-\-export
|
||||
Export all data in KEY=<value> format used to import in other programs.
|
||||
.TP
|
||||
.BI \-v
|
||||
.BI \-\-verbose
|
||||
Generate verbose debugging output.
|
||||
.TP
|
||||
.BI \-V
|
||||
.BI \-\-version
|
||||
Display version number and exit.
|
||||
.RE
|
||||
|
||||
.SH USAGE WITH UDEV
|
||||
|
||||
If \fBscsi_id\fP is invoked with one argument without a leading \-, it
|
||||
assumes it is called for a hotplug event, and looks for the sysfs device
|
||||
in the DEVPATH environment variable. This mode is deprecated, but
|
||||
available for backwards compatibility.
|
||||
.SH ENVIRONMENT
|
||||
|
||||
If the DEVPATH environment variable is set, scsi_id assumes it has been
|
||||
invoked via udev (or some other hotplug program), and all errors or
|
||||
warnings are sent using syslog.
|
||||
|
||||
To determine the specific value needed in a RESULT key, use the \-s option,
|
||||
for example:
|
||||
|
||||
.sp
|
||||
.nf
|
||||
/sbin/scsi_id -s /block/sda
|
||||
.fi
|
||||
.P
|
||||
|
||||
\fBscsi_id\fP is one of the tools used in the "Linux Persistent Device Names"
|
||||
scheme that creates persistent device links in /dev/disk. It is called with
|
||||
the -x option which will print all values in a defined format to let udev
|
||||
import it into its own environment for later event processing.
|
||||
.sp
|
||||
An example custom \fBudev\fP rule using \fBscsi_id\fP, that will name a block
|
||||
device and any partitions for the device matching the \fBscsi_id\fP output
|
||||
of 312345:
|
||||
|
||||
.sp
|
||||
.nf
|
||||
SUBSYSTEMS=="scsi", PROGRAM=="/sbin/scsi_id -d %N -s %p", RESULT=="312345", NAME="disk%n"
|
||||
.fi
|
||||
.P
|
||||
|
||||
.SH "FILES"
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <syslog.h>
|
||||
#include <stdarg.h>
|
||||
#include <ctype.h>
|
||||
#include <getopt.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "../../udev.h"
|
||||
@ -34,7 +35,25 @@
|
||||
#define TMP_DIR "/dev"
|
||||
#define TMP_PREFIX "tmp-scsi"
|
||||
|
||||
static const char short_options[] = "abd:f:ginp:s:uvVx";
|
||||
static const struct option options[] = {
|
||||
{ "device", 1, NULL, 'd' },
|
||||
{ "config", 1, NULL, 'f' },
|
||||
{ "page", 1, NULL, 'p' },
|
||||
{ "devpath", 1, NULL, 's' },
|
||||
{ "fallback-to-sysfs", 0, NULL, 'a' },
|
||||
{ "blacklisted", 0, NULL, 'b' },
|
||||
{ "whitelisted", 0, NULL, 'g' },
|
||||
{ "prefix-bus-id", 0, NULL, 'i' },
|
||||
{ "replace-whitespace", 0, NULL, 'u' },
|
||||
{ "ignore-sysfs", 0, NULL, 'n' },
|
||||
{ "verbose", 0, NULL, 'v' },
|
||||
{ "version", 0, NULL, 'V' },
|
||||
{ "export", 0, NULL, 'x' },
|
||||
{ "help", 0, NULL, 'h' },
|
||||
{}
|
||||
};
|
||||
|
||||
static const char short_options[] = "abd:f:ghinp:s:uvVx";
|
||||
static const char dev_short_options[] = "bgp:";
|
||||
|
||||
static int all_good;
|
||||
@ -407,7 +426,7 @@ static int set_options(int argc, char **argv, const char *short_opts,
|
||||
*/
|
||||
optind = 1;
|
||||
while (1) {
|
||||
option = getopt(argc, argv, short_opts);
|
||||
option = getopt_long(argc, argv, short_opts, options, NULL);
|
||||
if (option == -1)
|
||||
break;
|
||||
|
||||
@ -443,6 +462,24 @@ static int set_options(int argc, char **argv, const char *short_opts,
|
||||
all_good = 1;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
printf("Usage: scsi_id OPTIONS <device>\n"
|
||||
" --device device node for SG_IO commands\n"
|
||||
" --devpath sysfs devpath\n"
|
||||
" --config location of config file\n"
|
||||
" --page SCSI page (0x80, 0x83, pre-spc3-83)\n"
|
||||
" --fallback-to-sysfs print sysfs values if inquiry fails\n"
|
||||
" --ignore-sysfs ignore sysfs entries\n"
|
||||
" --blacklisted threat device as blacklisted\n"
|
||||
" --whitelisted threat device as whitelisted\n"
|
||||
" --prefix-bus-id prefix SCSI bus id\n"
|
||||
" --replace-whitespace replace all whitespaces by underscores\n"
|
||||
" --verbose verbose logging\n"
|
||||
" --version print version\n"
|
||||
" --export print values as environemt keys\n"
|
||||
" --help print this help text\n\n");
|
||||
exit(0);
|
||||
|
||||
case 'i':
|
||||
display_bus_id = 1;
|
||||
break;
|
||||
@ -483,13 +520,12 @@ static int set_options(int argc, char **argv, const char *short_opts,
|
||||
break;
|
||||
|
||||
case 'V':
|
||||
info("scsi_id version: %s\n", SCSI_ID_VERSION);
|
||||
printf("%s\n", SCSI_ID_VERSION);
|
||||
exit(0);
|
||||
break;
|
||||
|
||||
default:
|
||||
info("Unknown or bad option '%c' (0x%x)", option, option);
|
||||
return -1;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@ -509,7 +545,7 @@ static int per_dev_options(struct sysfs_device *dev_scsi, int *good_bad, int *pa
|
||||
|
||||
optind = 1; /* reset this global extern */
|
||||
while (retval == 0) {
|
||||
option = getopt(newargc, newargv, dev_short_options);
|
||||
option = getopt_long(newargc, newargv, dev_short_options, options, NULL);
|
||||
if (option == -1)
|
||||
break;
|
||||
|
||||
@ -648,7 +684,7 @@ static int scsi_id(const char *devpath, char *maj_min_dev)
|
||||
int page_code;
|
||||
char serial[MAX_SERIAL_LEN];
|
||||
char serial_short[MAX_SERIAL_LEN];
|
||||
char bus_str[8];
|
||||
const char *bus_str = NULL;
|
||||
|
||||
dbg("devpath %s\n", devpath);
|
||||
|
||||
@ -663,15 +699,6 @@ static int scsi_id(const char *devpath, char *maj_min_dev)
|
||||
else
|
||||
dev_type = S_IFCHR;
|
||||
|
||||
if (!ignore_sysfs) {
|
||||
/* get scsi parent device */
|
||||
dev_scsi = sysfs_device_get_parent_with_subsystem(dev, "scsi");
|
||||
if (dev_scsi == NULL) {
|
||||
err("unable to access parent device of '%s'", devpath);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* mknod a temp dev to communicate with the device */
|
||||
if (!dev_specified && create_tmp_dev(dev->devpath, maj_min_dev, dev_type)) {
|
||||
dbg("create_tmp_dev failed\n");
|
||||
@ -679,12 +706,17 @@ static int scsi_id(const char *devpath, char *maj_min_dev)
|
||||
}
|
||||
|
||||
if (!ignore_sysfs) {
|
||||
/* get scsi parent device */
|
||||
dev_scsi = sysfs_device_get_parent_with_subsystem(dev, "scsi");
|
||||
if (dev_scsi == NULL) {
|
||||
err("unable to access parent device of '%s'", devpath);
|
||||
return 1;
|
||||
}
|
||||
set_sysfs_values(dev_scsi);
|
||||
strcpy(bus_str,"scsi");
|
||||
bus_str = "scsi";
|
||||
} else {
|
||||
dev_scsi = dev;
|
||||
set_inq_values(dev_scsi, maj_min_dev);
|
||||
strcpy(bus_str,"cciss");
|
||||
}
|
||||
|
||||
/* get per device (vendor + model) options from the config file */
|
||||
@ -711,6 +743,7 @@ static int scsi_id(const char *devpath, char *maj_min_dev)
|
||||
set_str(serial_str, serial_short, sizeof(serial_str));
|
||||
printf("ID_SERIAL_SHORT=%s\n", serial_str);
|
||||
printf("ID_TYPE=%s\n", type_str);
|
||||
if (bus_str != NULL)
|
||||
printf("ID_BUS=%s\n", bus_str);
|
||||
} else {
|
||||
if (reformat_serial)
|
||||
|
Loading…
Reference in New Issue
Block a user