Index: head/usr.sbin/Makefile =================================================================== --- head/usr.sbin/Makefile (revision 287472) +++ head/usr.sbin/Makefile (revision 287473) @@ -1,356 +1,357 @@ # From: @(#)Makefile 5.20 (Berkeley) 6/12/93 # $FreeBSD$ .include SUBDIR= adduser \ arp \ binmiscctl \ bsdconfig \ cdcontrol \ chkgrp \ chown \ chroot \ ckdist \ clear_locks \ crashinfo \ cron \ ctladm \ ctld \ daemon \ dconschat \ devctl \ devinfo \ digictl \ diskinfo \ dumpcis \ extattr \ extattrctl \ fifolog \ fstyp \ fwcontrol \ getfmac \ getpmac \ gstat \ i2c \ ifmcstat \ iostat \ iovctl \ kldxref \ mailwrapper \ makefs \ memcontrol \ mergemaster \ mfiutil \ mixer \ mlxcontrol \ mountd \ mptutil \ mtest \ ${_mtree} \ newsyslog \ nfscbd \ nfsd \ nfsdumpstate \ nfsrevoke \ nfsuserd \ nmtree \ nologin \ ${_pc_sysinstall} \ pciconf \ periodic \ powerd \ procctl \ pstat \ pw \ pwd_mkdb \ quot \ rarpd \ rmt \ rpcbind \ rpc.lockd \ rpc.statd \ rpc.umntall \ rtprio \ service \ services_mkdb \ + sesutil \ setfib \ setfmac \ setpmac \ smbmsg \ snapinfo \ spray \ syslogd \ sysrc \ tcpdrop \ tcpdump \ traceroute \ trpt \ tzsetup \ uefisign \ ugidfw \ vigr \ vipw \ wake \ watch \ watchdogd \ zic # NB: keep these sorted by MK_* knobs .if ${MK_ACCT} != "no" SUBDIR+= accton SUBDIR+= sa .endif .if ${MK_AMD} != "no" SUBDIR+= amd .endif .if ${MK_AUDIT} != "no" SUBDIR+= audit SUBDIR+= auditd .if ${MK_OPENSSL} != "no" SUBDIR+= auditdistd .endif SUBDIR+= auditreduce SUBDIR+= praudit .endif .if ${MK_AUTHPF} != "no" SUBDIR+= authpf .endif .if ${MK_AUTOFS} != "no" SUBDIR+= autofs .endif .if ${MK_BLUETOOTH} != "no" SUBDIR+= bluetooth .endif .if ${MK_BOOTPARAMD} != "no" SUBDIR+= bootparamd .endif .if ${MK_BSDINSTALL} != "no" SUBDIR+= bsdinstall .endif .if ${MK_BSNMP} != "no" SUBDIR+= bsnmpd .endif .if ${MK_CTM} != "no" SUBDIR+= ctm .endif .if ${MK_FLOPPY} != "no" SUBDIR+= fdcontrol SUBDIR+= fdformat SUBDIR+= fdread SUBDIR+= fdwrite .endif .if ${MK_FMTREE} != "no" SUBDIR+= mtree .endif .if ${MK_FREEBSD_UPDATE} != "no" SUBDIR+= freebsd-update .endif .if ${MK_GSSAPI} != "no" SUBDIR+= gssd .endif .if ${MK_GPIO} != "no" SUBDIR+= gpioctl .endif .if ${MK_INET6} != "no" SUBDIR+= ip6addrctl SUBDIR+= mld6query SUBDIR+= ndp SUBDIR+= rip6query SUBDIR+= route6d SUBDIR+= rrenumd SUBDIR+= rtadvctl SUBDIR+= rtadvd SUBDIR+= rtsold SUBDIR+= traceroute6 .endif .if ${MK_INETD} != "no" SUBDIR+= inetd .endif .if ${MK_IPFW} != "no" SUBDIR+= ipfwpcap .endif .if ${MK_ISCSI} != "no" SUBDIR+= iscsid .endif .if ${MK_JAIL} != "no" SUBDIR+= jail SUBDIR+= jexec SUBDIR+= jls .endif # XXX MK_SYSCONS .if ${MK_LEGACY_CONSOLE} != "no" SUBDIR+= kbdcontrol SUBDIR+= kbdmap SUBDIR+= moused SUBDIR+= vidcontrol .endif .if ${MK_LIBTHR} != "no" || ${MK_LIBPTHREAD} != "no" .if ${MK_PPP} != "no" SUBDIR+= pppctl .endif .if ${MK_NS_CACHING} != "no" SUBDIR+= nscd .endif .endif .if ${MK_LPR} != "no" SUBDIR+= lpr .endif .if ${MK_MAN_UTILS} != "no" SUBDIR+= manctl .endif .if ${MK_NAND} != "no" SUBDIR+= nandsim SUBDIR+= nandtool .endif .if ${MK_NETGRAPH} != "no" SUBDIR+= flowctl SUBDIR+= lmcconfig SUBDIR+= ngctl SUBDIR+= nghook .endif .if ${MK_NIS} != "no" SUBDIR+= rpc.yppasswdd SUBDIR+= rpc.ypupdated SUBDIR+= rpc.ypxfrd SUBDIR+= ypbind SUBDIR+= yp_mkdb SUBDIR+= yppoll SUBDIR+= yppush SUBDIR+= ypserv SUBDIR+= ypset .endif .if ${MK_NTP} != "no" SUBDIR+= ntp .endif .if ${MK_OPENSSL} != "no" SUBDIR+= keyserv .endif .if ${MK_PC_SYSINSTALL} != "no" _pc_sysinstall= pc-sysinstall .endif .if ${MK_PF} != "no" SUBDIR+= ftp-proxy .endif .if ${MK_PKGBOOTSTRAP} != "no" SUBDIR+= pkg .endif # XXX MK_TOOLCHAIN? .if ${MK_PMC} != "no" SUBDIR+= pmcannotate SUBDIR+= pmccontrol SUBDIR+= pmcstat SUBDIR+= pmcstudy .endif .if ${MK_PORTSNAP} != "no" SUBDIR+= portsnap .endif .if ${MK_PPP} != "no" SUBDIR+= ppp .endif .if ${MK_QUOTAS} != "no" SUBDIR+= edquota SUBDIR+= quotaon SUBDIR+= repquota .endif .if ${MK_RCMDS} != "no" SUBDIR+= rwhod .endif .if ${MK_RCS} != "no" SUBDIR+= etcupdate .endif .if ${MK_SENDMAIL} != "no" SUBDIR+= editmap SUBDIR+= mailstats SUBDIR+= makemap SUBDIR+= praliases SUBDIR+= sendmail .endif .if ${MK_TCP_WRAPPERS} != "no" SUBDIR+= tcpdchk SUBDIR+= tcpdmatch .endif .if ${MK_TESTS} != "no" SUBDIR+= tests .endif .if ${MK_TIMED} != "no" SUBDIR+= timed .endif .if ${MK_TOOLCHAIN} != "no" SUBDIR+= config SUBDIR+= crunch .endif .if ${MK_UNBOUND} != "no" SUBDIR+= unbound .endif .if ${MK_USB} != "no" SUBDIR+= uathload SUBDIR+= uhsoctl SUBDIR+= usbconfig SUBDIR+= usbdump .endif .if ${MK_UTMPX} != "no" SUBDIR+= ac SUBDIR+= lastlogin SUBDIR+= utx .endif .if ${MK_WIRELESS} != "no" SUBDIR+= ancontrol SUBDIR+= wlandebug SUBDIR+= wpa .endif .include SUBDIR:= ${SUBDIR:O} SUBDIR_PARALLEL= .include Index: head/usr.sbin/sesutil/Makefile =================================================================== --- head/usr.sbin/sesutil/Makefile (nonexistent) +++ head/usr.sbin/sesutil/Makefile (revision 287473) @@ -0,0 +1,6 @@ +# $FreeBSD$ + +PROG= sesutil +MAN= sesutil.8 + +.include Property changes on: head/usr.sbin/sesutil/Makefile ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/usr.sbin/sesutil/sesutil.8 =================================================================== --- head/usr.sbin/sesutil/sesutil.8 (nonexistent) +++ head/usr.sbin/sesutil/sesutil.8 (revision 287473) @@ -0,0 +1,73 @@ +.\" Copyright (c) 2015 Baptiste Daroussin +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd September 1, 2015 +.Dt SESUTIL 8 +.Os +.Sh NAME +.Nm sesutil +.Nd Utility for managing SCSI Enclosure Services (SES) device +.Sh SYNOPSIS +.Nm +.Cm locate Ar disk Bq on|off +.Sh DESCRIPTION +The +.Nm +utility can be used to modify various parameter on SCSI Enclosure Services +(SES) device. +.Pp +List of supported commands: +.Bl -tag -width indent +.It Cm locate Ar disk Bq on|off +Change the state of the external LED associated with +.Ar disk . +.Ar disk +can be the device name of the disk, like +.Cm da12 , +or +.Cm all . +to indicate all disks attached to SES controllers. +.El +.Sh EXAMPLES +Turn off all external LEDs: +.Pp +.Dl Nm Cm locate all off +.Pp +Turn on the external LED of drive +.Pa da15 : +.Pp +.Dl Nm Cm locate da15 on +.Sh SEE ALSO +.Xr ses 4 +.Sh HISTORY +The +.Nm +utility first appeared in +.Fx 11.0 . +.Sh AUTHORS +The +.Nm utility was written by +.An Baptiste Daroussin Aq Mt bapt@FreeBSD.org . Property changes on: head/usr.sbin/sesutil/sesutil.8 ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/usr.sbin/sesutil/sesutil.c =================================================================== --- head/usr.sbin/sesutil/sesutil.c (nonexistent) +++ head/usr.sbin/sesutil/sesutil.c (revision 287473) @@ -0,0 +1,225 @@ +/*- + * Copyright (c) 2015 Baptiste Daroussin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +static int locate(int argc, char **argv); + +static struct command { + const char *name; + const char *desc; + int (*exec)(int argc, char **argv); +} cmds[] = { + { "locate", "Change the state of the external LED associated with a" + " disk", locate} , +}; + +static const int nbcmds = nitems(cmds); + +static void +do_locate(int fd, unsigned int idx, bool onoff) +{ + encioc_elm_status_t o; + + o.elm_idx = idx; + if (ioctl(fd, ENCIOC_GETELMSTAT, (caddr_t) &o) < 0) { + close(fd); + err(EXIT_FAILURE, "ENCIOC_GETELMSTAT"); + } + o.cstat[0] |= 0x80; + if (onoff) + o.cstat[2] |= 0x02; + else + o.cstat[2] &= 0xfd; + + if (ioctl(fd, ENCIOC_SETELMSTAT, (caddr_t) &o) < 0) { + close(fd); + err(EXIT_FAILURE, "ENCIOC_SETELMSTAT"); + } +} + +static bool +disk_match(const char *devnames, const char *disk, size_t len) +{ + const char *devname; + + devname = devnames; + while ((devname = strstr(devname, disk)) != NULL) { + if (devname[len] == '\0' || devname[len] == ',') + return (true); + devname++; + } + return (false); +} + +static int +locate(int argc, char **argv) +{ + encioc_elm_devnames_t objdn; + encioc_element_t *objp; + glob_t g; + char *disk; + size_t len, i; + int fd, nobj, j; + bool all = false; + bool locate; + + if (argc != 2) { + errx(EXIT_FAILURE, "usage: %s locate [disk] [on|off]", + getprogname()); + } + + disk = argv[0]; + + if (strcmp(argv[1], "on") == 0) { + locate = true; + } else if (strcmp(argv[1], "off") == 0) { + locate = false; + } else { + errx(EXIT_FAILURE, "usage: %s locate [disk] [on|off]", + getprogname()); + } + + if (strcmp(disk, "all") == 0) { + all = true; + } + len = strlen(disk); + + /* Get the list of ses devices */ + if (glob("/dev/ses[0-9]*", 0, NULL, &g) == GLOB_NOMATCH) { + globfree(&g); + errx(EXIT_FAILURE, "No SES devices found"); + } + for (i = 0; i < g.gl_pathc; i++) { + /* ensure we only got numbers after ses */ + if (strspn(g.gl_pathv[i] + 8, "0123456789") != + strlen(g.gl_pathv[i] + 8)) + continue; + if ((fd = open(g.gl_pathv[i], O_RDWR)) < 0) { + if (errno == EACCES) + err(EXIT_FAILURE, "enable to access SES device"); + break; + } + + if (ioctl(fd, ENCIOC_GETNELM, (caddr_t) &nobj) < 0) + err(EXIT_FAILURE, "ENCIOC_GETNELM"); + + objp = calloc(nobj, sizeof(encioc_element_t)); + if (objp == NULL) + err(EXIT_FAILURE, "calloc()"); + + if (ioctl(fd, ENCIOC_GETELMMAP, (caddr_t) objp) < 0) + err(EXIT_FAILURE, "ENCIOC_GETELMMAP"); + + for (j = 0; j < nobj; j++) { + memset(&objdn, 0, sizeof(objdn)); + objdn.elm_idx = objp[j].elm_idx; + objdn.elm_names_size = 128; + objdn.elm_devnames = calloc(128, sizeof(char)); + if (objdn.elm_devnames == NULL) + err(EXIT_FAILURE, "calloc()"); + if (ioctl(fd, ENCIOC_GETELMDEVNAMES, + (caddr_t) &objdn) <0) + continue; + if (objdn.elm_names_len > 0) { + if (all) { + do_locate(fd, objdn.elm_idx, locate); + continue; + } + if (disk_match(objdn.elm_devnames, disk, len)) { + do_locate(fd, objdn.elm_idx, locate); + break; + } + } + } + close(fd); + i++; + } + globfree(&g); + + return (EXIT_SUCCESS); +} + +static void +usage(FILE *out) +{ + int i; + + fprintf(out, "Usage: %s [command] [options]\n", getprogname()); + fprintf(out, "Commands supported:\n"); + for (i = 0; i < nbcmds; i++) + fprintf(out, "\t%-15s%s\n", cmds[i].name, cmds[i].desc); +} + +int +main(int argc, char **argv) +{ + int i; + struct command *cmd = NULL; + + if (argc < 2) { + warnx("Missing command"); + usage(stderr); + return (EXIT_FAILURE); + } + + for (i = 0; i < nbcmds; i++) { + if (strcmp(argv[1], cmds[i].name) == 0) { + cmd = &cmds[i]; + break; + } + } + + if (cmd == NULL) { + warnx("unknown command %s", argv[1]); + usage(stderr); + return (EXIT_FAILURE); + } + + argc-=2; + argv+=2; + + return (cmd->exec(argc, argv)); +} Property changes on: head/usr.sbin/sesutil/sesutil.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property