From owner-svn-src-projects@FreeBSD.ORG Tue Oct 4 16:54:22 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 43EBB106566C; Tue, 4 Oct 2011 16:54:22 +0000 (UTC) (envelope-from lev@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3155F8FC13; Tue, 4 Oct 2011 16:54:22 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p94GsMbF066887; Tue, 4 Oct 2011 16:54:22 GMT (envelope-from lev@svn.freebsd.org) Received: (from lev@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p94GsM24066876; Tue, 4 Oct 2011 16:54:22 GMT (envelope-from lev@svn.freebsd.org) Message-Id: <201110041654.p94GsM24066876@svn.freebsd.org> From: "Lev A. Serebryakov" Date: Tue, 4 Oct 2011 16:54:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r225989 - in projects/geom-events: etc etc/devd sbin/geom/core usr.sbin usr.sbin/geom-events X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Oct 2011 16:54:22 -0000 Author: lev (ports committer) Date: Tue Oct 4 16:54:21 2011 New Revision: 225989 URL: http://svn.freebsd.org/changeset/base/225989 Log: Add geom-events(8) script ad all needeed configuration files and references. More details are in geom-events(8). Added: projects/geom-events/etc/devd/geom.conf projects/geom-events/etc/geom-events.conf projects/geom-events/usr.sbin/geom-events/ projects/geom-events/usr.sbin/geom-events/Makefile projects/geom-events/usr.sbin/geom-events/geom-events.8 projects/geom-events/usr.sbin/geom-events/geom-events.conf.5 projects/geom-events/usr.sbin/geom-events/geom-events.sh Modified: projects/geom-events/etc/Makefile projects/geom-events/etc/devd/Makefile projects/geom-events/sbin/geom/core/geom.8 projects/geom-events/usr.sbin/Makefile Modified: projects/geom-events/etc/Makefile ============================================================================== --- projects/geom-events/etc/Makefile Tue Oct 4 16:53:11 2011 (r225988) +++ projects/geom-events/etc/Makefile Tue Oct 4 16:54:21 2011 (r225989) @@ -10,7 +10,7 @@ SUBDIR= sendmail BIN1= auth.conf \ crontab devd.conf devfs.conf \ ddb.conf dhclient.conf disktab fbtab \ - ftpusers gettytab group \ + ftpusers geom-events.conf gettytab group \ hosts hosts.allow hosts.equiv \ inetd.conf libalias.conf login.access login.conf mac.conf motd \ netconfig network.subr networks newsyslog.conf nsswitch.conf \ Modified: projects/geom-events/etc/devd/Makefile ============================================================================== --- projects/geom-events/etc/devd/Makefile Tue Oct 4 16:53:11 2011 (r225988) +++ projects/geom-events/etc/devd/Makefile Tue Oct 4 16:54:21 2011 (r225989) @@ -1,6 +1,6 @@ # $FreeBSD$ -FILES= asus.conf uath.conf usb.conf +FILES= asus.conf geom.conf uath.conf usb.conf NO_OBJ= FILESDIR= /etc/devd Added: projects/geom-events/etc/devd/geom.conf ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/geom-events/etc/devd/geom.conf Tue Oct 4 16:54:21 2011 (r225989) @@ -0,0 +1,32 @@ +# $FreeBSD$ +# +# GEOM Events processing + +notify 100 { + match "system" "GEOM"; + match "type" "DISCONNECT"; + action "/usr/sbin/geom-events $type $subsystem $geom $provider $disk $state"; +}; + +notify 100 { + match "system" "GEOM"; + match "type" "SYNCSTART"; + action "/usr/sbin/geom-events $type $subsystem $geom $provider"; +}; + +notify 100 { + match "system" "GEOM"; + match "type" "SYNCSTOP"; + action "/usr/sbin/geom-events $type $subsystem $geom $provider $complete"; +}; + +notify 100 { + match "system" "GEOM"; + match "type" "DESTROYED"; + action "/usr/sbin/geom-events $type $subsystem $geom $provider"; +}; + +notify 0 { + match "system" "GEOM"; + action "/usr/sbin/geom-events $type $subsystem $geom $provider"; +}; Added: projects/geom-events/etc/geom-events.conf ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/geom-events/etc/geom-events.conf Tue Oct 4 16:54:21 2011 (r225989) @@ -0,0 +1,52 @@ +# $FreeBSD$ +# +# Settings for GEOM events processing +# +# This file contains "system-wide" settings. Variables in this file could be +# overwritten with class- and device-specific configs. +# +# Class-specific configs are read from +# /etc/geom-events/${class}.conf +# /usr/local/etc/geom-events/${class}.conf +# +# Device-specific configs are read from +# /etc/geom-events/${class}/${device}.conf +# /usr/local/etc/geom-events/${class}/${device}.conf +# +# Spare disks are selected by peculiarity of config variables, +# not by config file, in which variables were set. +# +# Please, consult to geom-events(8) for details. +# + +geom_events_notify=root # E-mail or user to sent reports about GEOM events to +geom_events_log="YES" # Log all events with logger(1) + +########################################### +# Special commands for non-standard classes +########################################### +geom_insert_cmd_multipath='/sbin/g${class} add ${geom} ${spare}' + +geom_remove_cmd_mirror='/sbin/g${class} forget ${geom}' + +###################################### +# Example of spare disks configuration +###################################### + +# Default spares. They will be used, if no more specific settings could be +# found +#geom_spares="ada2 ada3 ada4" + +# Spares for class "mirror". they will be used only for geom_mirror(8), +# if no more specific setting weill be found +#geom_spares_mirror="da0 da1" + +# Spares for class "raid3", device name "data". +#geom_spares_raid3_data="da2 da3" + +# Spares to replace very specific component in mirror with name "homes" +# This is most-specific form. +#geom_spares_mirror_homes_ada4="ada5 ada6" + +# Disable spares for all geom_raid(8) instances +#geom_spares_raid="" Modified: projects/geom-events/sbin/geom/core/geom.8 ============================================================================== --- projects/geom-events/sbin/geom/core/geom.8 Tue Oct 4 16:53:11 2011 (r225988) +++ projects/geom-events/sbin/geom/core/geom.8 Tue Oct 4 16:54:21 2011 (r225989) @@ -182,6 +182,7 @@ geom md unload .Sh SEE ALSO .Xr libgeom 3 , .Xr geom 4 , +.Xr geom-events 8 , .Xr gcache 8 , .Xr gconcat 8 , .Xr geli 8 , Modified: projects/geom-events/usr.sbin/Makefile ============================================================================== --- projects/geom-events/usr.sbin/Makefile Tue Oct 4 16:53:11 2011 (r225988) +++ projects/geom-events/usr.sbin/Makefile Tue Oct 4 16:54:21 2011 (r225989) @@ -26,6 +26,7 @@ SUBDIR= adduser \ extattrctl \ fifolog \ fwcontrol \ + geom-events \ getfmac \ getpmac \ ggetmode \ Added: projects/geom-events/usr.sbin/geom-events/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/geom-events/usr.sbin/geom-events/Makefile Tue Oct 4 16:54:21 2011 (r225989) @@ -0,0 +1,6 @@ +# $FreeBSD$ + +SCRIPTS=geom-events.sh +MAN= geom-events.conf.5 geom-events.8 + +.include Added: projects/geom-events/usr.sbin/geom-events/geom-events.8 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/geom-events/usr.sbin/geom-events/geom-events.8 Tue Oct 4 16:54:21 2011 (r225989) @@ -0,0 +1,398 @@ +.\" +.\" Copyright (c) 2011 Lev Serebryakov +.\" 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 12, 2011 +.Dt GEOM-EVENTS 8 +.Os +.Sh NAME +.Nm geom-events +.Nd command for processing +.Xr geom 4 +events passed to +.Xr devd 8 . +.Sh SYNOPSIS +.Nm +.Ar event-name +.Ar geom-class-name +.Ar geom-name +.Ar provider-name +.Op Ar ... +.Sh DESCRIPTION +The +.Nm +utility is a shell script which processes different events from +.Xr geom 4 +system via +.Xr devd 8 +mechanism. +Its main functions are to notify the administrator about these events +by e-mail, to log such events with +.Xr logger 1 +and to replace failed components with spare drives for +.Xr geom 4 +classes which supports redundancy. +.Pp +Every event has these mandatory attributes, passed as arguments +to +.Nm : +.Bl -tag -width "PROVIDER" -offset indent +.It Ar TYPE +Type of the event. See section +.Sx EVENT_TYPES . +.It Ar CLASS +Class of geom that sends the given event. Class name should be in lower case, +as used in first argument to userland +.Xr geom 8 +utility. +.It Ar GEOM +Name of geom that sends the given event. It is usable as an argument for +various userland utilities like +.Xr gmirror 8 , +.Xr graid3 8 +and more general +.Xr geom 8 . +.It Ar PROVIDER +Name of provider to which the given event is related. Most of geom classes have +only one provider and this attribute is redundant, as it the same as +.Ar GEOM , +maybe prefixed with +.Ar CLASS/ , +but some classes could have more than one providers. Examples of such classes +are +.Xr gpart 8 +and +.Xr graid 8 . +.El +.Sh EVENT TYPES +.Ss DISCONNECT +This event is sent when geom loses one of its components. The component is +a provider of some other geom. +.Pp +This event is +sent only by geoms which use many components. For +example, +.Xr gmirror 8 +sends this message, and +.Xr geli 8 +doens't. +.Pp +Additional attributes passed with this event are +.Va component +and +.Va state . +.Pp +The first one is the name of the disconnected component (provider of +underlying geom). It is a name as it is seen in +.Pa /dev +tree, without +.Pa /dev +prefix itself, like +.Pa ada0 +or +.Pa mirror/gm0 +.Pp +.Va state +is state of geom after disconnection. It could be one of four values: +.Bl -tag -width "FIXABLE" -offset indent +.It Fixable +This state means that geom is accessible (could be read and written) and +the disconnected component could be replaced with a spare drive. In this case, +.Nm +tries to find a configured spare drive and use it to fix geom. +.Pp +This state is typical for geoms which implement volumes +with redundancy, as +.Xr gmirror 8 +and +.Xr graid3 8 +.It Alive +This state means that geom is accessible, but maybe not fully-functional, or +no automatic replacement is possible, and operator needs to perform some manual +operations to be sure that the disconnection is repaired. +.Pp +This state is typical for geoms which implement volumes +without redundancy, like +.Xr gstripe 8 . +.It Dead +This state means that geom's provider is completely destroyed by the +disconnection and will be removed from system. +.El +.Pp +.Nm +tries to replace disconnected component in fixable cases. List of +spare components should be configured in config files (see +.Sx CONFIGURATION ) . +.Pp +.Nm +checks every configured spare drive with +.Xr ggetmode 8 +utility to ensure that the drive isn't used. +.Pp +It then +tries to remove the failed component from geom, if configured to do so by +.Va geom_remove_verb_ Ns Ao Ar class Ac +variable. +By default, no removal command is called. +.Pp +After that, +.Nm +calls shell command to insert the new +component into array. Default command is +.Bd -literal -offset indent +/sbin/g${class} insert ${geom} ${spare} +.Ed +.Pp +and after parameter substitution looks like this: +.Bd -literal -offset indent +/sbin/gmirror insert data ada12 +.Ed +.Pp +This command could be configured, see +variable +.Va geom_remove_verb_ Ns Ao Ar class Ac +in +.Sx CONFIGURATION +section. +.Pp +.Nm +repeats trying till success or end of available spare drives. +.Pp +If +.Va geom_events_notify +variable is set, +.Nm +sents e-mail to the specified address with report about +a component disconnection and all oprations with spare drives, +including configured list, availiable drives and the result +of the insert command. +.Pp +Message for +.Xr syslogd 8 +includes class and name of device, +disconnected component, status of device (whether disconnect was fatal or not) +and the result of the component replacement, if one succeeded. +.Pp +Manual component removals should not trigger this event. +.Ss SYNCSTART +This event is sent when geom starts rebuilding parity or synchronization +of the volume. No additional parameters are passed. +.Pp +.Nm +sents mail and/or logs this event with +.Xr syslogd 8 +if configured to do so. +.Pp +Manual request for rebuilding or synchronization will trigger this +event, as here is no way to distinguish the reason for rebuilding +in most cases. +.Ss SYNCSTOP +This event is sent when geom stops rebuilding parity or synchronization +of the volume. One additional parameter is passed which indicates +whether synchronization was finished successfully or not. +.Pp +.Nm +sents mail and/or logs this event with +.Xr syslogd 8 +if configured to do so. The message includes the name of the device and +the reason for stopping. +.Pp +Manual request for abort of rebuilding will trigger this +event, as here is no way to distinguish reason of stopping in +most cases. +.Ss DESTROYED +This event is sent when geom destroys its provider due to errors. +.Pp +.Nm +sents mail and/or logs this event with +.Xr syslogd 8 +if configured to do so. Message includes only name of device. +.Pp +Manual request for geom removal will not trigger this +event. +.Ss UNKNOWN EVENTS +All unknown events are reported by e-mail and logged to system log with +.Xr logger 1 +if configured to do so. Reported information includes class and name of device +and name of event. +.Sh CONFIGURATION +The +.Nm +utility reads its configuration information from several files. +The main configuration file which is always read, if it is present, is +.Pa /etc/geom-events.conf . +After that, +.Nm +determines which class and device has sent event and reads these files +in this particular order: +.Bl -enum -offset indent -compact +.It +.Pa /etc/geom-events/ Ns Ao Ar class Ac Ns Pa .conf +.It +.Pa /usr/local/etc/geom-events/ Ns Ao Ar class Ac Ns Pa .conf +.It +.Pa /etc/geom-events/ Ns Ao Ar class Ac Ns Pa / Ns Ao Ar geom Ac Ns Pa .conf +.It +.Pa /usr/local/etc/geom-events/ Ns Ao Ar class Ac Ns Pa / Ns Ao Ar geom Ac Ns Pa .conf +.El +These files are read as any +.Pa rc.conf - like +configuration files by sourcing them into script. +.Pp +.Nm +uses these variabels from this config files: +.Bl -tag -width indent-two +.It Va geom_events_notify +.Pq Vt str +Set to e-mail for sending notifications about events to. If it is left empty +or unset, no e-mail notifications will be sent. +.It Va geom_events_log +.Pq Vt bool +If set to +.Dq Li YES , +enables logging events with +.Xr logger 1 +.It Va geom_insert_cmd_ Ns Ao Ar class Ac +.Pq Vt str +Set to +.Xr sh 1 +command is used instead of the default one when +.Nm +tries to replace the disconnected component. If no +variable is set for given class, default +.Ql /sbin/g${class} insert ${geom} ${spare} +is used. +.Pp +This command could contain references to special +shell variables +.Va ${class} , ${geom} , ${provider} +and +.Va ${spare} +which will be substituted at execution time. Please note that +configuration file is a shell script by itsef, so you need +to quote commandcontaining variables with single quotes or escape +varaible references with backslashes. +.It Va geom_remove_cmd_ Ns Ao Ar class Ac +.Pq Vt str +Set to +.Xr sh 1 +command which should be used by +.Nm +to completely remove the failed component from geom +before replacing it with a spare. By default, no such command +is configured and no removal is performed. +.Pp +This command could contain references to special +shell variables +.Va ${class} , ${geom} , ${provider} +and +.Va ${failed} +which will be substituted at execution time. Same precautions should +be used as with +.Va geom_remove_cmd_ Ns Ao Ar class Ac . +.It Va geom_spares +.Pq Vt str +Set to list of spare drives (or other geom providers) to use. This is the most +non-specific list. +.Nm +will use more sepcific spare lists if they are configured. +.It Va geom_spares_ Ns Ao Ar class Ac +.Pq Vt str +Set to list of spare drivers (or other geom providers) to use when +.Nm +needs to replace the disconnected component in geom with class +.Aq Ar class . +.Pp +Could be overwritten for specific geom instance. +.It Va geom_spares_ Ns Ao Ar class Ac Ns Va _ Ns Ao Ar geom Ac +.Pq Vt str +Set to list of spare drivers (or other geom providers) to use when +.Nm +needs to replace the disconnected component in geom with class +.Aq Ar class +and name +.Aq Ar geom . +.It Va geom_spares_ Ns Ao Ar class Ac Ns Va _ Ns Ao Ar geom Ac _ Ns Ao Ar component Ac +.Pq Vt str +Set to list of the spare drivers (or other geom providers) to use when +.Nm +needs to replace disconnected component with name +.Aq Ar component +in geom with class +.Aq Ar class +and name +.Aq Ar geom . +.El +.Pp +.Nm +selects the most specific variable for spare devices. The variable is +selected if it is set. An empty variable counts as a set one. +.Pp +If your have such configuration: +.Bd -literal -offset indent +geom_spares_raid3="ada2 ada3" +geom_spares_raid3_test="" +.Ed +.Pp +.Nm +will select +.Qq ada2 ada3 +as spare list for any +.Em raid3 +geom except one, named +.Em test . +And +.Em raid3 +geom +.Em test +will have no spare drives configured. +.Pp +Please note that +.Nm +doesn't distinguish source file of configuration variables. So, more specific +variables could be placed in less specific config files and will be choosen by +.Nm Ns . +.Pp +When variable name is constructed from geom or component name, all characters +which could not be used in a variable names, are replaced with underscores. +.Sh FILES +.Pa /etc/geom-events/ Ns Ao Ar class Ac Ns Pa .conf +.Pa /usr/local/etc/geom-events/ Ns Ao Ar class Ac Ns Pa .conf +.Pa /etc/geom-events/ Ns Ao Ar class Ac Ns Pa / Ns Ao Ar geom Ac Ns Pa .conf +.Pa /usr/local/etc/geom-events/ Ns Ao Ar class Ac Ns Pa / Ns Ao Ar geom Ac Ns Pa .conf +.Sh SEE ALSO +.Xr geom-events 8 , +.Xr devd 8 , +.Xr geom 8 , +.Xr geom 4 +.Sh HISTORY +The +.Nm +utility and manual page first appeared in +.Fx 10.0 . +.Sh AUTHORS +This utility and manual page was written by +.An Lev Serebryakov Aq lev@FreeBSD.org . Added: projects/geom-events/usr.sbin/geom-events/geom-events.conf.5 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/geom-events/usr.sbin/geom-events/geom-events.conf.5 Tue Oct 4 16:54:21 2011 (r225989) @@ -0,0 +1,70 @@ +.\" +.\" Copyright (c) 2011 Lev Serebryakov +.\" 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 12, 2011 +.Dt GEOM-EVENTS.CONF 5 +.Os +.Sh NAME +.Nm geom-events.conf +.Nd +.Xr geom-events 8 +configuration file +.Sh DESCRIPTION +The +.Bl -item -compact +.It +.Pa /etc/geom-events.conf +.It +.Pa /etc/geom-events/ Ns Ao Ar class Ac Ns Pa .conf +.It +.Pa /usr/local/etc/geom-events/ Ns Ao Ar class Ac Ns Pa .conf +.It +.Pa /etc/geom-events/ Ns Ao Ar class Ac Ns Pa / Ns Ao Ar device Ac Ns Pa .conf +.It +.Pa /usr/local/etc/geom-events/ Ns Ao Ar class Ac Ns Pa / Ns Ao Ar device Ac Ns Pa .conf +.El +.Pp +configuration files contains configuration for +.Xr geom-events 8 +script. Exact description of how they are processed, +please see in +.Sx CONFIGURATION +section of +.Xr geom-events 8 +.Sh SEE ALSO +.Xr geom-events 8 , +.Xr devd 8 , +.Xr geom 8 , +.Xr geom 4 +.Sh HISTORY +The +.Nm +manual page first appeared in +.Fx 10.0 . +.Sh AUTHORS +This manual page was written by +.An Lev Serebryakov Aq lev@FreeBSD.org . Added: projects/geom-events/usr.sbin/geom-events/geom-events.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/geom-events/usr.sbin/geom-events/geom-events.sh Tue Oct 4 16:54:21 2011 (r225989) @@ -0,0 +1,298 @@ +#!/bin/sh +# +# Copyright (c) 2011 Lev Serebryakov . 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 ``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 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$ +# + +# usage: geom-events [...] - process +# event. +# + +usage () { + echo "usage: $0 $1" 1>&2 + exit 1 +} + +event_DISCONNECT () { + local component state removecmd insertcmd repls repla replr replu replb remfm replfm msg _err _i _gm + if [ $# -ne 2 ] ; then + usage " " + fi + component=$1 + state=$2 + if [ "${state}" = 'F' ] ; then + # Get removal/forget command for class, no default + removecmd=`get_var geom_remove_cmd ${CLASS}` + + # Get insert command for class, with resonable default + insertcmd=`get_var geom_insert_cmd ${CLASS}` + [ -z "${insertcmd}" ] && insertcmd='/sbin/g${class} insert ${geom} ${spare}' + + # Search for ready-to-use spare providers + repla=`get_var geom_spares ${CLASS} ${GEOM} ${component}` + for _i in ${repla} ; do + _gm=`/usr/sbin/ggetmode ${_i} 2> /dev/null` + if [ $? -ne 0 ] ; then + replu="${replu} ${_i}" + elif [ "${_gm}" != "r0w0e0" ] ; then + replb="${replb} ${_i}" + else + replr="${replr} ${_i}" + fi + done + + # Remove old component, if needed + if [ -n "${removecmd}" ] ; then + _err=`/usr/bin/env -i class=${CLASS} geom=${GEOM} provider=${PROVIDER} failed=${component} \ + /bin/sh -c "${removecmd}"` + [ $? -ne 0 ] && remfm="${_err}" + fi + # Try insert command for any availiable pare till success + for _i in ${replr} ; do + _err=`/usr/bin/env -i class=${CLASS} geom=${GEOM} provider=${PROVIDER} spare=${_i} \ + /bin/sh -c "${insertcmd}"` + if [ $? -eq 0 ] ; then + repls=${_i} + break + fi + replfm="${replfm}|${_i} - ${_err}" + done + fi + # Write line to log, if configured + if check_yesno geom_events_log ; then + msg="${CLASS} ${GEOM}:${PROVIDER} lost component ${component}" + case "${state}" in + 'D') + msg="${msg} (fatal)" + ;; + 'A') + msg="${msg} (not fatal)" + ;; + 'F') + msg="${msg} (fixable)" + ;; + '?') + msg="${msg} (unknown)" + ;; + *) + msg="${msg} (invalid status: ${fatal})" + ;; + esac + [ -n "${repls}" ] && msg="${msg}, replaced with ${repls}" + /usr/bin/logger -t GEOM "${msg}" + + fi + # Send mail to user, if configured + if [ -n "${geom_events_notify}" ] ; then + ( + echo "${CLASS} device ${GEOM}:${PROVIDER} lost component ${component}" + case "${state}" in + 'D') + echo "It is fatal for ${PROVIDER} and it died. No replacement of disconnected component was possible." + ;; + 'A') + echo "It is non-fatal for ${PROVIDER}, but replacement of disconnected component is not possible." + ;; + 'F') + echo "It is non-fatal for ${PROVIDER}. Replacement of disconnected component is possible." + if [ -n "${repla}" ] ; then + echo "Spare drives were configured for this device: ${repla}." + if [ -n "${repls}" ] ; then + echo "Disconnected component was replaced with ${repls}." + else + echo "Replacement of disconnected component failed." + fi + [ -n "${replu}" ] && echo "Spare drives with unknown status: ${replu}" + [ -n "${replb}" ] && echo "Busy spare drives: ${replb}" + [ -n "${remfm}" ] && echo "Removal of disconnected component failed: ${remfm}" + if [ -n "${replfm}" ] ; then + echo "Failed replacements trys:" + echo "${replfm}" | tr \| \\n + fi + else + echo "Spare drive was not configured for this device." + fi + ;; + '?') + echo "${PROVIDER} has unknown status, replacement of disconnected component is not possible." + ;; + *) + echo "${PROVIDER} has invalid status ${state}, replacement of disconnected component is not possible." + ;; + esac + ) | mail -s "${CLASS} ${GEOM}:${PROVIDER} lost component ${component}" ${geom_events_notify} + fi +} + +event_SYNCSTART () { + if [ $# -ne 0 ] ; then + usage + fi + # Write line to log, if configured + if check_yesno geom_events_log ; then + /usr/bin/logger -t GEOM "${CLASS} ${GEOM}:${PROVIDER} starts rebuilding" + fi + # Send mail to user, if configured + if [ -n "${geom_events_notify}" ] ; then + ( + echo "${CLASS} ${GEOM}:${PROVIDER} starts rebuilding or synchronization" + ) | mail -s "${CLASS} ${GEOM}:${PROVIDER} starts rebuilding" ${geom_events_notify} + fi +} + +event_SYNCSTOP () { + local stopact + if [ $# -ne 1 ] ; then + usage "" + fi + if [ "$1" = 'Y' ] ; then + stopact="finished" + else + stopact="aborted" + fi + # Write line to log, if configured + if check_yesno geom_events_log ; then + /usr/bin/logger -t GEOM "Rebuilding of ${CLASS} ${GEOM}:${PROVIDER} ${stopact}" + fi + # Send mail to user, if configured + if [ -n "${geom_events_notify}" ] ; then + ( + echo "Rebuilding or synchronization of ${CLASS} ${GEOM}:${PROVIDER} ${stopact}" + ) | mail -s "Rebuilding of ${CLASS} ${GEOM}:${PROVIDER} ${stopact}" ${geom_events_notify} + fi +} + +event_DESTROYED () { + if [ $# -ne 0 ] ; then + usage + fi + # Write line to log, if configured + if check_yesno geom_events_log ; then + /usr/bin/logger -t GEOM "${CLASS} ${GEOM}:${PROVIDER} destroyed" + fi + # Send mail to user, if configured + if [ -n "${geom_events_notify}" ] ; then + ( + echo "${CLASS} ${GEOM}:${PROVIDER} destroyed" + ) | mail -s "${CLASS} ${GEOM}:${PROVIDER} destroyed" ${geom_events_notify} + fi +} + +event_UNKNOWN () { + local msg + msg="Unknown event ${EVENT} was sent by GEOM class ${CLASS}, device ${GEOM}:${PROVIDER}" + check_yesno geom_events_log && /usr/bin/logger -t GEOM "${msg}" + [ -n "${geom_events_notify}" ] && echo "${msg}" | \ + mail -s "${CLASS} ${GEOM}:${PROVIDER} sent event ${EVENT}" ${geom_events_notify} +} + +normalize_name () { + echo -n $1 | /usr/bin/tr -c "_a-zA-Z0-9" _ +} + +copy_var_if_unset_and_set () { + local to from _unset + to=$1 + from=$2 + eval _unset=\${${to}-__UNSET__} + [ "${_unset}" != "__UNSET__" ] && return + eval _unset=\${${from}-__UNSET__} + [ "${_unset}" != "__UNSET__" ] && eval $to=\${${from}} +} + +get_var () { + local name class device component val _n _unset + name=`normalize_name $1` + class=`normalize_name $2` + geom=`normalize_name $3` + component=`normalize_name $4` + [ "${component}" = '_unknown_' ] && component="" + if [ -n "${class}" ] ; then + if [ -n "${geom}" ] ; then + if [ -n "${component}" ] ; then + copy_var_if_unset_and_set val "${name}_${class}_${geom}_${component}" + fi + copy_var_if_unset_and_set val "${name}_${class}_${geom}" + fi + copy_var_if_unset_and_set val "${name}_${class}" + fi + copy_var_if_unset_and_set val "${name}" + echo "${val}" +} + +check_yesno() +{ + eval _value=\$${1} + case $_value in + [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) + return 0 + ;; + [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) + return 1 + ;; + *) + return 1 + ;; + esac +} + +if [ $# -lt 4 ] ; then + usage "[...]" +fi + +# Set three variables, which should be set for any event +EVENT=$1 ; shift +CLASS=$1 ; shift +GEOM=$1 ; shift +PROVIDER=$1 ; shift + +# Include generic configuration +[ -r /etc/geom-events.conf ] && . /etc/geom-events.conf + +# Include class-specific configuration +[ -r /etc/geom-events.d/${CLASS}.conf ] && . /etc/geom-events.d/${CLASS}.conf +[ -r /usr/local/etc/geom-events.d/${CLASS}.conf ] && . /usr/local/etc/geom-events.d/${CLASS}.conf + +# Include class- and geom-specific configuration +[ -r /etc/geom-events.d/${CLASS}/${GEOM}.conf ] && . /etc/geom-events.d/${CLASS}/${GEOM}.conf +[ -r /usr/local/etc/geom-events.d/${CLASS}/${GEOM}.conf ] && . /usr/local/etc/geom-events.d/${CLASS}/${GEOM}.conf + +# Ok, process events +case ${EVENT} in + DISCONNECT) + event_DISCONNECT "$@" + ;; + SYNCSTART) + event_SYNCSTART "$@" + ;; + SYNCSTOP) + event_SYNCSTOP "$@" + ;; + DESTROYED) + event_DESTROYED "$@" + ;; + *) + event_UNKNOWN "$@" + ;; +esac