> Date: Thu, 20 Jun 2002 20:48:31 -0500
> From: "Jesse Angell" <[EMAIL PROTECTED]>
> 
>     I need to write a shell script to do the following
> edit the /www/conf/httpd.conf file
> and search for the
> <VirtualHost *>
> DocumentRoot /var/www/virtual/$user/html
> Servername $user.palaceunlimited.com
> ErrorLog /var/www/virtual/$user/logs/error_log
> CustomLog /var/www/virtual/$user/logs/access_log combined
> </VirtualHost>
> and then delete all of that for the specified user varible..
> So it looks for the user specified.. then deletes all of the users
> virtual host stuff including the start of the virtual host and the
> closing of it..
> Please help me out...

Not a shell script. You want awk or perl, though I suppose you
might want a shell script to run it. So....

#!/bin/sh   
# ALWAYS put in the line above. It make sure that the script
#   is read and interpreted by the correct shell.

if [ $# -ne 2 ]; then
   echo "Usage: $0 username"
   echo "   Where username is the name of the user to be removed"
   exit
fi

awk -v USERNAME=$1 
    "{ vh = ( $1 ~ /VirtualHost/)? 1 : 0;  £ if this is a start/end, set
switch
       if ( $0 ~ USERNAME ) {    # if this line has the user to go on
it,
          thisone++;             # make sure the switch is set
          next;                  # and skip this line
       }
       if ( vh ) {               # if this is a VirtualHost line,
          if ( thisone )         # and it's the end of the user
             thisone = 0;        # reset the switch,
          else                   # otherwise (it's the beginning)
             save++;             # set a switch that you just had a
start
          next;                  # skip this line
       } else                    # You can't get here, if the last
          if ( save && ! thisone ) { # the last line was a start, and
this
             save = 0;           # isn't the user to go, unset the
switch
             print "<VirtualHost *>"; # print the start
          }                      
       print $0;                 # print the line that you read in
}
END{
   if ( ! thisone )              # if the last set was not the user to
go,
      print $0;                  # make sure you print out the final stop
}  /www/conf/httpd.conf > /tmp/httpd.tmp

if [ -z /tmp/httpd.tmp ]; then
   if [ -e /www/conf/httpd.conf.old ]; then
      rm /www/conf/httpd.conf.old
   fi
   mv /www/conf/httpd.conf /www/conf/httpd.conf.old
   mv /tmp/httpd.tmp /www/conf/httpd.conf 
fi

# end of script

$0 is the name of the script that's running, $# is the number
of arguments passed in - in this case, we *only* want the script
name, and the user to be terminated, $1-$n are the values of the
arguments.

In the awk command, -v tells it that you want to create a variable
that will be used inside the awk script, and lets you give it a
value.  In this case, you've passed the username to it.

>From the original file, we create a tempfile, then, when done,
delete the old save file, if it exists, save the current file, and
write the new one...*if* the new one was correctly written (in
this case, has a file length > 0).

I have tested the awk script, though not the shell.

        mark
-- 
"GUILTY, GUILTY, GUILTY!" - Megaphone Mark Slackmeyer, Doonesbury



_______________________________________________
Redhat-list mailing list
[EMAIL PROTECTED]
https://listman.redhat.com/mailman/listinfo/redhat-list

Reply via email to