"Walk" apache installs and do a tar on them...

Hello unix.com Community:

I need help with writing a "common" script that can get the httpd installs by name and install directory|ies and tar.gz them up by name and point that tar operation to the matching install directory.

I have 2 Distros that I am concerned with for this task: CentOS and Ubuntu.

Here's the facts that I've managed to collect so far:
CentOS stores http installs in either /etc/httpd/conf.d/.conf and/or in /etc/httpd/conf/conf files.
Ubuntu stores http installs in /etc/apache2/
.conf and/or /etc/apache2/conf.d/
.conf files. In the real world, they could be anywhere.

I started off with my old favorite "bash" but am having trouble with duplicates in the output.
I thought of perl, something I know nothing about but know there are 1000s of examples/demos/tuts on the net. Maybe later... :slight_smile:

the "meat" of the code that I've hacked together and gets me most of the way there:
CentOS:

grep -h "Alias /" /etc/httpd/conf.d /etc/httpd/conf/ -R  | egrep -v "home|ScriptAlias|#|doc|error|icons|javascript"

and that spits out
Alias /zabbix /usr/local/share/zabbix

Ubuntu:

grep -h "Alias /" /etc/apache2/*.conf /etc/apache2/conf.d/*.conf -R  | egrep -v "home|ScriptAlias|#|doc|error|icons|javascript"

and spits out
Alias /cacti2 /var/www/cacti2
Alias /icinga "/usr/local/icinga/share/"

What I NEED is Field2 to be the "$APACHEPROG" variable (stripping the '/' in position #2) of course) and Field3 to be the "$APACHEPROGPATH" (stripping the quotes, if any?) for

tar -pczf "$APACHEPROG".tar.gz "$APACHEPROGPATH"

I have a generic bash script that can 'read' the OS (either Ubuntu or CentOS) and do stuff accordingly:

grep -iq "CentOS" /proc/version 
if [ $? = '0' ];then
OS="CentOS"
do CentOS stuff
else
OS="Ubuntu"
do Ubuntu stuff
fi

It still needs work (error handling if NOT CentOS or Ubuntu) and some logging feature, but I'd like to get this step working first.

Any help would surely be appreciated.
I will of course post the solution on Bourne to raise $shell with credit to the contributor.

Thank you all for your time.

To capture part of the output of your grep into a variable you can do following:

your_script | while read col1 col2 col3; do # this will place "words" of your output into col1 col2 col3 variables
  APACHEPROG=${col2#?}; # this removes 1st char from second word and stores into APACHEPROG
 
now you can do your tar -pczf ...
done
1 Like

Thanks migurus:
I re-thought the process and got a solution for CentOS

### Set/force "uniqueness" of tar archive in a general way
TARDATE=$(date '+%m-%d-%Y.%s')

### Set the Apache conf and conf.d directories and 
### IGNORE all Apache installed defaults ("home|ScriptAlias|#|doc|error|icons|javascript") from .conf files
APACHEPROGBASE=$(grep -h "Alias /" /etc/httpd/conf.d /etc/httpd/conf/ -R  | egrep -v "home|ScriptAlias|#|doc|error|icons|javascript" | awk '{print $2 " "$3}')

### Get the APACHE PROgram NAMEs to be used in the tar operation
APACHEPROGNAME=$(echo "$APACHEPROGBASE" | awk '{print $1}' | sed -e 's/\///g')

### Get the APACHE PROgram PATHs to "$APACHEPROGNAME"
APACHEPROGPATH=$(echo "$APACHEPROGBASE" | awk '{print $2}')

### tar up the results
for i in "$APACHEPROGBASE" ; do echo tar -pczf "$APACHEPROGNAME"."$TARDATE".tar.gz "$APACHEPROGPATH" ; done

tar -pczf zabbix.05-05-2012.1336255870.tar.gz /usr/local/share/zabbix

1\2 way there...

The Ubuntu host however barfs with this:

for i in "$APACHEPROGBASE" ; do echo tar -pczf "$APACHEPROGNAME"."$TARDATE".tar.gz "$APACHEPROGPATH" ; done

tar -pczf cacti2
icinga.05-05-2012.1336256926.tar.gz /var/www/cacti2
/usr/local/icinga/share/

I "think" it may be the 'echo" messing with my head.

CentOS bash is GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Ubuntu bash is GNU bash, version 4.1.5(1)-release (i686-pc-linux-gnu)

Thanks for listening to me go on about this. :slight_smile:

Edit: I wish it was simply the echo messing with me, but apparently not...

echo "$APACHEPROGBASE"
/cacti2 /var/www/cacti2
/icinga /usr/local/icinga/share/
root@icinga:/tmp# echo "$APACHEPROGNAME"
cacti2
icinga
root@icinga:/tmp# echo "$APACHEPROGPATH"
/var/www/cacti2
/usr/local/icinga/share/
...
for i in "$APACHEPROGNAME" ; do tar -pczf "$APACHEPROGNAME".tar.gz "$APACHEPROGPATH" ; done
tar: Removing leading `/' from member names
tar: /var/www/cacti2\n/usr/local/icinga/share: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

and this articfact...cacti2?icinga.tar.gz

Tomorrow is another day!

Thanks.

migurus:

+1 and props for the heads up!

Solution is much simpler that I anticipated. Funny what 2 days away from the keyboard can do... :slight_smile:

gta.sh (Grab That Apache)

grep -iq "CentOS" /proc/version 
if [ $? = '0' ];then
OS="CentOS"
cd /mybackups
echo \#\!/bin/bash > gta.sh
chmod 700 gta.sh
TARDATE=$(date '+%m-%d-%Y.%s')
APACHEPROGBASE=$(grep -h "Alias /" /etc/httpd/conf.d /etc/httpd/conf/ -R  | egrep -v "home|ScriptAlias|#|doc|error|icons|javascript" | awk '{print $1 " "$2 " "$3}' | sed -e 's/Alias \///g' | sed -e 's/"//g')
echo "$APACHEPROGBASE" | while read col1 col2 ; do echo "/bin/tar -pzcf" "$col1"_"$TARDATE".tar.gz "$col2" ;done >> gta.sh
/mybackups/gta.sh
else
OS="Ubuntu"
cd /mybackups
echo \#\!/bin/bash > gta.sh
chmod 700 gta.sh
TARDATE=$(date '+%m-%d-%Y.%s')
APACHEPROGBASE=$(grep -h "Alias /" /etc/apache2/*.conf /etc/apache2/conf.d/*.conf -R  | egrep -v "home|ScriptAlias|#|doc|error|icons|javascript" | awk '{print $1 " "$2 " "$3}' | sed -e 's/Alias \///g' | sed -e 's/"//g')
echo "$APACHEPROGBASE" | while read col1 col2 ; do echo "/bin/tar -pzcf" "$col1"_"$TARDATE".tar.gz "$col2" ;done >> gta.sh
/mybackups/gta.sh
fi

Still needs logging and error handling. but it works!