ADSM-L

[no subject]

2015-10-04 17:27:37
Joshua wrote:
-------------------------------------------------------------------------
Bart,

It sounds like you have your offsite tape rotation stuff setup very
elegantly.
I have been working on a strategy to do something very similar to what you
already have in place.  Would it be possible for you to share your scripts,
operator interface, and any available documentation with me.  Whatever you
could share with me would be wonderful.  I would hate to have to reinvent
the wheel.

Your help would be greatly appreciated,


--
Joshua S. Bassi
Senior Technical Consultant
IBM Certified Specialist- AIX 4.3/HACMP
Tivoli Certified Consultant- ADSM / TSM
Symatrix Technology, Inc.
jbassi AT gloryworks DOT com
Cell (503) 702-3371
-------------------------------------------------------------------------

Here are some of the offsite functions that check the tapes and emails return
to onsite messages.


The first functino is to dele tapes that are empty, the second is to delete 
tapes that have reached 14 days old.

#!/bin/ksh
# Korn Shell Script
# adsm.del.empty.vol.SAPCOPY_DLT.sh: Delete the volumes with a
# STATUS=EMPTY from the SAPCOPY_DLT storage pool.
#
# Written By: Bart G. Colbert 10/05/1999
#
# Use ADSM SQL to get the names of all volumes with a status of EMPTY.
# get this info and format it for a mailing.
# Then delete the volumes and mail the info so the tapes can be
# returned onsite.
#
VERSION="1.1"
#
# Revisions:
# *) 10/18/1999 Bart G. Colbert V1.0
#    Removing the TEST MODE from tape deletion, have successfully ran
#    for a one week period in test mode.
#
# *) 12/28/1999 Bart Colbert V1.1
#    -Changed the grave`` calls to $().
#    -Exit if dsmserv process does not exist.
#
#
# INFORMATION ABOUT FIELD WIDTHS FOR awk.
#
# ACCESS = %12
# CAPACITY = %9
# _DATE (ANY) = %11
# LOCATION = %18
# PCTUTIL = %6
# STATUS = %8
# VOLUME = %7
#
# INIT AND EXPORT ANY VARS
APP_HOME="/home/radsm/bin"
typeset -i COUNT
MACHINE=$(uname -n)
typeset -i NUMBER_OF_EMPTY_VOLUMES
TIMESTAMP=$(date)
#
# CHECK FOR ADSM SERVER RUNNING
#
COUNT=$(ps ax | grep dsmserv | grep -v grep | wc -l)
if [ "$COUNT" -eq 0 ];
        then
        exit 0
fi
#
#
#
SELECT_INFO=$(dsmadmc -id=admin -password=XXXX\
        "select volume_name, est_capacity_mb, pct_utilized, access,\
        status, location, last_write_date from volumes\
        where stgpool_name='SAPCOPY_DLT' and status='EMPTY'\
        and access='OFFSITE' order by volume_name")
#
# GET THE NUMBER OF VOLUMES
#
NUMBER_OF_EMPTY_VOLUMES=$(echo $SELECT_INFO | $APP_HOME/adsm.select.parse | 
grep ['ABD'] | wc -l)
#
# IF NE ZERO
#
if [ "$NUMBER_OF_EMPTY_VOLUMES" -ne 0 ];
        then
#
# CREATE THE FORMAT
#
echo ""
echo "DATE          = $TIMESTAMP"
echo "HOSTNAME      = $MACHINE"
echo "MESSAGE TYPE  = Adsm daily tape return to onsite"
echo "MESSAGE LEVEL = Return tapes from offsite to onsite"
echo ""
echo "The following tapes listed are being deleted from the SAPCOPY_DLT"
echo "storage pool. Please return these tapes to the onsite location"
echo "for reuse."
echo ""
echo " VOLUME CAPACITY PCTUTIL    ACCESS  STATUS          LOCATION LAST WRITE"
echo "-----------------------------------------------------------------------"
echo $SELECT_INFO | $APP_HOME/adsm.select.parse | awk '{printf 
"%7s%9s%6s%12s%8s%18s%11s\n",$1,$2,$3,$4,$5,$6,$7}'
VOLUME_NAMES=$(echo $SELECT_INFO | $APP_HOME/adsm.select.parse | awk '{printf 
"%s  ",$1}')
echo ""
echo ""
echo "THE FOLLOWING IS THE OUTPUT FROM THE COMMANDS ISSUED."
for TAPE_NAME in $VOLUME_NAMES
do
echo "dsmadmc -id=admin -password=xxxx delete volume $TAPE_NAME"
dsmadmc -id=admin -password=XXXX delete volume $TAPE_NAME
done
fi
#
# IF EQ ZERO
#
if [ "$NUMBER_OF_EMPTY_VOLUMES" -eq 0 ];
        then
echo ""
echo "DATE          = $TIMESTAMP"
echo "HOSTNAME      = $MACHINE"
echo "MESSAGE TYPE  = Adsm daily tape return to onsite"
echo "MESSAGE LEVEL = No empty volumes to return onsite"
echo ""
echo "SAPCOPY_DLT has no empty volumes to return onsite at this time."
fi








/***********************************************************************
** adsm.select.parse.c: Formats stdin from a select statement         **
** passed by a shell script from adsm.                                **
** Written By: Bart G. Colbert 09/23/1999 ANSI C                      **
** Version 1.0                                                        **
** Revisions:                                                         **
**                                                                    **
** *) 09/27/1999 Bart G. Colbert V1.1                                 **
**    the _date functions return a date value and a timestamp.        **
**    the odd part about this is that the timestamp gets appended to  **
**    the display output and not in the order that the _date field    **
**    is located in the select statement. (I Give)???                 **
**    To make some accomodations for this, I have added a check that  **
**    looks at the existing field and checks for _date or _date,      **
**    in which case another field would follow. But due to the        **
**    time stamp being displayed in no particular order, I have the   **
**    print statement checking to see if its a time its printing.     **
**    Basically they have two different forms of fields that end with **
**    the word date, but _date is date space time where the space     **
**    is replaced by any fields specified after the _date in the      **
**    select. Current version is AIX ADSM V3.1.2.40                   **
**                                                                    **
** *) 09/29/1999 Bart G. Colbert V1.2                                 **
**    If a date has no data IE:last_write_date and has not been       **
**    Then awk will consider the next field as this one. Totally      **
**    trashes a table format. The other problem with the strange      **
**    date output is that is you use two fields such as               **
**    last_read_date, last_write_date then you will get the two date  **
**    columns followed by two time columns. Of course if you have any **
**    other fields as mentioned above then the two time columns are   **
**    appended to the display of any others. Conclusion is that none  **
**    of these parse facilities will handle two of those type of      **
**    dates. It is confusing to read in date1 date2 time1 time2       **
**    format. The requirement is that the _date field be placed as    **
**    the last field on the select statement. If the timestamp is not **
**    desired it can be left out of the awk $# vars.                  **
**                                                                    **
** *) 09/30/1999 Bart G. Colbert V1.3                                 **
**    SAPLOG2 Tapes are taken from a scratch tape in the IBM7331      **
**    Though they are assigned to the pool they are not assigned a    **
**    LOCATION. Parcing a location field counter and checking for the **
**    token value to be equal to one of the locations, if this is not **
**    true then a value of UNKNOWN is used as a place holder.         **
**                                                                    **
***********************************************************************/

/*
 * RCS INFO
 */
static char _rcsid_adsm_select_parse[] = "@adsm.select.parse.c V1.3, Bart G. 
Colbert ANSI C 09/30/1999.\n";

/*
 * INCLUDE STANDARD PREPROCESSOR HEADER FILES
 */
#include <stdio.h>
#include <string.h>

/*
 * BEGIN MAIN FUNCTION
 */
int main ( int argc, char *argv[] )
{

/*
 * INIT ANY LOCAL VARS
 */
char lnbuff[65384];
char *token;
int count_date, display_count, location_count, return_count, string_length;
unsigned BEGIN, END, DASH, START, COMPLETE;

/*
 * GRAB THE STANDARD INPUT IN ONE 64K CHUNK
 */
fgets ( lnbuff, 65384, stdin );

/*
 * TOKENIZE THE STRING OF INPUT DATA
 */
token = strtok ( lnbuff, " " );

/*
 * BEGIN DO WHILE TOKEN NE NULL
 */
do
{

/*
 * PARSE THE NEXT TOKEN FROM STRING
 */
token = strtok ( NULL, " " );

/*
 * IF THE TOKEN IS SELECT THEN SET BEGIN
 */
if ( strcmp ( token, "'select" ) == 0 ) {
        BEGIN=1;
        }

/*
 * BEGIN IF BEGIN IS SET
 */
if ( BEGIN == 1 ) {

        /*
         * CHECK FOR THE FIELD NAME ENDING WITH _date OR _date, AND INCREMENT
         * THE DISPLAY COUNT TO GET THE TIMESTAMP.
         * SEE REVISIONS NOTE ABOUT THE GARBAGE THAT ADSM IS DOING HERE. :(
         */
        if ( strlen(token) != NULL ) {
        if ( ((token[strlen(token)-1] == 'e')\
                 && (token[strlen(token)-2] == 't') && (token[strlen(token)-3] 
== 'a')\
                 && (token[strlen(token)-4] == 'd') && (token[strlen(token)-5] 
== '_'))\
                 || ((token[strlen(token)-1] == ',') && (token[strlen(token)-2] 
== 'e')\
                 && (token[strlen(token)-3] == 't') && (token[strlen(token)-4] 
== 'a')\
                 && (token[strlen(token)-5] == 'd') && (token[strlen(token)-6] 
== '_')) ) {
                count_date = display_count-1;
                ++display_count;
                }
        }

        /*
         * GRAB THE LOCATION FIELD COUNT TO EVAL
         */
        if ( strlen(token) != NULL ) {
        if ( (strcmp( (char *) token, "location" ) == 0)\
                 || (strcmp( (char *) token, "location," ) == 0) ) {
                location_count = display_count-1;
                }
        }

        /*
         * IF TOKEN IS NOT FROM AND
         */
        if ( (strcmp ( token, "from" ) != 0) && (END == 0) ) {
                ++display_count;
                }

        /*
         * IF FROM END FIELD COUNT SET
         */
        if ( strcmp ( token, "from" ) == 0 ) {
                END=1;
                }

        /*
         * IF TOKEN BEGINS WITH A DASH AND DASH NOT SET
         * SET DASH AND DEINC DISPLAY COUNT BY ONE
         */
        if ( (DASH == 0) && (token[0] == '-') ) {
                DASH=1;
                display_count-=1;
                }

        /*
         * IF TOKEN DOES NOT BEGIN WITH A DASH AND THE
         * DASH IS SET THAN TOKEN IS NEXT AFTER DASH
         * SET START PARSE
         */
        if ( (DASH == 1) && (token[0] != '-') ) {
                START=1;
                }

        /*
         * IF TOKEN IS THE ANSWER CODE AND PARSE HAS BEGAN
         * THE SET COMPLETE
         */
        if ( (strcmp ( token, "ANS8002I" ) == 0) && ( BEGIN == 1 ) ) {
                COMPLETE=1;
                }

        /*
         * BEGIN IF NOT COMPLETE BUT START IS SET THEN DO THIS
         */
        if ( (COMPLETE != 1) && (START == 1) ) {

                /*
                 * BEGIN IF THE RETURN COUNT AND DISPLAY COUNT ARE EQ
                 */
                if ( return_count == display_count ) {
                        /*
                         * PRINT A EOL TO STDOUT
                         */
                        printf ("\n");
                        /*
                         * SET THE RETURN COUNT TO ZERO
                         */
                        return_count=0;
                /*
                 * END IF THE RETURN COUNT AND DISPLAY COUNT ARE EQ
                 */
                }


                /*
                 * BEGIN IF TOKEN NE NULL
                 */
                if ( token != NULL ) {

                        /*
                         * LETS NOT PRINT ALL THIS NANOSECOND GARBAGE
                         * IF THIS IS A TIME
                         * SEE REVSION NOTE ABOUT WHAT ADSM IS DOING HERE. :(
                         */
                        if ( (token[2] == ':') && (token[5] == ':') ) {
                                printf ( " %c%c:%c%c  ", token[0], token[1],\
                                token[3], token[4] );
                                }

                        /*
                         * IF THE CURRENT COUNT IS A _date FIELD
                         */
                        if ( return_count == count_date ) {

                                /*
                                 * IF THIS TOKEN IS THE DATE
                                 */
                                if ( (token[4] == '-') && (token[7] == '-') ) {
                                        printf ( "%s  ", token );
                                        }

                                /*
                                 * IF THIS TOKEN IS NOT THE DATE THEN
                                 * THE DATE IS MISSING PRINT THIS SINCE
                                 * WE REQUIRE THE DATE BE THE LAST ITEM
                                 * IN THE SELECT
                                 */
                                if ( (token[4] != '-') && (token[7] != '-') ) {
                                        printf ( "0000-00-00   00:00\n" );
                                        return_count=0;
                                        }
                                }

                        /*
                         * IF THE CURRENT COUNT IS NOT A _date FIELD
                         */
                        if ( return_count != count_date ) {

                                /*
                                 * CHECK IF LOCATION
                                 * IF TRUE THEN SEE IF THE VALUE EQ ONE OF THE
                                 * ACCEPTED VALUES, IF NOT SHOULD BE A VOID 
FIELD.
                                 * IF THE LOCAITON IS A TYPO YOU WILL SEE THE 
UNKOWN
                                 * RIGHT BEFORE THE TYPO LOCATION AND THEN THE 
VOLUME
                                 * CAN BE UPDATED TO CORRECT THIS.
                                 */
                                if ( return_count == location_count ) {
                                        if ( (strcmp ( token, "OFFSITE" ) != 0) 
&&\
                                        (strcmp ( token, "ONSITE_IBM7331" ) != 
0) &&\
                                        (strcmp ( token, "ONSITE_IBM7337" ) != 
0) &&\
                                        (strcmp ( token, "ONSITE_IBM7337A" ) != 
0) &&\
                                        (strcmp ( token, "ONSITE_T_IBM7337" ) 
!= 0) &&\
                                        (strcmp ( token, "ONSITE_T_IBM7337A" ) 
!= 0) ) {
                                                printf ( "UNKNOWN  " );
                                                ++return_count;
                                                }
                                        }
                                /*
                                 * IF THIS IS NOT A TIME STAMP
                                 */
                                if ( (token[2] != ':') && (token[5] != ':') ) {
                                        printf ( "%s  ", token );
                                        }
                                }

                        /*
                         * INCREMENT THE COUNT
                         */
                        return_count++;

                /*
                 * END IF TOKEN NE NULL
                 */
                }

        /*
         * END IF NOT COMPLETE BUT START IS SET THEN DO THIS
         */
        }

/*
 * END IF BEGIN IS SET
 */
}

/*
 * END DO WHILE TOKEN NE NULL
 */
}while ( token != NULL );

/*
 * PRINT A EOL JUST FOR THE HECK OF IT
 */
printf ("\n" );

/*
 * END MAIN FUNCTION
 */
}




#!/bin/ksh
# Korn Shell Script
#
# adsm.del.14.days.BACKUPFULL.sh: Delete the volumes with a
# type='BACKUPFULL' from the volhistory.
#
# Written By: Bart G. Colbert 10/20/1999
#
# Use ADSM SQL to get the names of all volumes with a type of BACKUPFULL
# from the volhistory.
# get this info and format it for a mailing.
# Then delete the volumes and mail the info so the tapes can be
# returned onsite.
#
VERSION="1.1"
#
# Revisions:
#
# *) 12/28/1999 Bart Colbert V1.1
#    -Changed the grave`` calls to $().
#    -Exit if dsmserv process does not exist.
#
#
# INFORMATION ABOUT FIELD WIDTHS FOR awk.
#
# ACCESS = %12
# CAPACITY = %9
# _DATE (ANY) = %11
# LOCATION = %18
# PCTUTIL = %6
# STATUS = %8
# VOLUME = %7
#
# INIT AND EXPORT ANY VARS
APP_HOME="/home/radsm/bin"
typeset -i COUNT
LAST_TAPE_DATE="0000-00-00"
MACHINE=$(uname -n)
typeset -i NUMBER_OF_BACKUPFULL_VOLUMES
typeset -i RETURN_VALUE
TAPE_DATE=""
TAPE_NAME=""
TIMESTAMP=$(date)
###############################
# CHECK FOR ADSM SERVER RUNNING
#
COUNT=$(ps ax | grep dsmserv | grep -v grep | wc -l)
if [ "$COUNT" -eq 0 ];
        then
        exit 0
fi
########################################################
# ISSUE THE SQL TO ADSM
# BECAUSE THE VOLHISTORY date_time DOES NOT PRODUCE
# THE SAME OUTPUT RESULTS AS THE OTHER ONES WE ARE USING
# WITH THE MACRO FUNCTIONS WE ARE GOING TO MANUALLY
# PARSE THIS INFO BY GETTING ONLY THE VOLUME NAMES
# AND CHECKING THE DATE OF EACH ONE INDIVIDUALLY.
#
SELECT_INFO=$(dsmadmc -id=admin -password=XXXX\
        "select volume_name from volhistory\
        where type='BACKUPFULL'" |\
        egrep -v -e "^ADSTAR|^\(C\)|Server|^Command|\
        |^----|^Session|^ANS|^Date|Series|VOLUME_NAME")
#
# DEBUG UNCOMMENT
#
##echo $SELECT_INFO
###################
# CREATE THE FORMAT
#
echo ""
echo "DATE          = $TIMESTAMP"
echo "HOSTNAME      = $MACHINE"
echo "MESSAGE TYPE  = Adsm daily tape return to onsite"
echo "MESSAGE LEVEL = Return tapes from offsite to onsite"
echo ""
echo "The following tapes listed are being deleted from the volume history."
echo "Listed as BACKUPFULL tapes of the ADSM Database."
echo ""
echo " VOLUME LAST WRITE"
echo "------------------"
###########################################
# FOR EACH TAPE NAME GET THE date_time INFO
#
for TAPE_NAME in $SELECT_INFO
do
        TAPE_DATE=$(dsmadmc -id=admin -password=XXXX\
                "select date_time from volhistory\
                where volume_name='$TAPE_NAME' and type='BACKUPFULL'" |\
        egrep -v -e "^ADSTAR|^\(C\)|Server|^Command|\
        |^----|^Session|^ANS|^Date|Series|DATE_TIME")
        #
        # GET RID OF THE TIME INFO
        #
        TAPE_DATE=$(echo $TAPE_DATE | awk '{print $1}')
        #
        # CHECK THE DATE BY CALLING THE 14 DAY SCRIPT
        #
        RETURN_VALUE=$($APP_HOME/adsm.chk.14.days.sh $TAPE_DATE)
        #
        # A RETURN VALUE OF 1 MEANS THE DATE IS OLDER THAN 14 DAYS.
        #
        if [ "$RETURN_VALUE" -eq 1 ];
                then
                #
                # LIST THE TAPES WHICH ARE FROM THE DATE 14 DAYS
                # OR MORE
                #
                echo $TAPE_NAME"  "$TAPE_DATE
                #
                # KEEP UP WITH THE LAST TAPE THAT MEETS THIS CRITERIA
                #
                LAST_TAPE_DATE=$TAPE_DATE
        fi
done
#
# IF THE LAST_TAPE_DATE NE 0000-00-00 THAN
# THERE WAS AT LEAST ONE TAPE OLDER THAN 14 DAYS.
#
if [ "$LAST_TAPE_DATE" != "0000-00-00" ];
        then
        #
        # NOW REFORMAT THE LAST_TAPE_DATE FROM yyyy-mm-dd TO mm/dd/yyyy
        #
        #
        # GRAB THE MONTH FROM THE MIDDLE
        #
        DELETE_VOLHISTORY_FROM_DATE=$(echo $LAST_TAPE_DATE |\
                         cut -f 2 -d '-')
        #
        # CONCATENATE THE SLASH AND THE DAY ON THE END OF THE MONTH
        #
        DELETE_VOLHISTORY_FROM_DATE=$DELETE_VOLHISTORY_FROM_DATE"/"$(echo 
$LAST_TAPE_DATE | cut -f 3 -d '-')
        #
        # CONCATENATE THE SLASH AND THE YEAR ON THE END OF THE MONTH/DAY
        #
        DELETE_VOLHISTORY_FROM_DATE=$DELETE_VOLHISTORY_FROM_DATE"/"$(echo 
$LAST_TAPE_DATE | cut -f 1 -d '-')
        #
        # DISPLAY THE OUTPUT FROM THE COMMAND
        #
        echo ""
        echo COMMAND BEING ISSUED"
        echo "delete volhistory todate=$DELETE_VOLHISTORY_FROM_DATE 
totime=12:00:00 
type=all"
        dsmadmc -id=admin -password=XXXX "delete volhistory 
todate=$DELETE_VOLHISTORY_FROM_DATE totime=12:00:00 type=all"
#
# END IF LAST_TAPE_DATE NE 0000-00-00
#
fi
#
# BEGIN IF LAST_TAPE_DATE EQ 0000-00-00
# IF TRUE THAN THERE WERE NO TAPES OLDER THAN 14 DAYS.
# 
if [ "$LAST_TAPE_DATE" = "0000-00-00" ];
        then
        echo "NO TAPES"
#
# END IF LAST_TAPE_DATE EQ 0000-00-00
#
fi
#
# THROW IN A EXIT FOR GOOD LUCK
#
exit 0




#!/bin/ksh
# Korn Shell
# check.date.X.days.sh: Check date by X days shell
# Written By: Bart G. Colbert 10/05/1999
#
# Before using this script check the TYPE_OF_DATE variable.
# Type 1) yyyy-mm-dd
# Type 2) mm-dd-yyyy
# Type 3) yyyy/mm/dd
# Type 4) mm/dd/yyyy
# Type 5) mmddMMSSyyyy
# Type 6) Month dd yyyy
# NOTE SEE NOTE ABOUT CHANGES FOR TYPE 6 IF THE INPUT STRING IS ENCLOSED IN
# DOUBLE QUOTES. BELOW AT FUNCTION.
#
# ALSO SET THE NUMBER OF DAYS BACK TO CHECK FROM CURRENT DATE.
# NUMBER_OF_DAYS VARIABLE BELOW.
# 
# You set the number of days back you want to compare from the current system
# date. The script gets the system date and then uses the calendar command to
# get the information about the prior month. 
#
# If the month is Jan (1) then it sets the prior year back a year also.
#
# Once it has the prior month correct it calls the calendar to get the days
# of that month/year and stores them for eval.
#
# Then find the last day of both the current month and prior. From 28-31.
#
# It subtracts the number of days that you specify and checks for that date
# being in the current month or prior month.
#
# If it is in the prior month and greater than the base day
# base day = current date - number of days
# then it is within the range and returns a value of 0
#
# If it is in the current month and the prior month is less than the current
# month and the day is less that the current day then it is within the 
# range and returns a value of 0
#
# If it is in the current month and the base day is also in the current month
# then it checks for the gt the base day and lt the current day
#
# If it is the current day the its also true and returns a value of 0
#
# If the year is lt the base year than its false and returns a 1
#
# If the year is eq the base year and the month is lt the base month than its 
false
# and returns a value of 1
#
# If the year is gt the current year than its in the future and returns a 
value of 2
#
# If the year is the current year and the month is the current month and the 
day
# is gt today than its also in the future and returns a value of 2
# 
# If there is a bug and nothing gets set it returns a value of 3
# 
# 
VERSION="1.1"
#
# Revsisions:
#
# *) 01/07/2000 Bart Colbert V1.1
#    A variable was misnamed WITHIN_RANGE and corrected to WITHIN_DATE_RANGE.
#
# INIT AND EXPORT ANY VARS
#
APP_HOME="/home/radsm/bin"
typeset -i BAD_DATE_VALUE=2
typeset -i BASE_DAY
typeset -i BASE_MONTH
typeset -i BASE_YEAR
typeset -i CHECKFOR_DAY
typeset -i CHECKFOR_MONTH
typeset -i CHECKFOR_YEAR
CURRENT_MONTH_DAYS=""
typeset -i DAY_VAL
typeset -i LAST_DAY_OF_MONTH
typeset -i LAST_DAY_OF_PRIOR
typeset -i MONTH_VAL
typeset -i NUMBER_OF_DAYS=14
typeset -i OUT_OF_DATE_RANGE=1
PRIOR_MONTH_DAYS=""
typeset -i PRIOR_MONTH
typeset -i PRIOR_YEAR
typeset -i RETURN_VALUE=3
typeset -i SUBTRACTED_DAYS
typeset -i TYPE_OF_DATE=1
typeset -i WITHIN_DATE_RANGE=0
typeset -i YEAR_VAL
#
# SET THE DATE FORMAT IN THE INIT VARS ABOVE
# TYPE_OF_DATE=1 yyyy-mm-dd
#
if [ "$TYPE_OF_DATE" -eq 1 ];
        then
        #
        # CONVERT $1 TO VALUES FOR FORMAT yyyy-mm-dd
        #
        CHECKFOR_DAY=$(echo $1 | cut -f 3 -d "-")
        CHECKFOR_MONTH=$(echo $1 | cut -f 2 -d "-")
        CHECKFOR_YEAR=$(echo $1 | cut -f 1 -d "-")
fi
#
# SET THE DATE FORMAT IN THE INIT VARS ABOVE
# TYPE_OF_DATE=2 mm-dd-yyyy
if [ "$TYPE_OF_DATE" -eq 2 ];
        then
        #
        # CONVERT $1 TO VALUES FOR FORMAT mm-dd-yyyy
        #
        CHECKFOR_YEAR=$(echo $1 | cut -f 3 -d "-")
        CHECKFOR_DAY=$(echo $1 | cut -f 2 -d "-")
        CHECKFOR_MONTH=$(echo $1 | cut -f 1 -d "-")
fi
#
# SET THE DATE FORMAT IN THE INIT VARS ABOVE
# TYPE_OF_DATE=3 yyyy/mm/dd
if [ "$TYPE_OF_DATE" -eq 3 ];
        then
        #
        # CONVERT $1 TO VALUES FOR FORMAT yyyy/mm/dd
        #
        CHECKFOR_DAY=$(echo $1 | cut -f 3 -d "/")
        CHECKFOR_MONTH=$(echo $1 | cut -f 2 -d "/")
        CHECKFOR_YEAR=$(echo $1 | cut -f 1 -d "/")
fi
#
# SET THE DATE FORMAT IN THE INIT VARS ABOVE
# TYPE_OF_DATE=4 mm-dd-yyyy
if [ "$TYPE_OF_DATE" -eq 4 ];
        then
        #
        # CONVERT $1 TO VALUES FOR FORMAT mm/dd/yyyy
        #
        CHECKFOR_YEAR=`echo $1 | cut -f 3 -d "/"`
        CHECKFOR_DAY=`echo $1 | cut -f 2 -d "/"`
        CHECKFOR_MONTH=`echo $1 | cut -f 1 -d "/"`
fi
#
# SET THE DATE FORMAT IN THE INIT VARS ABOVE
# TYPE_OF_DATE=5 mmddMMSSyyyy
#
# NOTE THAT THIS PROGRAM DOES NOT EVAL ON TIME
# THE TIME FROM THIS FORMAT IS IGNORED
# THIS IS THE FORMAT OF THE errpt COMMAND
#
if [ "$TYPE_OF_DATE" -eq 5 ];
        then
        #
        # CONVERT $1 TO VALUES FOR FORMAT mmddMMSSyyyy
        #
        CHECKFOR_YEAR=`echo $1 | cut -c 8-12`
        CHECKFOR_DAY=`echo $1 | cut -c 3-4`
        CHECKFOR_MONTH=`echo $1 | cut -c 1-2`
fi
#
# SET THE DATE FORMAT IN THE INIT VARS ABOVE
# TYPE_OF_DATE=6 Month dd, yyyy
# MONTH MUST BE IN THIS FORMAT
# Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
# THIS IS THE FORMAT FROM A LONG FILE LISTING
#
# NOTE IF THE INPUT STRING IS GOING TO BE ENCLOSED
# IN DOUBLE QUOTES MAKING IT ALL ONE STRING AS THE
# SHELL SEES IT THEN YOU NEED TO CHANGE THE $2 AND $3
# OF THE ARGS BEING ECHOED TO $1 AND THE awk print
# STRINGS TO $2 AND $3 RESPECTIVELY.
# 
if [ "$TYPE_OF_DATE" -eq 6 ];
        then
        if [ `echo $1 | awk '{print $1}'` = "Jan" ];
                then
                CHECKFOR_MONTH=1
        fi
        if [ `echo $1 | awk '{print $1}'` = "Feb" ];
                then
                CHECKFOR_MONTH=2
        fi
        if [ `echo $1 | awk '{print $1}'` = "Mar" ];
                then
                CHECKFOR_MONTH=3
        fi
        if [ `echo $1 | awk '{print $1}'` = "Apr" ];
                then
                CHECKFOR_MONTH=4
        fi
        if [ `echo $1 | awk '{print $1}'` = "May" ];
                then
                CHECKFOR_MONTH=5
        fi
        if [ `echo $1 | awk '{print $1}'` = "Jun" ];
                then
                CHECKFOR_MONTH=6
        fi
        if [ `echo $1 | awk '{print $1}'` = "Jul" ];
                then
                CHECKFOR_MONTH=7
        fi
        if [ `echo $1 | awk '{print $1}'` = "Aug" ];
                then
                CHECKFOR_MONTH=8
        fi
        if [ `echo $1 | awk '{print $1}'` = "Sep" ];
                then
                CHECKFOR_MONTH=9
        fi
        if [ `echo $1 | awk '{print $1}'` = "Oct" ];
                then
                CHECKFOR_MONTH=10
        fi
        if [ `echo $1 | awk '{print $1}'` = "Nov" ];
                then
                CHECKFOR_MONTH=11
        fi
        if [ `echo $1 | awk '{print $1}'` = "Dec" ];
                then
                CHECKFOR_MONTH=12
        fi
        CHECKFOR_DAY=`echo $2 | awk '{print $1}'`
        CHECKFOR_YEAR=`echo $3 | awk '{print $1}'`
fi
#
# DEBUG UNCOMMENT BELOW
#
##echo $CHECKFOR_DAY
##echo $CHECKFOR_MONTH
##echo $CHECKFOR_YEAR
#
# GET CURRENT DAY
#
DAY_VAL=`date +"%d"`
#
# GET CURRENT MONTH
#
MONTH_VAL=`date +"%m"`
#
# GET CURRENT YEAR
#
YEAR_VAL=`date +"%Y"`
#
# DEBUG UNCOMMENT BELOW
#
##echo $DAY_VAL
##echo $MONTH_VAL
##echo $YEAR_VAL
#
# CHECK FOR JAN EQ TRUE
# IF SO PRIOR MONTH IS DEC
# AND PRIOR YEAR IS -1
#
if [ "$MONTH_VAL" -eq 1 ];
        then
{
        PRIOR_MONTH=12
        PRIOR_YEAR=YEAR_VAL-1
}
else
{
        PRIOR_MONTH=MONTH_VAL-1
        PRIOR_YEAR=YEAR_VAL
}
fi
#
# GET THE CALENDAR FOR CURRENT MONTH
# PARSE OUT THE TEXT
#
CURRENT_MONTH_DAYS=`cal $MONTH_VAL $YEAR_VAL |\
 tr -d ['abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ']`
#
# GET THE CALENDAR FOR PRIOR MONTH
# PARSE OUT THE TEXT
#
PRIOR_MONTH_DAYS=`cal $PRIOR_MONTH $PRIOR_YEAR |\
 tr -d ['abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ']`
#
# DEBUG UNCOMMENT BELOW
#
##echo $CURRENT_MONTH_DAYS
##echo $PRIOR_MONTH_DAYS
#
# LETS GET THE LAST DAY OF THE MONTH DOWN TO 28
#
LAST_DAY_OF_MONTH=`echo $CURRENT_MONTH_DAYS | cut -f 32 -d " "`
if [ "$LAST_DAY_OF_MONTH" -eq 0 ];
        then
        LAST_DAY_OF_MONTH=`echo $CURRENT_MONTH_DAYS | cut -f 31 -d " "`
        if [ "$LAST_DAY_OF_MONTH" -eq 0 ];
                then
                LAST_DAY_OF_MONTH=`echo $CURRENT_MONTH_DAYS | cut -f 30 -d " "`
                if [ "$LAST_DAY_OF_MONTH" -eq 0 ];
                        then
                        LAST_DAY_OF_MONTH=`echo $CURRENT_MONTH_DAYS | cut -f 29 
-d " "`
                fi
        fi
fi
#
# LETS GET THE LAST DAY OF PRIOR THE MONTH DOWN TO 28
#
LAST_DAY_OF_PRIOR=`echo $PRIOR_MONTH_DAYS | cut -f 32 -d " "`
if [ "$LAST_DAY_OF_PRIOR" -eq 0 ];
        then
        LAST_DAY_OF_PRIOR=`echo $PRIOR_MONTH_DAYS | cut -f 31 -d " "`
        if [ "$LAST_DAY_OF_PRIOR" -eq 0 ];
                then
                LAST_DAY_OF_PRIOR=`echo $PRIOR_MONTH_DAYS | cut -f 30 -d " "`
                if [ "$LAST_DAY_OF_PRIOR" -eq 0 ];
                        then
                        LAST_DAY_OF_PRIOR=`echo $PRIOR_MONTH_DAYS | cut -f 29 
-d " "`
                fi
        fi
fi
#
# DEBUG UNCOMMENT BELOW
#
##echo $LAST_DAY_OF_MONTH
##echo $LAST_DAY_OF_PRIOR
#
# SUBTRACT THE NUMBER OF DAYS TO EVAL FROM THE CURRENT DAY
# CHECK TO SEE IF THE NUMBER IS GT, EQ, LT ZERO
#
SUBTRACTED_DAYS=DAY_VAL-NUMBER_OF_DAYS
#
# IF THE NUMBER OF DAYS IS GREATER THAN ZERO THAN
# THE DAY YOU ARE LOOKING FOR IS IN THE CURRENT MONTH
#
if [ "$SUBTRACTED_DAYS" -gt 0 ];
        then
        BASE_DAY=SUBTRACTED_DAYS
        BASE_MONTH=MONTH_VAL
        BASE_YEAR=YEAR_VAL
fi
if [ "$SUBTRACTED_DAYS" -eq 0 ];
        then
        BASE_DAY=LAST_DAY_OF_PRIOR
        BASE_MONTH=PRIOR_MONTH
        BASE_YEAR=PRIOR_YEAR
fi
if [ "$SUBTRACTED_DAYS" -lt 0 ];
        then
        BASE_DAY=LAST_DAY_OF_PRIOR+SUBTRACTED_DAYS
        BASE_MONTH=PRIOR_MONTH
        BASE_YEAR=PRIOR_YEAR
fi
#
# DEBUG UNCOMMENT BELOW
#
##echo $BASE_DAY
##echo $BASE_MONTH
##echo $BASE_YEAR
#
# START BY CHECK IF YEAR IS LESS THAN BASE YEAR
#
if [ "$CHECKFOR_YEAR" -lt "$BASE_YEAR" ];
        then
        #
        # IF THE YEAR IS LESS THAN THE BASE YEAR
        # THEN ITS OBVIOUSLY OUT OF RANGE
        #
        RETURN_VALUE=OUT_OF_DATE_RANGE
fi
if [ "$CHECKFOR_YEAR" -eq "$BASE_YEAR" ];
        then
        #
        # CHECK IF MONTH IS LT BASE MONTH
        #
        if [ "$CHECKFOR_MONTH" -lt "$BASE_MONTH" ];
                then
                RETURN_VALUE=OUT_OF_DATE_RANGE
        fi
        #
        # CHECK IF MONTH IS EQ BASE MONTH
        #
        # AT THIS POINT WE WILL NOT CHECK TO SEE IF BASE MONTH
        # EQ CURRENT MONTH WE DO THAT AFTER
        #
        if [ "$CHECKFOR_MONTH" -eq "$BASE_MONTH" ];
                then
                #
                # CHECK IF DAY IS LT BASE DAY
                # IF TRUE THE THE YEAR MONTH ARE EQ BUT DAY IT LT
                #
                if [ "$CHECKFOR_DAY" -lt "$BASE_DAY" ];
                        then
                        RETURN_VALUE=OUT_OF_DATE_RANGE
                fi
                #
                # CHECK IF DAY IS EQ BASE DAY
                # IF TRUE THEN YEAR MONTH DAY ARE ALL EQ
                #
                if [ "$CHECKFOR_DAY" -eq "$BASE_DAY" ];
                        then
                        RETURN_VALUE=WITHIN_DATE_RANGE
                fi
                #
                # CHECK IF DAY IS GT BASE DAY
                # IF TRUE THAN YEAR MONTH ARE EQ BUT DAY IS GT
                #
                if [ "$CHECKFOR_DAY" -gt "$BASE_DAY" ];
                        then
                        RETURN_VALUE=WITHIN_DATE_RANGE
                fi
        fi
        #
        # CHECK FOR CHECKFOR MONTH EQ CURRENT
        #
        if [ "$CHECKFOR_MONTH" -eq "$MONTH_VAL" ];
                then
                #
                # NOW IF CHECKFOR DAY IS GT
                # THEN FUTURE DAY
                #
                if [ "$CHECKFOR_DAY" -gt "$DAY_VAL" ];
                        then
                        RETURN_VALUE=BAD_DATE_VALUE
                fi
                #
                # CHECK FOR TODAY
                #
                if [ "$CHECKFOR_DAY" -eq "$DAY_VAL" ];
                        then
                        RETURN_VALUE=WITHIN_DATE_RANGE
                fi
                #
                # IF RETURN VAL IS NOT SET
                # AND THE YEAR MONTH EQ CURRENT
                # AND THE DAY IS LESS THAN ITS WITHIN
                #
                if [ "$RETURN_VALUE" -eq 3 ];
                        then
                        if [ "$CHECKFOR_DAY" -lt "$DAY_VAL" ];
                                then
                                RETURN_VALUE=WITHIN_DATE_RANGE
                        fi
                fi
        fi
        #
        # CHECK IF MONTH IS GT BASE MONTH
        #
        if [ "$CHECKFOR_MONTH" -gt "$BASE_MONTH" ];
                then
                if [ "$CHECKFOR_MONTH" -ne "$MONTH_VAL" ];
                        then
                        RETURN_VALUE=BAD_DATE_VALUE
                fi
        fi
fi
#
# IF CHECKFOR YEAR IS GT BASE YEAR
#
if [ "$CHECKFOR_YEAR" -gt "$BASE_YEAR" ];
        then
        #
        # IF THE YEAR IS GREATER THAN THE CURRENT YEAR
        # THAN ITS THE FURTURE !NOT
        #
        if [ "$CHECKFOR_YEAR" -gt "$YEAR_VAL" ];
                then
                RETURN_VALUE=BAD_DATE_VALUE
        fi
        #
        # IF THE YEAR IS THE CURRENT YEAR
        # THIS SHOULD TAKE CARE OF EVAL DATE IN 2000
        # AND BASE DATE IN 1999
        # AND THE CURRENT DATE IS IN 2000
        #
        if [ "$CHECKFOR_YEAR" -eq "YEAR_VAL" ];
                then
                #
                # CHECK IF THE MONTH IS LT THE CURRENT MONTH
                #
                if [ "$CHECKFOR_MONTH" -lt "$MONTH_VAL" ];
                        then
                        #
                        # THIS MEANS THAT THE CHECKFOR YEAR IS
                        # THE CURRENT YEAR AND AHEAD OF THE BASE
                        # YEAR BY ONE AND THE CHECKFOR MONTH IS LESS
                        # THAN THE CURRENT MONTH SO NO NEED TO
                        # CHECK THE DAY IT IS IN THE RANGE
                        #
                        RETURN_VALUE=WITHIN_RANGE
                fi
                #
                # CHECK IF THE MONTH IS EQ THE CURRENT MONTH
                #
                if [ "$CHECKFOR_MONTH" -eq "$MONTH_VAL" ];
                        then
                        #
                        # THIS MEANS THAT THE CHECKFOR YEAR IS
                        # THE CURRENT YEAR AND AHEAD OF THE BASE
                        # YEAR BY ONE AND THE CHECKFOR MONTH IS EQUAL
                        # THE CURRENT MONTH SO LETS CHECK THE DAY
                        # THE ONLY OPTIONS ARE IF THE DAY IS VALID
                        # OR NOT, REASON IF THE DAY IS LT OR EQ
                        # AND WE KNOW THE CHECKFOR YEAR IS GT THE BASE
                        # AND WE ARE A YEAR AHEAD OF THE BASE
                        # NO NEED TO CHECK BACK THERE AGAIN
                        #
                        if [ "$CHECKFOR_DAY" -gt "$DAY_VAL" ];
                                then
                                RETURN_VALUE=BAD_DATE_VALUE
                        else
                                RETURN_VALUE=WITHIN_DATE_RANGE
                        fi
                fi
                #
                # CHECK IF THE MONTH IS GT THE CURRENT MONTH
                # IF SO THIS IS A FUTURE DATE
                #
                if [ "$CHECKFOR_MONTH" -gt "$MONTH_VAL" ];
                        then
                        RETURN_VALUE=BAD_DATE_VALUE
                fi
        fi
        
fi
echo $RETURN_VALUE



NOTE: This information is for educational purposes.
Rayonier, Inc. in no manner warrents the vailidty of functionality of this 
code.

PS. You will have to change references to site specific names such as 
LOCATION=ONSITE_IBM7337 in the C code above to meet your definitions.
<Prev in Thread] Current Thread [Next in Thread>
  • [no subject], Unknown <=