Sponsored Content
Top Forums Shell Programming and Scripting String processing to compare dates Post 302543439 by joshuaspence on Sunday 31st of July 2011 08:29:46 PM
Old 07-31-2011
String processing to compare dates

Hi all,

I have been scripting a shell script to allow me to easily create htaccess users and add them to existing htaccess groups etc.

However, the main part of the script that I am trying to accomplish is to store additional metadata in comments in the htpasswd file. I am trying to store an expiry date in the comments, such that the htpasswd file can be scanned and any users with expiry dates that are in the past can be deleted.

The syntax of the htpasswd file with expiry date metadata is:
Code:
username:ABCDEFG   (tab)   # comment [exp:YYYY-MM-DD]

I am now trying to write the script to scan the htpasswds file and delete expired users. This is what the script needs to do:
  1. Check each line in htpasswds
  2. If the user in htpasswds has no comment, or if the expiry date of the current user is a date that has not yet passed, then skip this user.
  3. Else, delete this user from the htpasswds now.
  4. Scan the htgroups file for all instances of this user and delete them (being weary of comments in the file)
  5. If, after deleting the user from a group, the group is left empty, delete the group (as well as a few lines of comments appearing above the group) from htgroups.
This is my current code to achieve the above steps. I stopped however because I am sure there is a more efficient way to achieve this (Perl, Awk, Sed, ..., I'm not really sure).

Code:
# loop through each line of htpasswd
(
    while read line; do            
        # extract the username from the line
        line_user=$(echo `echo "$line" | cut -d: -f1`)
        [ -n "$VERBOSE" ] && echo "Checking expiry of user '$line'" >&2
        
        # extract the expiry date from the line
        line_date=$(echo `echo "$line" | grep -o "\[exp:[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\]" | grep -o "[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}"`)

        if [ -n "$line_date" ]; then
            EXPIRED=
            
            # break the expiry date into a year, month and date
            line_year=$(echo `echo "$line_date" | cut -d- -f1`)
            line_month=$(echo `echo "$line_date" | cut -d- -f2`)
            line_date=$(echo `echo "$line_date" | cut -d- -f3`)
            
            if [ $line_year -lt $today_year ]; then
                EXPIRED=1
            elif [ $line_year -eq $today_year ]; then
                if [ $line_month -lt $today_month ]; then
                    EXPIRED=1
                elif [ $line_month -eq $today_month ]; then
                    if [ $line_date -lt $today_date ]; then
                        EXPIRED=1
                   fi
                fi
            fi
            
            if [ -z "$EXPIRED" ]; then
                # not expired, output the user back to htpasswds
                echo "$line"
            else
                [ -n "$VERBOSE" ] && echo "User has expired. Deleting..." >&2
                
                echo "Haven't yet implemented deleting user from htgroups. This needs to be done manually!" >&2
                # also delete the user from htgroups
                #(
                #    while read line2; do
                #        #new_group=$(echo `echo "$line2" | grep -o "^[^#].*:*\[ $line_user \]" | grep -o "^[^#].*:*\[$line_user \]" | grep -o "^[^#].*:*\[ $line_user\]"sed 's/^[^#].*:$/'`)
                #    done < $HTGROUPS
                
                #) > $HTGROUPS.tmp    
            fi
        else
            # user doesn't have an expiry date, output the user back to htpasswds
            echo "$line"
        fi
    done < $HTPASSWD
) > $HTPASSWD.tmp

# move temp file
rm -f $HTPASSWD
mv $HTPASSWD.tmp $HTPASSWD

 

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

compare two dates

I have a log file with date format like 10-Oct-02 13:20:29 ..... at the beginning of each line in the log file, and I need to grep data from this file to list the lines with date no longer than one days. I tried to use awk to do this but it looks very complicated to do it. Is there... (6 Replies)
Discussion started by: wchen
6 Replies

2. Programming

How to compare two dates

Hi I am writing a unix program. In that, i should compare two dates. I would like to know how to compare two dates in unix-whether they are same or not. pls help (5 Replies)
Discussion started by: bankpro
5 Replies

3. Programming

How to compare dates in C/C++

Hi, Is there any system defined function to compare two dates in C/C++? Thanks (1 Reply)
Discussion started by: naan
1 Replies

4. Shell Programming and Scripting

compare dates...

hi all :) how can in compare yyyy/dd/mm with yyyy/dd/mm in perl i want the result like grater than or less than the given date... thanks in advance (3 Replies)
Discussion started by: i_priyank
3 Replies

5. Shell Programming and Scripting

How to compare the dates..

Hi all, I've written a script which gives the below information... End Date&Time: 2008-10-21 10.54.37 Now i want to calculate this time with the current time.. and if its more than 48 hours past with the current time it should echo "48 Hours back" Please help me.. thanks in... (4 Replies)
Discussion started by: suri.tyson
4 Replies

6. Shell Programming and Scripting

compare between the two dates

Hi all, How to check whether the given the two dates is minimal. example: Date 1 : 23-03-2008 with timestamp Date 2: 20-03-2008 With tmestamp I want to compare the twodates and which it gives the minimum date i wnat to get the output like this below output: the Date2 is... (1 Reply)
Discussion started by: balaji23_d
1 Replies

7. Shell Programming and Scripting

compare dates

I want to compare a list of dates in a file with today's date & list only dates that are less than only 60 days old . please help . the date in the file are in format 11-FEB-2009 02-FEB-2009 26-JAN-2009 24-JAN-2009 13-JAN-2009 16-DEC-2008 10-DEC-2008 01-DEC-2008 25-NOV-2008 19-NOV-2008... (3 Replies)
Discussion started by: skamal4u
3 Replies

8. Shell Programming and Scripting

The Best Way to Compare Dates

Hi to all. When you have to compare a lot of dates in a SH code, there is a way to directly compare? For example, how can I check if two dates differ in less than a week? Thank's for reading. (2 Replies)
Discussion started by: daniel.gbaena
2 Replies

9. HP-UX

Compare dates

Hi, I want to convert two datetime fields to find out if the difference is one hour, in linux I've done this by converting both the datetime values to unix epoch time and subtracting them to find out if the difference is more than 3600s, however this does not work in hp-ux. I've these... (3 Replies)
Discussion started by: Random_Net
3 Replies

10. Shell Programming and Scripting

Compare Dates.

Hi All, I am entering StartDate and EndDate as parameters to script. Want to have an check saying, "If StartDate is greater than EndDate then don't execute the script". Pseudo Code: if then Execute script else exit 0 fi Can you please help me on the same? Thanks and... (4 Replies)
Discussion started by: Nagaraja Akkiva
4 Replies
All times are GMT -4. The time now is 10:30 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy