Provided by: sg3-utils_1.48-0ubuntu1_amd64 bug

NAME

       sg_ses - access a SCSI Enclosure Services (SES) device

SYNOPSIS

       sg_ses  [--all]  [--ALL]  [--descriptor=DES]  [--dev-slot-num=SN] [--eiioe=A_F] [--filter]
       [--get=STR] [--hex] [--index=IIA | --index=TIA,II]  [--inner-hex]  [--join]  [--json[=JO]]
       [--js-file=JFN]  [--maxlen=LEN]  [--no-config]  [--no-time]  [--page=PG] [--quiet] [--raw]
       [--readonly] [--sas-addr=SA] [--status] [--verbose] [--warn] DEVICE

       sg_ses    --control    [--byte1=B1]     [--clear=STR]     [--data=H,H...]     [--data=@FN]
       [--descriptor=DES]    [--dev-slot-num=SN]    [--index=IIA   |   --index=TIA,II]   [--mask]
       [--maxlen=LEN] [--nickname=SEN] [--nickid=SEID]  [--page=PG] [--readonly]  [--sas-addr=SA]
       [--set=STR] [--verbose] DEVICE

       sg_ses --data=@FN --status [--raw --raw] [<all options from first form>]
       sg_ses --inhex=FN --status [--raw --raw] [<all options from first form>]

       sg_ses [--enumerate] [--index=IIA] [--list] [--help] [--version]

DESCRIPTION

       Fetches  management  information from a SCSI Enclosure Service (SES) device.  This utility
       can also modify the state of a SES device. The DEVICE should be a SES device which may  be
       a  dedicated  enclosure  services processor in which case an INQUIRY response's Peripheral
       Device Type is 13 [0xd].  Alternatively it may be attached to another type of SCSI  device
       (e.g. a disk) in which case the EncServ bit is set in its INQUIRY response.

       If the DEVICE argument is given with no options then the names of all SES diagnostic pages
       (dpages) supported are listed. Most of the named dpages are defined in the  SES  standards
       and  drafts.  The  most  recent  reference  for  this  utility is the draft SCSI Enclosure
       Services 4 document T10/BSR INCITS  555  Revision  5  at  https://www.t10.org  .  Existing
       standards  for  SES, SES-2 and SES-3 are ANSI INCITS 305-1998 and ANSI INCITS 448-2008 and
       ANSI INCITS 518-2017 respectively.

       SAS expanders typically have a SES device attached via a virtual  port.  Some  HBAs  (SCSI
       initiators) choose to expose a SES device internally. That means the SCSI subsystem on the
       host machine can see the SES device, but  devices  connected  to  that  HBA  (e.g.  a  SAS
       expander)  cannot  see the HBA's SES device.  That internal SES device might report on the
       temperature(s) of the HBA and whether anything is connected to its SCSI ports.

       The first form shown in the SYNOPSIS is for fetching and decoding dpages  or  fields  from
       the  SES DEVICE. A SCSI RECEIVE DIAGNOSTIC RESULTS command is sent to the DEVICE to obtain
       each dpage response.  Rather than decoding a fetched dpage, its contents may be output  in
       hex or binary with the --hex or --raw --raw options.

       The  second form in the SYNOPSIS is for modifying dpages or fields held in the SES DEVICE.
       A SCSI SEND DIAGNOSTIC command containing a "control" dpage is sent to the DEVICE to cause
       changes.  Changing  the state of an enclosure (e.g. requesting the "ident" (locate) LED to
       flash on a disk tray in an array) is typically done using a read-modify-write  cycle.  See
       the section on CHANGING STATE below.

       The  third  form  in  the  SYNOPSIS  has two equivalent invocations shown. They decode the
       contents of a file (named FN) that holds a hexadecimal or binary representation of one, or
       many,  SES  dpage  responses.  Typically  an  earlier invocation of the first form of this
       utility with the '-HHHH' option would have generated that file. Since no SCSI commands are
       sent; the DEVICE argument, if given, will be ignored.

       The  last  form  in  the  SYNOPSIS shows the options for providing command line help (i.e.
       usage information), listing out dpage and field information tables  held  by  the  utility
       (--enumerate), or printing the version string of this utility.

       There  is  a  web  page  discussing  this  utility at https://sg.danny.cz/sg/sg_ses.html .
       Support for downloading microcode to a SES device has been placed in  a  separate  utility
       called sg_ses_microcode.

       In  the following sections "dpage" refers to a diagnostic page, either fetched with a SCSI
       RECEIVE DIAGNOSTIC RESULTS command, sent  to  the  DEVICE  with  a  SCSI  SEND  DIAGNOSTIC
       command, or fetched from data supplied by the --data= or the --inhex=FN option.

OPTIONS

       Arguments  to  long  options  are  mandatory  for  short options as well.  The options are
       arranged in alphabetical order based on the long option name.

       -a, --all
              shows the output of the --join option followed by the other  SES  dpages.  Since  a
              single  --join  option  does  not  include  the  Threshold  In  dpage, it is listed
              separately in the "other SES dpages" section. In this context,  "other"  means  all
              SES dpages that have not (explicitly) been output by the --join option.
              To  output  all  pages  without attempting a join, use the --page=all option rather
              than this option.
              If this option is used twice, the Threshold In dpage (if available) is included  in
              the  --join  option  output.  Note  that  now  the Threshold In dpage is not listed
              separately in the "other SES dpages" section. Using this option twice is equivalent
              to invoking the --ALL option.
              This  option  implies  the  --status option as long as the --control option has not
              been given.
              Using this option together with the -HHH, -HHHH or -HHHHH options is considered  an
              error  as  it  produces  confusing  output.   To  force  the issue use -H times (as
              discouragement). Instead using the --page=all option together with the -HHH,  -HHHH
              or  -HHHHH  options  will more likely produce the desired output: a dump of all SES
              diagnostics pages in hex suitable for later parsing or  visual  inspection  with  a
              text editor.

       -z, --ALL
              shows  the  output  of  the  --join option invoked twice, followed by the other SES
              dpages. Since two --join options does include the Threshold In dpage, that dpage is
              not listed separately in the "other SES dpages" section.
              This  option  implies  the  --status option as long as the --control option has not
              been given.

       -b, --byte1=B1
              some modifiable dpages may need byte 1 (i.e. the second byte) set. In the Enclosure
              Control  dpage,  byte  1 contains the INFO, NON-CRIT, CRIT and UNRECOV bits. In the
              Subenclosure String Out,  Subenclosure  Nickname  Control  and  Download  Microcode
              Control  dpages,  byte 1 is the Subenclosure identifier.  Active when the --control
              and --data=H,H... options are used and the default value is 0. If  the  --clear=STR
              or --set=STR option is used then the value read from byte 1 is written back to byte
              1.  B1 is in decimal unless it is prefixed by '0x' or '0X' (or has a  trailing  'h'
              or 'H').

       -C, --clear=STR
              Used  to  clear  an  element field in the Enclosure Control or Threshold Out dpage.
              Must be used together with an indexing option to specify which  element  is  to  be
              changed.  The  Enclosure  Control  dpage  is assumed if the --page=PG option is not
              given. See the STR FORMAT and the CLEAR, GET, SET sections below.

       -c, --control
              will send control information to the DEVICE via a  SCSI  SEND  DIAGNOSTIC  command.
              Cannot  give  both  this  option  and --status.  The Enclosure Control, String Out,
              Threshold  Out,  Array  Control  (obsolete  in  SES-2),  Subenclosure  String  Out,
              Subenclosure  Nickname  Control and Download Microcode dpages can be set currently.
              This option is assumed if either the --clear=STR or --set=STR option is given.

       -d, --data=H,H...
              permits a string of comma separated (ASCII) hex bytes to be specified (limit 1024).
              A  (single)  space separated string of hex bytes is also allowed but the list needs
              to be in quotes. This option allows  the  parameters  to  a  control  dpage  to  be
              specified.  The  string  given should not include the first 4 bytes (i.e. page code
              and length). See the DATA SUPPLIED section below.

       -d, --data=-
              reads one or more data strings from stdin, limit  almost  2**16  bytes.  stdin  may
              provide  ASCII  hex  as  a  comma  separated  list  (i.e. as with the --data=H,H...
              option). Additionally spaces, tabs and line feeds are permitted as separators  from
              stdin  . Stops reading stdin when an EOF is detected. See the DATA SUPPLIED section
              below.

       -d, --data=@FN
              reads one or more data strings from the file called FN, limit almost  2**16  bytes.
              The  contents  of the file is decoded in the same fashion as stdin described in the
              previous option. See the DATA SUPPLIED section below.

       -D, --descriptor=DES
              where DES is a descriptor name (string) as found in the Element  Descriptor  dpage.
              This  is  a medium level indexing alternative to the low level --index= options. If
              the descriptor name contains a space then DES needs  to  be  surrounded  by  quotes
              (single  or  double)  or  the space escaped (e.g. preceded by a backslash). See the
              DESCRIPTOR NAME, DEVICE SLOT NUMBER AND SAS ADDRESS section below.

       -x, --dev-slot-num=SN, --dsn=SN
              where SN is a device slot number found in the Additional Element Status dpage. Only
              entries for FCP and SAS devices (with EIP=1) have device slot numbers. SN must be a
              number in the range 0 to 255 (inclusive). 255 is  used  to  indicate  there  is  no
              corresponding  device  slot. This is a medium level indexing alternative to the low
              level --index= options. See the DESCRIPTOR NAME, DEVICE SLOT NUMBER AND SAS ADDRESS
              section below.

       -E, --eiioe=A_F
              A_F  is  either  the  string  'auto'  or  'force'.  There was some fuzziness in the
              interpretation of the 'element index' field in the Additional Element Status  (AES)
              dpage  between SES-2 and SES-3. The EIIOE bit was introduced to resolve the problem
              but not all enclosures have caught up. In the SES-3 revision 12 draft the EIIOE bit
              was  expanded  to  a  2 bit EIIOE field.  Using '--eiioe=force' will decode the AES
              dpage as if the EIIOE field is set to 1.  Using '--eiioe=auto' will decode the  AES
              dpage as if the EIIOE field is set to 1 if the first AES descriptor has its EIP bit
              set and its element index field is 1 (in other words a heuristic to  guess  whether
              the EIIOE field should be set to 1 or 0).
              If  the  enclosure sets the actual EIIOE field to 1 or more then this option has no
              effect. It is recommended that HP JBOD users set --eiioe=auto .

       -e, --enumerate
              enumerate all known diagnostic page  (dpage)  names  and  SES  elements  that  this
              utility  recognizes plus the abbreviations accepted by this utility. Ignores DEVICE
              if it is given. Essentially it is  dumping  out  tables  held  internally  by  this
              utility.
              If  --enumerate  is  given twice, then the recognized acronyms for the --clear=STR,
              --get=STR and --set=STR options are listed. The utility exits  after  listing  this
              information,  so  most  other  options and DEVICE are ignored. Since there are many
              acronyms for the Enclosure Control/Status dpage then  the  output  can  be  further
              restricted  by  giving the --index=IIA option (e.g. "sg_ses -ee -I ts" to only show
              the acronyms associated  with  the  Enclosure  Control/Status  dpage's  Temperature
              Sensor Element Type).

       -f, --filter
              cuts  down  on  the  amount  of  output  from  the  Enclosure  Status dpage and the
              Additional Element Status dpage. When this option is given, any line which has  all
              its  binary  flags cleared (i.e. 0) is filtered out (i.e.  ignored).  If a line has
              some other value on it (e.g. a temperature) then it is output.  When this option is
              used  twice  only  elements associated with the "status=ok" field (in the Enclosure
              status dpage) are output. The --filter option is useful for reducing the amount  of
              output generated by the --join option.

       -G, --get=STR
              Used  to read a field in a status element. Must be used together with a an indexing
              option to specify which element is to be read.  By  default  the  Enclosure  Status
              dpage  is  read,  the  only  other dpages that can be read are the Threshold In and
              Additional Element Status dpages. If a value is found it is output  in  decimal  to
              stdout  (by default) or in hexadecimal preceded by "0x" if the --hex option is also
              given. See the STR FORMAT and the CLEAR, GET, SET sections below.

       -h, --help
              output the usage message then exit. Since there is a  lot  of  information,  it  is
              split  into  two  pages.  The  most important is shown on the first page.  Use this
              option twice (e.g. '-hh') to output the second page. Note: the  --enumerate  option
              might  also be viewed as a help or usage type option. And like this option it has a
              "given twice" form: '-ee'.

       -H, --hex
              If the --get=STR  option  is  given  then  output  the  value  found  (if  any)  in
              hexadecimal,  with  a  leading  "0x". Otherwise output the response in hexadecimal;
              with a leading hex address/index at the start of each  line.   If  given  twice  an
              ASCII  rendering  is given to the right of each line. If given three or more times,
              the hexadecimal bytes only are output, 16 bytes (or less) on each line.
              Ignored when all elements from several dpages are being  accessed  (e.g.  when  the
              --join  option  is  used).  Also  see  the --raw option which may be used with this
              option.
              To dump one of more dpage responses to stdout in  ASCII  parsable  hexadecimal  use
              -HHH  or  -HHHH.  The  triple  H  form only outputs hexadecimal which is fine for a
              single dpage response. When all dpages are dumped (e.g.  with --page=all) then  the
              quad  H  form  adds the name of each dpage preceded by a hash mark ('#'). Hence the
              output of the quad H form is still parsable plus it is easier for users to view and
              possibly  edit.  Using  this option 5 times (e.g. -HHHHH) adds the page code in hex
              after the page's name in the comment before the hex rendering of that mode page.
              If the --inner-hex option is also given it changes the action of this  option.  See
              the  description  of the --inner-hex option. Giving both -HHHH (or greater) and the
              --inner-hex option is reported as an error.
              Note that the meaning of  '-H'  and  '-HH'  have  been  swapped  in  version  "2.72
              20230130"   for  compatibility  with  other  utilities  in  this  package  and  the
              description of this option in the sg3_utils(8) manpage.

       -I, --index=IIA
              where IIA is either an individual index (II) or an Element type  abbreviation  (A).
              See  the  INDEXES  section  below.  If  the  --page=PG option is not given then the
              Enclosure Status (or Control) dpage is assumed.  May be used with the --join option
              or  one  of  the  --clear=STR,  --get=STR  or  --set=STR  options. To enumerate the
              available Element type abbreviations use the --enumerate option.

       -I, --index=TIA,II
              where TIA,II is an type header index (TI) or Element type abbreviation (A) followed
              by an individual index (II). See the INDEXES section below. If the --page=PG option
              is not given then the Enclosure Status (or Control) dpage is assumed. May  be  used
              with  the  --join option or one of the --clear=STR, --get=STR or --set=STR options.
              To enumerate the available Element type abbreviations use the --enumerate option.

       -X, --inhex=FN
              where FN is a filename. It has the equivalent action of the --data=@FN  option.  If
              FN  is  '-'  then  stdin is read. This option has been given for compatibility with
              other utilities in this package that use --inhex=FN (or --in=FN) is a similar  way.
              See  the  "HEX,  BINARY AND JSON FORMATS" section in the sg3_utils manpage for more
              information.

       -i, --inner-hex
              the outer levels of a status dpage are decoded and printed out  but  the  innermost
              level(s)  (e.g.  the  Element Status Descriptor) is output in hex.  For dpages that
              depend on the Configuration dpage, its structure is taken into  account  with  this
              option, while when the --no-config option is used, its structure is ignored. Can be
              used with an indexing option and/or --join  options.  This  option  is  mainly  for
              debugging.
              This  option  may  also  be used with the --json[=JO] option to lessen the decoding
              dependency on other dpages. This option may be used twice in this context. See  the
              JSON INFORMATION section below.
              The  --hex option may be given with this option to control whether ASCII appears to
              the right of each hex line of bytes, or not. Without a --hex option, ASCII  appears
              to  the  right of each hex line of bytes; if the --hex option appear once, no ASCII
              rendering appears.

       -j, --join
              group elements from the Element Descriptor, Enclosure Status and Additional Element
              Status  dpages.  If  this option is given twice then elements from the Threshold In
              dpage are also grouped. The order is dictated by the Configuration dpage  but  that
              dpage is not explicitly shown.
              There  can be a bewildering amount of information in the "join" output. The default
              is to output everything. Several additional options are provided to  cut  down  the
              amount  displayed. If the indexing options is given, only the matching elements and
              their associated fields are output. The --filter option (see its  description)  can
              be  added  to  reduce the amount of output.  Also "--page=aes" (or "-p 0xa") can be
              added to suppress the output of rows that don't have a "aes" dpage  component.  See
              the INDEXES and DESCRIPTOR NAME, DEVICE SLOT NUMBER AND SAS ADDRESS sections below.
              This  option  implies  the  --status  option. Giving the --control option with this
              option is an error.

       -J[=JO], --json[=JO]
              output is in JSON format instead of plain text form. Note  that  arguments  to  the
              short  and  long  form are themselves optional and if present start with "=" and no
              whitespace is permitted around that "=".
              See sg3_utils_json manpage or use '?' for JO to get a summary.  For  more  specific
              information  about  JSON output with this utility, see the JSON INFORMATION section
              below.

       -Q, --js-file=JFN
              output is in JSON format and it is sent to a file named JFN. If  that  file  exists
              then it is truncated. By default, the JSON output is sent to stdout.
              When this option is given, the --json[=JO] option is implied and need not be given.
              The --json[=JO] option may still be needed to set the JO parameter  to  non-default
              values.

       -l, --list
              This option is equivalent to --enumerate. See that option.

       -M, --mask
              When  modifying  elements,  the  default  action  is a read (status element), mask,
              modify (based on --clear=STR or --set=STR) then write back as the control  element.
              The  mask step is new in sg_ses version 1.98 and is based on what is allowable (and
              in the same location) in draft SES-3 revision 6. Those masks may  evolve,  as  they
              have  in  the  past. This option re-instates the previous logic which was to ignore
              the mask step. The default action (i.e. without this option) is to perform the mask
              step in the read-mask-modify-write sequence.

       -m, --maxlen=LEN
              LEN is placed in the ALLOCATION LENGTH field of the SCSI RECEIVE DIAGNOSTIC RESULTS
              commands sent by the utility. It represents the maximum size of data the SES device
              can  return  (in bytes). It cannot exceed 65535 and defaults to 65532 (bytes). Some
              systems may not permit such large sizes hence the need for this option. If  LEN  is
              less  than 0 or greater than 65535 then an error is generated. If LEN is 0 then the
              default value is used, otherwise if it is less than 4 then it  is  ignored  (and  a
              warning is sent to stderr).

       -n, --nickname=SEN
              where SEN is the new Subenclosure Nickname. Only the first 32 characters (bytes) of
              SEN are used, if more are given they are  ignored.  See  the  SETTING  SUBENCLOSURE
              NICKNAME section below.

       -N, --nickid=SEID
              where  SEID  is  the  Subenclosure  identifier  that the new Nickname (SEN) will be
              applied to. So SEID must be an existing Subenclosure identifier. The default  value
              is 0 which is the main enclosure.

       -F, --no-config
              the Element status, Array status (obsolete), Element Descriptor, Additional element
              status and Threshold In dpages all depend on the Configuration dpage for  decoding.
              For debugging purposes, when there is something wrong with the relationship between
              these dpages,  it  may  be  useful  to  look  at  those  pages  without  using  the
              configuration  dpage.  That  is what this option does. Those dpages still have some
              structure that can be output without the Configuration dpage, but the  inner  parts
              are  typically  output  in  hex  when this option is given. This option is somewhat
              related to the --inner-hex option which is also useful for debugging.
              This option is ignored on dpages that don't  depend  on  the  Configuration  dpage,
              including the Configuration dpage itself.

       -y, --no-time
              this  utility  now  issues  a  SCSI  REPORT TIMESTAMP command just after an INQUIRY
              command at the start of its  execution.  This  enables  the  utility  to  output  a
              date-time  stamp  or  an uptime duration. The time value returned is in illiseconds
              from some epoch. If the value corresponds to a period of less than 3 years then  it
              is  considered  to  be  an  uptime  duration and is output in days, hours, minutes,
              seconds and milliseconds. Unix systems including Linux,  FreeBSD  and  Solaris  use
              00:00  on 1st January 1970 UTC as their epoch. The date-time stamp output is in RFC
              2822 date format on two adjacent lines, one in UTC and the other in local time.
              If for some reason calling the REPORT TIMESTAMP command causes a problem, then this
              option will disable this feature.
              Note that the time returned is from the enclosure, not the machine that the utility
              is executed from. This utility can use modern SCSI disks as  the  DEVICE  to  fetch
              that  disk't  timestamp;  this  utility  will  then  find thet the DEVICE is not an
              enclosure and exit without doing any harm.

       -p, --page=PG
              where PG is a dpage abbreviation or code (a number). If PG starts with a  digit  it
              is  assumed to be in decimal unless prefixed by 0x for hex. Valid range is 0 to 255
              (0x0 to 0xff) inclusive.  Default  is  dpage  'sdp'  which  is  page_code  0  (i.e.
              "Supported Diagnostic Pages") if no other options are given.
              Page code 0xff or abbreviation "all" is not a real dpage (as the highest real dpage
              is 0x3f) but instead causes all SES dpages whose page code is 0x2f or  less  to  be
              output.  This  can  be used with either the -HHHH or -rr to send either hexadecimal
              ASCII or binary respectively to  stdout.  If  an  error  is  detected  fetching  or
              decoding  a  diagnostic  page it is noted, the rest of the pages are processed then
              the deferred error is reported in the exit status. If the  --warn  option  is  also
              given then --page=all will exit immediately when an error is detected.
              To  list  the available dpage abbreviations give "xxx" for PG; the same information
              can also be found with the --enumerate option.

       -q, --quiet
              this suppresses the number of warnings and messages output. The exit status of  the
              utility is unaffected by this option.

       -r, --raw
              outputs  the  chosen  status  dpage  in  ASCII hex in a format suitable for a later
              invocation using the --data= option. A dpage less its first 4 bytes (page code  and
              length)  is output. When used twice (e.g. -rr) the full dpage contents is output in
              binary to stdout.
              Note that the use of a single --raw option is different from most  other  utilities
              in the sg3_utils package.
              When  -rr  is used together with the --data=-, --data=@FN, or --inhex=FN then stdin
              or file FN is decoded as a binary stream that continues to be read until an end  of
              file  (EOF). Once that data is read then the internal raw option is cleared to 0 so
              the output is not effected. So the -rr option  either  changes  how  the  input  or
              output is treated, but not both in a single invocation.

       -R, --readonly
              open the DEVICE read-only (e.g. in Unix with the O_RDONLY flag).  The default is to
              open it read-write.

       -A, --sas-addr=SA
              this is an indexing method for SAS end devices (e.g. SAS disks). The  utility  will
              try  to  find  the element or slot in the Additional Element Status dpage whose SAS
              address matches SA. For a SAS disk or tape that SAS  address  is  its  target  port
              identifier  for  the  port  connected  to that element or slot.  Most SAS disks and
              tapes have two such target ports, usually numbered consecutively.
              SATA  devices  in  a  SAS  enclosure  often  receive  "manufactured"  target   port
              identifiers  from  a  SAS expander; typically will have a SAS address close to, but
              different from, the SAS address of the expander itself. Note that this manufactured
              target port identifier is different from a SATA disk's WWN.
              SA  is a hex number that is up to 8 digits long. It may have a leading '0x' or '0X'
              or a trailing 'h' or 'H'. This option is a medium level indexing alternative to the
              low  level  --index=  options.  See the DESCRIPTOR NAME, DEVICE SLOT NUMBER AND SAS
              ADDRESS section below.

       -S, --set=STR
              Used to set an element field in the Enclosure Control or Threshold Out dpage.  Must
              be used together with an indexing option to specify which element is to be changed.
              The Enclosure Control dpage is assumed if the --page=PG option is  not  given.  See
              the STR FORMAT and CLEAR, GET, SET sections below.

       -s, --status
              will  fetch dpage from the DEVICE via a SCSI RECEIVE DIAGNOSTIC RESULTS command (or
              from --data=@FN). In the absence of other options  that  imply  modifying  a  dpage
              (e.g.   --control  or  --set=STR) then --status is assumed, except when the --data=
              option is given.  When the --data= option is given  there  is  no  default  action:
              either  the  --control  or this option must be given to distinguish between the two
              different ways that data will be treated.

       -v, --verbose
              increase the level of verbosity. For example when this option is given  four  times
              (in  which  case  the  short form is more convenient: '-vvvv') then if the internal
              join array has been generated then it is output to stderr in a  form  suitable  for
              debugging.

       -V, --version
              print the version string and then exit.

       -w, --warn
              warn  about  certain  irregularities  with  warnings  sent to stderr. The join is a
              complex operation that requires fields from several dpages to be synchronized.  The
              quality  of  SES  devices vary and to be fair, the descriptions from T10 drafts and
              standards have been tweaked several times (see the EIIOE field) in order  to  clear
              up confusion.
              This  option  will  cause  fetching  all  dpages with the --page=all option to exit
              immediately when an error is detected.

INDEXES

       An enclosure can have information about its disk and tape  drives  plus  other  supporting
       components  like  power  supplies  spread  across  several  dpages.  Addressing a specific
       element (overall or individual) within a dpage is complicated. This section describes  low
       level  indexing  (i.e.  choosing  a single element (or a group of related elements) from a
       large number of elements). If available,  the  medium  level  indexing  described  in  the
       following  section  (DESCRIPTOR NAME, DEVICE SLOT NUMBER AND SAS ADDRESS) might be simpler
       to use.

       The Configuration dpage is key to  low  level  indexing:  it  contains  a  list  of  "type
       headers",  each of which contains an Element type (e.g. Array Device Slot), a Subenclosure
       identifier  (0  for  the  primary  enclosure)  and  a  "Number  of   possible   elements".
       Corresponding  to  each  type header, the Enclosure Status dpage has one "overall" element
       plus "Number of possible elements" individual elements all of which have the given Element
       type.  For some Element types the "Number of possible elements" will be 0 so the Enclosure
       Status dpage has only one "overall" element corresponding to that type header. The Element
       Descriptor  dpage  and  the  Threshold (In and Out) dpages follow a similar pattern as the
       Enclosure Status dpage.

       The numeric index corresponding to the overall element is "-1". If the Configuration dpage
       indicates a particular element type has "n" elements then its indexes range from -1 to n-1
       .

       The Additional Element Status dpage is a bit more complicated. It has entries for  "Number
       of  possible elements" of certain Element types. It does not have entries corresponding to
       the "overall" elements. To make the correspondence a little  clearer  each  descriptor  in
       this  dpage  optionally contains an "Element Index Present" (EIP) indicator. If EIP is set
       then each element's "Element Index" field refers to  the  position  of  the  corresponding
       element in the Enclosure Status dpage.

       Addressing  a  single  overall  element  or  a  single individual element is done with two
       indexes: TI and II. TI=0 corresponds to the first type header entry which must be a Device
       Slot  or  Array Device Slot Element type (according to the SES-2 standard). To address the
       corresponding overall instance, II is set to -1, otherwise II can be set to the individual
       instance  index.  As  an  alternative  to  the  type  header  index  (TI), an Element type
       abbreviation (A) (e.g. "ps" for Power Supply Element type) optionally followed by a number
       (e.g.  "ps" refers to the first Power Supply Element type; "ps1" refers to the second) can
       be given.

       One of two command lines variants can be used to specify indexes: --index=TIA,II where TIA
       is  either  an  type  header  index (TI) or an Element type abbreviation (A) (e.g. "ps" or
       "ps1"). II is either an individual index or "-1"  to  specify  the  overall  element.  The
       second  variant  is --index=IIA where IIA is either an individual index (II) or an Element
       type abbreviation (A). When IIA is an individual index then the option  is  equivalent  to
       --index=0,II.  When  IIA  is an Element type abbreviation then the option is equivalent to
       --index=A,-1.

       Wherever an individual index is applicable, it can be  replaced  by  an  individual  index
       range.  It  has  the form: <first_ii>:<last_ii>. For example: '3:5' will select individual
       indexes 3, 4 and 5 . Note that the range -1:255 represents all  possible  elements  of  an
       element  type  and  is  not  an  error,  only  those  element that exist will be selected.
       Previously '-' was used as an index range separator but that leads to awkward syntax  like
       -1-1 for indexes: -1 (overall element), 0 and 1 (individual elements).

       To cope with vendor specific Element types (whose type codes should be in the range 128 to
       255) the Element type code can be given as a number with a leading underscore. For example
       these are equivalent: --index=arr and --index=_23 since the Array Device Slot Element type
       code is 23.  Also --index=ps1 and --index=_2_1 are equivalent.

       Another example: if the first type header in the Configuration dpage has has Array  Device
       Slot  Element  type  then --index=0,-1 is equivalent to --index=arr. Also --index=arr,3 is
       equivalent to --index=3.

       The --index= option is used to reduce the amount of output (e.g. only showing the  element
       associated  with  the second 12 volt power supply). It may also be used together with with
       the --clear=STR, --get=STR and --set=STR options which are described in  the  STR  section
       below.

DESCRIPTOR NAME, DEVICE SLOT NUMBER AND SAS ADDRESS

       The  three  options:  --descriptor=DES,  --dev-slot-num=SN  and --sas-addr=SA allow medium
       level indexing, as an alternative to the low level --index= option. Only one of the  three
       options  can  be  used  in an invocation. When either of these three option is used a join
       operation is performed (but not displayed) before element selection takes place.

       These medium level indexing options need support from the SES device and that  support  is
       optional.  For example the --descriptor=DES needs the Element Descriptor dpage provided by
       the SES device however that is optional.  Also the provided descriptor names  need  to  be
       useful,  and  having  descriptor  names  which  are  all "0" is not very useful. Also some
       elements (e.g. overall elements) may not have descriptor names.

       These medium level indexing options can be used to reduce the amount of output (e.g.  only
       showing  the  elements  related  to device slot number 3).  They may also be used together
       with with the --clear=STR, --get=STR and --set=STR options  which  are  described  in  the
       following  section.  Note that even if a field can be set (e.g. "do not remove" (dnr)) and
       that field can be read back with --get=STR confirming that  change,  the  disk  array  may
       still ignore it (e.g. because it does not have the mechanism to lock the disk drawer).

STR FORMAT

       The  STR  operands  of  the --clear=STR, --get=STR and --set=STR options all have the same
       structure. There are two forms:

             <acronym>[=<value>]
             <start_byte>:<start_bit>[:<num_bits>][=<value>]

       The <acronym> is one of a list of common  fields  (e.g.  "ident"  and  "fault")  that  the
       utility converts internally into the second form. The <start_byte> is usually in the range
       0 to 3, the <start_bit> must be in the range 0 to 7 and the  <num_bits>  must  be  in  the
       range  1  to 64 (default 1). The number of bits are read in the left to right sense of the
       element tables shown in the various SES draft documents. For example the 8 bits of byte  2
       would  be  represented  as  2:7:8  with  the  most significant bit being 2:7 and the least
       significant bit being 2:0 .

       The <value> is optional but is ignored  if  provided  to  --get=STR.   For  --set=STR  the
       default  <value> is 1 while for --clear=STR the default value is 0 . <value> is assumed to
       be decimal, hexadecimal values can be given in the normal fashion.

       The supported list of <acronym>s can be viewed by using the --enumerate option  twice  (or
       "-ee").

CLEAR, GET, SET

       The  --clear=STR,  --get=STR  and  --set=STR options can be used up to 8 times in the same
       invocation. Any <acronym>s used in the STR operands must refer to the same dpage.

       When multiple of these options are used (maximum: 8), they are applied  in  the  order  in
       which  they  appear on the command line. So if options contradict each other, the last one
       appearing on the command line will be enforced. When there are  multiple  --clear=STR  and
       --set=STR options, then the dpage they refer to is only written after the last one.

DATA SUPPLIED

       This  section describes the two scenarios that can occur when the --data= option is given.
       These scenarios are the same irrespective of whether the argument to the --data= option is
       a  string  of hex bytes on the command line, stdin (indicated by --data=-) or names a file
       (e.g. --data=@thresh_in_dpage.hex).

       The first scenario is flagged by the --control option. It uses the supplied data to  build
       a  'control'  dpage  that  will  be sent to the DEVICE using the SCSI SCSI SEND DIAGNOSTIC
       command. The supplied dpage data should not include its first 4 bytes. Those 4  bytes  are
       added  by  this  utility  using  the --page=PG option with PG placed at byte offset 0). If
       needed, the --byte1=B1 option sets byte offset 1, else 0 is placed in that  position.  The
       number  of bytes decoded from the data provided (i.e. its length) goes into byte offsets 2
       and 3.

       The second scenario is flagged by the --status option (or the  absence  of  the  --control
       option).  It  decodes the supplied data assuming that it represents the response to one or
       more SCSI RECEIVE  DIAGNOSTIC  RESULTS  commands.  Those  responses  have  typically  been
       captured  from some earlier invocation(s) of this utility. Those earlier invocations could
       use the '-HHH' or '-HHHH' option  and  file  redirection  to  capture  that  response  (or
       responses)  in  hexadecimal.  The supplied dpage response data is decoded according to the
       other command line options. For example the --join option could be given  and  that  would
       require the data from multiple dpages typically:  Configuration, Enclosure status, Element
       descriptor and Additional element status dpages. If in doubt use --page=all in the capture
       phase; having more dpages than needed is not a problem.

       By  default  the user supplied data is assumed to be ASCII hexadecimal in lines that don't
       exceed 512 characters. Anything on a line from and including a hash mark ('#') to the  end
       of  line is ignored. An end of line can be a LF or CR,LF and blank lines are ignored. Each
       separated pair (or single) hexadecimal digits represent a byte (and neither a leading '0x'
       nor  a  trailing  'h'  should be given). Separators are either space, tab, comma or end of
       line.

       Alternatively binary  can  be  used  and  this  is  flagged  by  the  '-rr'  option.   The
       --data=H,H...  form  cannot  use  binary  values for the 'H's, only ASCII hexadecimal. The
       other two forms (--data=- and --data=@FN) may contain binary  data.  Note  that  when  the
       '-rr'  option is used with --data=@FN that it only changes the interpretation of the input
       data, it does not change the decoding and output representation.

CHANGING STATE

       This utility has various techniques for changing the state of  a  SES  device.   As  noted
       above this is typically a read-modify-write type operation.  Most modifiable dpages have a
       "status" (or "in") page that can be read, and a corresponding "control" (or  "out")  dpage
       that can be written back to change the state of the enclosure.

       The lower level technique provided by this utility involves outputting a "status" dpage in
       hex with --raw. Then a text editor can be used  to  edit  the  hex  (note:  to  change  an
       Enclosure  Control descriptor the SELECT bit needs to be set). Next the control dpage data
       can fed back with the  --data=H,H...  option  together  with  the  --control  option;  the
       --byte1=B1 option may need to be given as well.

       Changes  to  the  Enclosure  Control  dpage (and the Threshold Out dpage) can be done at a
       higher level. This involves choosing a dpage (the default in this case  is  the  Enclosure
       Control  dpage).  Next  choose an individual or overall element index (or name it with its
       Element Descriptor string). Then give the element's name (e.g. "ident" for RQST IDENT)  or
       its  position within that element (e.g. in an Array Device Slot Control element RQST IDENT
       is byte 2, bit 1 and 1 bit long ("2:1:1")). Finally a value can be given, if not the value
       for --set=STR defaults to 1 and for --clear=STR defaults to 0.

SETTING SUBENCLOSURE NICKNAME

       The  format of the Subenclosure Nickname control dpage is different from its corresponding
       status dpage. The status  dpage  reports  all  Subenclosure  Nicknames  (and  Subenclosure
       identifier  0 is the main enclosure) while the control dpage allows only one of them to be
       changed. Therefore using the --data option technique to change a Subenclosure nickname  is
       difficult (but still possible).

       To  simplify changing a Subenclosure nickname the --nickname=SEN and --nickid=SEID options
       have been added. If the SEN string contains spaces or  other  punctuation,  it  should  be
       quoted:  surrounded  by  single or double quotes (or the offending characters escaped). If
       the --nickid=SEID is not given then a Subenclosure identifier of 0 is assumed. As a  guard
       the  --control  option  must  also  be  given.  If  the --page=PG option is not given then
       --page=snic is assumed.

       When --nickname=SEN is given then the Subenclosure Nickname Status dpage is read to obtain
       the  Generation  Code field. That Generation Code together with no more than 32 bytes from
       the Nickname (SEN) and the Subenclosure Identifier (SEID) are written to the  Subenclosure
       Nickname Control dpage.

       There is an example of changing a nickname in the EXAMPLES section below.

NVME ENCLOSURES

       Support  has  been added to sg_ses (actually, its underlying library) for NVMe (also known
       as NVM Express) Enclosures. It can be considered experimental in sg3_utils package version
       1.43 and sg_ses version 2.34 .

       This  support  is  based  on  a  decision  by NVME-MI (Management Interface) developers to
       support the SES-3 standard. This was facilitated  by  adding  NVME-MI  SES  Send  and  SES
       Receive commands that tunnel dpage contents as used by SES.

JSON INFORMATION

       The  approach  taken  with  JSON  output (i.e. when the --json[=JO] option is given) is to
       output diagnostic page information unless the --join option is given. A  problem  specific
       to  SES  is that many diagnostic pages depend on other diagnostic pages (e.g. decoding the
       Enclosure Status and the Element  Descriptor  dpages  both  depend  on  the  Configuration
       dpage).

       When the --json[=JO] and --page=PG options are used in the same invocation, then if PG has
       any dependencies on other diagnostic pages,  then  those  other  pages  are  fetched.  For
       example  the  Element  Descriptor  dpage depends on the Configuration dpage. In some cases
       (e.g. dpages misconfigured or in the process of being changed) it may be useful to  decode
       whatever  is  possible,  without fetching other dpages. The --inner-hex option may be used
       for this. Some dpages (e.g.  Enclosure Status dpage) cannot be  decoded  at  all,  without
       fetching  the  Configuration  dpage,  so each 4 byte element will be output in hex. In the
       case of the Element Descriptor dpage, the descriptors may be output in ASCII and are  when
       the  --inner-hex option is given once. If the --inner-hex option is given twice, then each
       descriptor will be output in hex.

       When the --json[=JO] and --page=PG options are used in the same invocation, then  the  top
       level   object   name   is   the   name  of  PG  in  snake  notation.  This  includes  the
       "_diagnostic_page" suffix.

       When the --json[=JO] and --join options are used in the same invocation (and the --page=PG
       option is _not_ given), then the top level object name is "join_of_diagnostic_pages" which
       contain a (JSON) array named "element_list". Each element in that  array  starts  with  an
       "element_type"   field   followed   by   "descriptor"  and  "element_number"  fields.  The
       "descriptor" field's value is a string. All elements  with  the  same  "element_type"  are
       grouped  together starting with the "overall_element" first.  The "overall_element" has an
       "element_number" value of -1. Individual elements of the same "element_type"  are  in  the
       following  "element_list"  array elements start with an "element_number" value of 0. After
       the "element_number" field there is a "overall" field with an integer value of 0  (for  an
       "individual"  element)  or  a value of 1 (for "overall" element).  To reinforce that point
       there is a "individual" field with a boolean value of true (for an  "individual"  element)
       or   false.   Next  there  is  an  object  named  "status_descriptor"  that  contains  the
       corresponding "Enclosure Status"  dpage's  Enclosure  status  element.  As  required,  the
       corresponding Additional element status, Element descriptor by type element, and Threshold
       status descriptors may also appear.

       The plain text output (which is output by default) tends to trim output  when  a  line  of
       element  values  are all 0. On the other hand when JSON output is chosen, all fields, that
       meet the requirements of the command line options, are output.

NOTES

       This utility can be used to fetch arbitrary (i.e. non SES) dpages  (using  the  SCSI  READ
       DIAGNOSTIC  command).  To  this  end the --page=PG and --hex options would be appropriate.
       Non-SES dpages can be sent to a device with the sg_senddiag utility.

       The most troublesome part of the join operation is associating Additional  Element  Status
       descriptors  correctly.  At  least  one  SES  device  vendor  has misinterpreted the SES-2
       standard, specifically with its "element index" field interpretation.  The  code  in  this
       utility  interprets the "element index" field as per the SES-2 standard and if that yields
       an  inappropriate  Element  type,  adjusts  its   indexing   to   follow   that   vendor's
       misinterpretation.  The  SES-3  drafts  have  introduced the EIIOE (Element Index Includes
       Overall Elements) bit which later became a 2 bit field to resolve this ambiguity. See  the
       --eiioe=A_F option.

       In  draft  SES-3 revision 5 the "Door Lock" element name was changed to the "Door" (and an
       OPEN field was added to the status element). As a consequence the former 'dl' element type
       abbreviation has been changed to 'do'.

       Some  RAID  controllers hide SES device nodes from the host Operating System.  It has been
       reported that some MegaRAID controllers do this and the following  command  is  needed  to
       expose them:

          perccli /cx set backplane expose=<on/off>

       where perccli is Dell's version of BroadCom's (LSI) storcli utility.

       There  is a related command set called SAF-TE (SCSI attached fault-tolerant enclosure) for
       enclosure (including RAID) status and control. SCSI devices  that  support  SAF-TE  report
       "Processor"  peripheral  device  type  (0x3)  in  their INQUIRY response. See the sg_safte
       utility in this package or the safte-monitor utility on the Internet.

       The internal join array is  statically  allocated  and  its  size  is  controlled  by  the
       MX_JOIN_ROWS define. Its current value is 520.

EXAMPLES

       Examples can also be found at https://sg.danny.cz/sg/sg_ses.html

       The  following  examples  use  Linux  device  names.  For  suitable  device names in other
       supported Operating Systems see the sg3_utils(8) man page.

       To view the supported dpages:

          sg_ses /dev/bsg/6:0:2:0

       To view the Configuration Diagnostic dpage:

          sg_ses --page=cf /dev/bsg/6:0:2:0

       To view the Enclosure Status dpage:

          sg_ses --page=es /dev/bsg/6:0:2:0

       To get the (attached) SAS address of that device (which is held in the Additional  Element
       Sense dpage (dpage 10)) printed on hex:

          sg_ses -p aes -D ArrayDevice07 -G at_sas_addr -H /dev/sg3

       To  collate  the  information  in  the Enclosure Status, Element Descriptor and Additional
       Element Status dpages the --join option can be used:

          sg_ses --join /dev/sg3

       This will produce a lot of output. To filter out lines that don't contain much information
       add the --filter option:

          sg_ses --join --filter /dev/sg3

       Fields  in  the  various  elements  of  the  Enclosure Control and Threshold dpages can be
       changed with the --clear=STR and --set=STR options. [All modifiable dpages can be  changed
       with  the  --raw  and  --data=H,H...  options.]  The following example looks at making the
       "ident" LED (also called "locate") flash on "ArrayDevice07"  which  is  a  disk  (or  more
       precisely the carrier drawer the disk is in):

          sg_ses --index=7 --set=2:1:1 /dev/sg3

       In  the  above invocation, the --set= option implies --control so the latter does not need
       to be given. The same applies to --clear=. On the other hand  the  --get=  option  implies
       --status .
       If  the  Element  Descriptor diagnostic dpage shows that "ArrayDevice07" is the descriptor
       name associated with element index 7 then this invocation is equivalent  to  the  previous
       one:

          sg_ses --descriptor=ArrayDevice07 --set=2:1:1 /dev/sg3

       Further  the  byte  2, bit 1 (for 1 bit) field in the Array Device Slot Control element is
       RQST IDENT for asking a disk carrier to flash a LED so it can be  located.  In  this  case
       "ident" (or "locate") is accepted as an acronym for that field:

          sg_ses --descriptor=ArrayDevice07 --set=ident /dev/sg3

       To stop that LED flashing:

          sg_ses --dev-slot-num=7 --clear=ident /dev/sg3

       The above assumes the descriptor name 'ArrayDevice07' corresponds to device slot number 7.

       Now  for  an example of a more general but lower level technique for changing a modifiable
       diagnostic dpage. The String (In and Out) diagnostics dpage is relatively simple (compared
       with the Enclosure Status/Control dpage). However the use of this lower level technique is
       awkward involving three steps: read, modify then write. First  check  the  current  String
       (In) dpage contents:

          sg_ses --page=str /dev/bsg/6:0:2:0

       Now  the  "read"  step.  The  following command will send the contents of the String dpage
       (from byte 4 onwards) to stdout. The output will be in ASCII hex with pairs of hex  digits
       representing  a byte, 16 pairs per line, space separated. The redirection puts stdout in a
       file called "t":

          sg_ses --page=str --raw /dev/bsg/6:0:2:0 > t

       Then with the aid of the SES-3 document (in revision 3: section 6.1.6) use your  favourite
       editor to change t. The changes can be sent to the device with:

          sg_ses --page=str --control --data=- /dev/bsg/6:0:2:0 < t

       If the above is successful, the String dpage should have been changed. To check try:

          sg_ses --page=str /dev/bsg/6:0:2:0

       To change the nickname on the main enclosure:

          sg_ses --nickname='1st enclosure' --control /dev/bsg/6:0:2:0

       To  capture  the  whole state of an enclosure (from a SES perspective) for later analysis,
       this can be done:

          sg_ses --page=all -HHHH /dev/sg5 > enc_sg5_all.hex

       Note that if there are errors or warnings they will be sent to stderr so they will  appear
       on  the  command  line  (since only stdout is redirected).  A text editor could be used to
       inspect enc_sg5_all.hex . If all looks in order at  some  later  time,  potentially  on  a
       different machine where enc_sg5_all.hex has been copied, a "join" could be done. Note that
       join reflects the state of the enclosure when the capture was done.

          sg_ses --data=@enc_sg5_all.hex --status --join

       The above invocation can also be expressed as:
          sg_ses --inhex=enc_sg5_all.hex --join

       The --join option implies --status .

EXIT STATUS

       The exit status of sg_ses is 0 when it is successful. Otherwise see the  sg3_utils(8)  man
       page.

AUTHORS

       Written by Douglas Gilbert.

REPORTING BUGS

       Report bugs to <dgilbert at interlog dot com>.

COPYRIGHT

       Copyright © 2004-2023 Douglas Gilbert
       This  software is distributed under a BSD-2-Clause license. There is NO warranty; not even
       for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

SEE ALSO

       sg_inq, sg_safte,  sg_senddiag,  sg_ses_microcode,  sg3_utils  (sg3_utils);  safte-monitor
       (Internet)