DISMAN-SCHEDULE-MIB DEFINITIONS ::= BEGIN

IMPORTS
    MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE,
    Integer32, Unsigned32, Counter32, mib-2, zeroDotZero
        FROM SNMPv2-SMI

    TEXTUAL-CONVENTION,
    DateAndTime, RowStatus, StorageType, VariablePointer
        FROM SNMPv2-TC

    MODULE-COMPLIANCE, OBJECT-GROUP, NOTIFICATION-GROUP
        FROM SNMPv2-CONF

    SnmpAdminString
        FROM SNMP-FRAMEWORK-MIB;

schedMIB MODULE-IDENTITY
    LAST-UPDATED "200201070000Z"
    ORGANIZATION "IETF Distributed Management Working Group"
    CONTACT-INFO
        "WG EMail:  disman@dorothy.bmc.com
         Subscribe: disman-request@dorothy.bmc.com

         Chair:     Randy Presuhn
                    BMC Software, Inc.
         Postal:    Office 1-3141
                    2141 North First Street
                    San Jose,  California 95131
                    USA
         EMail:     rpresuhn@bmc.com
         Phone:     +1 408 546-1006

         Editor:    David B. Levi
                    Nortel Networks
         Postal:    4401 Great America Parkway
                    Santa Clara, CA 95052-8185
                    USA
         EMail:     dlevi@nortelnetworks.com
         Phone:     +1 865 686 0432

         Editor:    Juergen Schoenwaelder
                    TU Braunschweig
         Postal:    Bueltenweg 74/75
                    38106 Braunschweig
                    Germany
         EMail:     schoenw@ibr.cs.tu-bs.de
         Phone:     +49 531 391-3283"
    DESCRIPTION
        "This MIB module defines a MIB which provides mechanisms to
         schedule SNMP set operations periodically or at specific
         points in time."
    REVISION    "200201070000Z"
    DESCRIPTION
        "Revised version, published as RFC 3231.

         This revision introduces a new object type called
         schedTriggers.  Created new conformance and compliance
         statements that take care of the new schedTriggers object.

         Several clarifications have been added to remove ambiguities
         that were discovered and reported by implementors."
    REVISION    "199811171800Z"
    DESCRIPTION
        "Initial version, published as RFC 2591."
    ::= { mib-2 63 }

--
-- The various groups defined within this MIB definition:
--

schedObjects       OBJECT IDENTIFIER ::= { schedMIB 1 }
schedNotifications OBJECT IDENTIFIER ::= { schedMIB 2 }
schedConformance   OBJECT IDENTIFIER ::= { schedMIB 3 }

--
-- Textual Conventions:
--

SnmpPduErrorStatus ::= TEXTUAL-CONVENTION
    STATUS       current
    DESCRIPTION
        "This TC enumerates the SNMPv1 and SNMPv2 PDU error status
         codes as defined in RFC 1157 and RFC 1905.  It also adds a
         pseudo error status code `noResponse' which indicates a
         timeout condition."
    SYNTAX      INTEGER {
                    noResponse(-1),
                    noError(0),
                    tooBig(1),
                    noSuchName(2),
                    badValue(3),
                    readOnly(4),
                    genErr(5),
                    noAccess(6),
                    wrongType(7),
                    wrongLength(8),
                    wrongEncoding(9),
                    wrongValue(10),
                    noCreation(11),
                    inconsistentValue(12),
                    resourceUnavailable(13),
                    commitFailed(14),
                    undoFailed(15),
                    authorizationError(16),
                    notWritable(17),
                    inconsistentName(18)
                }

--
-- Some scalars which provide information about the local time zone.
--

schedLocalTime OBJECT-TYPE
    SYNTAX      DateAndTime (SIZE (11))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "The local time used by the scheduler.  Schedules which
         refer to calendar time will use the local time indicated
         by this object.  An implementation MUST return all 11 bytes
         of the DateAndTime textual-convention so that a manager
         may retrieve the offset from GMT time."
    ::= { schedObjects 1 }

--
-- The schedule table which controls the scheduler.
--

schedTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF SchedEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "This table defines scheduled actions triggered by
         SNMP set operations."
    ::= { schedObjects 2 }

schedEntry OBJECT-TYPE
    SYNTAX      SchedEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "An entry describing a particular scheduled action.

         Unless noted otherwise, writable objects of this row
         can be modified independent of the current value of
         schedRowStatus, schedAdminStatus and schedOperStatus.
         In particular, it is legal to modify schedInterval
         and the objects in the schedCalendarGroup when
         schedRowStatus is active and schedAdminStatus and
         schedOperStatus are both enabled."
    INDEX { schedOwner, schedName }
    ::= { schedTable 1 }

SchedEntry ::= SEQUENCE {
    schedOwner          SnmpAdminString,
    schedName           SnmpAdminString,
    schedDescr          SnmpAdminString,
    schedInterval       Unsigned32,
    schedWeekDay        BITS,
    schedMonth          BITS,
    schedDay            BITS,
    schedHour           BITS,
    schedMinute         BITS,
    schedContextName    SnmpAdminString,
    schedVariable       VariablePointer,
    schedValue          Integer32,
    schedType           INTEGER,
    schedAdminStatus    INTEGER,
    schedOperStatus     INTEGER,
    schedFailures       Counter32,
    schedLastFailure    SnmpPduErrorStatus,
    schedLastFailed     DateAndTime,
    schedStorageType    StorageType,
    schedRowStatus      RowStatus,
    schedTriggers       Counter32
}

schedOwner OBJECT-TYPE
    SYNTAX      SnmpAdminString (SIZE(0..32))
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "The owner of this scheduling entry.  The exact semantics of
         this string are subject to the security policy defined by

         the security administrator."
    ::= { schedEntry 1 }

schedName OBJECT-TYPE
    SYNTAX      SnmpAdminString (SIZE(1..32))
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "The locally-unique, administratively assigned name for this
         scheduling entry.  This object allows a schedOwner to have
         multiple entries in the schedTable."
    ::= { schedEntry 2 }

schedDescr OBJECT-TYPE
    SYNTAX      SnmpAdminString
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The human readable description of the purpose of this
         scheduling entry."
    DEFVAL      { "" }
    ::= { schedEntry 3 }

schedInterval OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "seconds"
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The number of seconds between two action invocations of
         a periodic scheduler.  Implementations must guarantee
         that action invocations will not occur before at least
         schedInterval seconds have passed.

         The scheduler must ignore all periodic schedules that
         have a schedInterval value of 0.  A periodic schedule
         with a scheduling interval of 0 seconds will therefore
         never invoke an action.

         Implementations may be forced to delay invocations in the
         face of local constraints.  A scheduled management function
         should therefore not rely on the accuracy provided by the
         scheduler implementation.

         Note that implementations which maintain a list of pending
         activations must re-calculate them when this object is
         changed."
    DEFVAL      { 0 }
    ::= { schedEntry 4 }

schedWeekDay OBJECT-TYPE
    SYNTAX      BITS {
                    sunday(0),
                    monday(1),
                    tuesday(2),
                    wednesday(3),
                    thursday(4),
                    friday(5),
                    saturday(6)
                }
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The set of weekdays on which the scheduled action should
         take place.  Setting multiple bits will include several
         weekdays in the set of possible weekdays for this schedule.
         Setting all bits will cause the scheduler to ignore the
         weekday.

         Note that implementations which maintain a list of pending
         activations must re-calculate them when this object is
         changed."
    DEFVAL      { {} }
    ::= { schedEntry 5 }

schedMonth OBJECT-TYPE
    SYNTAX      BITS {
                    january(0),
                    february(1),
                    march(2),
                    april(3),
                    may(4),
                    june(5),
                    july(6),
                    august(7),
                    september(8),
                    october(9),
                    november(10),
                    december(11)
                }
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The set of months during which the scheduled action should
         take place.  Setting multiple bits will include several
         months in the set of possible months for this schedule.

         Setting all bits will cause the scheduler to ignore the
         month.

         Note that implementations which maintain a list of pending
         activations must re-calculate them when this object is
         changed."
    DEFVAL      { {} }
    ::= { schedEntry 6 }

schedDay OBJECT-TYPE
    SYNTAX      BITS {
                    d1(0),   d2(1),   d3(2),   d4(3),   d5(4),
                    d6(5),   d7(6),   d8(7),   d9(8),   d10(9),
                    d11(10), d12(11), d13(12), d14(13), d15(14),
                    d16(15), d17(16), d18(17), d19(18), d20(19),
                    d21(20), d22(21), d23(22), d24(23), d25(24),
                    d26(25), d27(26), d28(27), d29(28), d30(29),
                    d31(30),
                    r1(31),  r2(32),  r3(33),  r4(34),  r5(35),
                    r6(36),  r7(37),  r8(38),  r9(39),  r10(40),
                    r11(41), r12(42), r13(43), r14(44), r15(45),
                    r16(46), r17(47), r18(48), r19(49), r20(50),
                    r21(51), r22(52), r23(53), r24(54), r25(55),
                    r26(56), r27(57), r28(58), r29(59), r30(60),
                    r31(61)
                }
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The set of days in a month on which a scheduled action
         should take place.  There are two sets of bits one can
         use to define the day within a month:

         Enumerations starting with the letter 'd' indicate a
         day in a month relative to the first day of a month.
         The first day of the month can therefore be specified
         by setting the bit d1(0) and d31(30) means the last
         day of a month with 31 days.

         Enumerations starting with the letter 'r' indicate a
         day in a month in reverse order, relative to the last
         day of a month.  The last day in the month can therefore
         be specified by setting the bit r1(31) and r31(61) means
         the first day of a month with 31 days.

         Setting multiple bits will include several days in the set
         of possible days for this schedule.  Setting all bits will
         cause the scheduler to ignore the day within a month.

         Setting all bits starting with the letter 'd' or the
         letter 'r' will also cause the scheduler to ignore the
         day within a month.

         Note that implementations which maintain a list of pending
         activations must re-calculate them when this object is
         changed."
    DEFVAL      { {} }
    ::= { schedEntry 7 }

schedHour OBJECT-TYPE
    SYNTAX      BITS {
                    h0(0),   h1(1),   h2(2),   h3(3),   h4(4),
                    h5(5),   h6(6),   h7(7),   h8(8),   h9(9),
                    h10(10), h11(11), h12(12), h13(13), h14(14),
                    h15(15), h16(16), h17(17), h18(18), h19(19),
                    h20(20), h21(21), h22(22), h23(23)
                }
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The set of hours within a day during which the scheduled
         action should take place.

         Note that implementations which maintain a list of pending
         activations must re-calculate them when this object is
         changed."
    DEFVAL      { {} }
    ::= { schedEntry 8 }

schedMinute OBJECT-TYPE
    SYNTAX      BITS {
                    m0(0),   m1(1),   m2(2),   m3(3),   m4(4),
                    m5(5),   m6(6),   m7(7),   m8(8),   m9(9),
                    m10(10), m11(11), m12(12), m13(13), m14(14),
                    m15(15), m16(16), m17(17), m18(18), m19(19),
                    m20(20), m21(21), m22(22), m23(23), m24(24),
                    m25(25), m26(26), m27(27), m28(28), m29(29),
                    m30(30), m31(31), m32(32), m33(33), m34(34),
                    m35(35), m36(36), m37(37), m38(38), m39(39),
                    m40(40), m41(41), m42(42), m43(43), m44(44),
                    m45(45), m46(46), m47(47), m48(48), m49(49),
                    m50(50), m51(51), m52(52), m53(53), m54(54),
                    m55(55), m56(56), m57(57), m58(58), m59(59)
                }
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The set of minutes within an hour when the scheduled action
         should take place.

         Note that implementations which maintain a list of pending
         activations must re-calculate them when this object is
         changed."
    DEFVAL      { {} }
    ::= { schedEntry 9 }

schedContextName OBJECT-TYPE
    SYNTAX      SnmpAdminString (SIZE(0..32))
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The context which contains the local MIB variable pointed
         to by schedVariable."
    DEFVAL      { "" }
    ::= { schedEntry 10 }

schedVariable OBJECT-TYPE
    SYNTAX      VariablePointer
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "An object identifier pointing to a local MIB variable
         which resolves to an ASN.1 primitive type of INTEGER."
    DEFVAL      { zeroDotZero }
    ::= { schedEntry 11 }

schedValue OBJECT-TYPE
    SYNTAX      Integer32
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The value which is written to the MIB object pointed to by
         schedVariable when the scheduler invokes an action.  The
         implementation shall enforce the use of access control
         rules when performing the set operation on schedVariable.
         This is accomplished by calling the isAccessAllowed abstract
         service interface as defined in RFC 2571.

         Note that an implementation may choose to issue an SNMP Set
         message to the SNMP engine and leave the access control
         decision to the normal message processing procedure."
    DEFVAL      { 0 }
    ::= { schedEntry 12 }

schedType OBJECT-TYPE
    SYNTAX      INTEGER {
                    periodic(1),
                    calendar(2),
                    oneshot(3)
                }
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The type of this schedule.  The value periodic(1) indicates
         that this entry specifies a periodic schedule.  A periodic
         schedule is defined by the value of schedInterval.  The
         values of schedWeekDay, schedMonth, schedDay, schedHour
         and schedMinute are ignored.

         The value calendar(2) indicates that this entry describes a
         calendar schedule.  A calendar schedule is defined by the
         values of schedWeekDay, schedMonth, schedDay, schedHour and
         schedMinute.  The value of schedInterval is ignored.  A
         calendar schedule will trigger on all local times that
         satisfy the bits set in schedWeekDay, schedMonth, schedDay,
         schedHour and schedMinute.

         The value oneshot(3) indicates that this entry describes a
         one-shot schedule.  A one-shot schedule is similar to a
         calendar schedule with the additional feature that it
         disables itself by changing in the `finished'
         schedOperStatus once the schedule triggers an action.

         Note that implementations which maintain a list of pending
         activations must re-calculate them when this object is
         changed."
    DEFVAL      { periodic }
    ::= { schedEntry 13 }

schedAdminStatus OBJECT-TYPE
    SYNTAX      INTEGER {
                    enabled(1),
                    disabled(2)
                }
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The desired state of the schedule."
    DEFVAL      { disabled }
    ::= { schedEntry 14 }

schedOperStatus OBJECT-TYPE
    SYNTAX      INTEGER {

                    enabled(1),
                    disabled(2),
                    finished(3)
                }
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "The current operational state of this schedule.  The state
         enabled(1) indicates this entry is active and that the
         scheduler will invoke actions at appropriate times.  The
         disabled(2) state indicates that this entry is currently
         inactive and ignored by the scheduler.  The finished(3)
         state indicates that the schedule has ended.  Schedules
         in the finished(3) state are ignored by the scheduler.
         A one-shot schedule enters the finished(3) state when it
         deactivates itself.

         Note that the operational state must not be enabled(1)
         when the schedRowStatus is not active."
    ::= { schedEntry 15 }

schedFailures OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "This variable counts the number of failures while invoking
         the scheduled action.  This counter at most increments once
         for a triggered action."
    ::= { schedEntry 16 }

schedLastFailure OBJECT-TYPE
    SYNTAX      SnmpPduErrorStatus
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "The most recent error that occurred during the invocation of
         a scheduled action.  The value noError(0) is returned
         if no errors have occurred yet."
    DEFVAL      { noError }
    ::= { schedEntry 17 }

schedLastFailed OBJECT-TYPE
    SYNTAX      DateAndTime
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "The date and time when the most recent failure occurred.

         The value '0000000000000000'H is returned if no failure
         occurred since the last re-initialization of the scheduler."
    DEFVAL      { '0000000000000000'H }
    ::= { schedEntry 18 }

schedStorageType OBJECT-TYPE
    SYNTAX      StorageType
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "This object defines whether this scheduled action is kept
         in volatile storage and lost upon reboot or if this row is
         backed up by non-volatile or permanent storage.

         Conceptual rows having the value `permanent' must allow
         write access to the columnar objects schedDescr,
         schedInterval, schedContextName, schedVariable, schedValue,
         and schedAdminStatus.  If an implementation supports the
         schedCalendarGroup, write access must be also allowed to
         the columnar objects schedWeekDay, schedMonth, schedDay,
         schedHour, schedMinute."
    DEFVAL      { volatile }
    ::= { schedEntry 19 }

schedRowStatus OBJECT-TYPE
    SYNTAX      RowStatus
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The status of this scheduled action.  A control that allows
         entries to be added and removed from this table.

         Note that the operational state must change to enabled
         when the administrative state is enabled and the row
         status changes to active(1).

         Attempts to destroy(6) a row or to set a row
         notInService(2) while the operational state is enabled
         result in inconsistentValue errors.

         The value of this object has no effect on whether other
         objects in this conceptual row can be modified."
    ::= { schedEntry 20 }

schedTriggers OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "This variable counts the number of attempts (either
         successful or failed) to invoke the scheduled action."
    ::= { schedEntry 21 }

--
-- Notifications that are emitted to indicate failures.  The
-- definition of schedTraps makes notification registrations
-- reversible (see STD 58, RFC 2578).
--

schedTraps OBJECT IDENTIFIER ::= { schedNotifications 0 }

schedActionFailure NOTIFICATION-TYPE
    OBJECTS     { schedLastFailure, schedLastFailed }
    STATUS      current
    DESCRIPTION
        "This notification is generated whenever the invocation of a
         scheduled action fails."
    ::= { schedTraps 1 }

-- conformance information

schedCompliances OBJECT IDENTIFIER ::= { schedConformance 1 }
schedGroups      OBJECT IDENTIFIER ::= { schedConformance 2 }

-- compliance statements

schedCompliance2 MODULE-COMPLIANCE
    STATUS      current
    DESCRIPTION
        "The compliance statement for SNMP entities which implement
         the scheduling MIB."
    MODULE      -- this module
    MANDATORY-GROUPS {
           schedGroup2, schedNotificationsGroup
    }
    GROUP  schedCalendarGroup
    DESCRIPTION
        "The schedCalendarGroup is mandatory only for those
         implementations that support calendar based schedules."
    OBJECT schedType
    DESCRIPTION
        "The values calendar(2) or oneshot(3) are not valid for
         implementations that do not implement the
         schedCalendarGroup.  Such an implementation must return
         inconsistentValue error responses for attempts to set
         schedAdminStatus to calendar(2) or oneshot(3)."
    ::= { schedCompliances 2 }

schedGroup2 OBJECT-GROUP
    OBJECTS {
        schedDescr, schedInterval, schedContextName,
        schedVariable, schedValue, schedType,
        schedAdminStatus, schedOperStatus, schedFailures,
        schedLastFailure, schedLastFailed, schedStorageType,
        schedRowStatus, schedTriggers
    }
    STATUS      current
    DESCRIPTION
        "A collection of objects providing scheduling capabilities."
    ::= { schedGroups 4 }

schedCalendarGroup OBJECT-GROUP
    OBJECTS {
        schedLocalTime, schedWeekDay, schedMonth,
        schedDay, schedHour, schedMinute
    }
    STATUS      current
    DESCRIPTION
        "A collection of objects providing calendar based schedules."
    ::= { schedGroups 2 }

schedNotificationsGroup NOTIFICATION-GROUP
    NOTIFICATIONS {
        schedActionFailure
    }
    STATUS      current
    DESCRIPTION
        "The notifications emitted by the scheduler."
    ::= { schedGroups 3 }

--
-- Deprecated compliance and conformance group definitions
-- from RFC 2591.
--

schedCompliance MODULE-COMPLIANCE
    STATUS      deprecated
    DESCRIPTION
        "The compliance statement for SNMP entities which implement
         the scheduling MIB."
    MODULE      -- this module
    MANDATORY-GROUPS {
           schedGroup, schedNotificationsGroup
    }

    GROUP  schedCalendarGroup
    DESCRIPTION
        "The schedCalendarGroup is mandatory only for those
         implementations that support calendar based schedules."
    OBJECT schedType
    DESCRIPTION
        "The values calendar(2) or oneshot(3) are not valid for
         implementations that do not implement the
         schedCalendarGroup.  Such an implementation must return
         inconsistentValue error responses for attempts to set
         schedAdminStatus to calendar(2) or oneshot(3)."
    ::= { schedCompliances 1 }

schedGroup OBJECT-GROUP
    OBJECTS {
        schedDescr, schedInterval, schedContextName,
        schedVariable, schedValue, schedType,
        schedAdminStatus, schedOperStatus, schedFailures,
        schedLastFailure, schedLastFailed, schedStorageType,
        schedRowStatus
    }
    STATUS      deprecated
    DESCRIPTION
        "A collection of objects providing scheduling capabilities."
    ::= { schedGroups 1 }

END
