Skip to content

Instantly share code, notes, and snippets.

@rutcreate
Created November 30, 2013 08:24
Show Gist options
  • Save rutcreate/7716639 to your computer and use it in GitHub Desktop.
Save rutcreate/7716639 to your computer and use it in GitHub Desktop.
#!/bin/sh
#================================================================================
# virtualhost.sh
#
# A fancy little script to setup a new virtualhost in Mac OS X.
#
# If you want to delete a virtualhost that you've created, you need to:
#
# sudo ./virtualhost.sh --delete <site>
#
# where <site> is the site name you used when you first created the host.
#
# WHAT'S NEW IN v1.30
#
# - Fix deleting hosts when SKIP_ETC_HOSTS="yes"
#
# WHAT'S NEW IN v1.29
#
# - Bugfix to show hidden prompt.
#
# WHAT'S NEW IN v1.28
#
# - You can set SKIP_BROWSER="yes" to disable the browser launching. This
# changes the BATCH_MODE behaviour from 1.26 which didn't launch the
# browser with BATCH_MODE="yes".
#
# WHAT'S NEW IN v1.27
#
# - When looking for a document root, use find to traverse into the
# DOC_ROOT_PREFIX folder to a maximum depth of MAX_SEARCH_DEPTH.
#
# WHAT'S NEW IN v1.26
#
# - Added BATCH_MODE setting to auto-answer questions (Github issue #19)
# - Added SKIP_VERSION_CHECK setting to skip the version check.
#
# WHAT'S NEW IN v1.25
#
# - Added --list option to list any virtualhosts that have been setup
#
# WHAT'S NEW IN v1.24 (courtesy of http://github.com/aersoy)
#
# - Detect Symfony projects;
# - Changes to deleting virtual hosts:
# * Check existence of virtual host before asking for confirmation to delete
# * Ask for deletion of log files during --delete;
# - Default port for virtual host is a variable ($APACHE_PORT);
# - Allow for other browsers such as Google Chrome to be used when opening up
# the virtual host after it's completed.
#
# WHAT'S NEW IN v1.23
# - Fix a bug when automatically rerunning script using sudo.
# (Issue #11 reported and fixed by Jake Smith <Jake.Smith92>)
# - Fix a bug that prevented the document root from being deleted when a virtual
# host was deleted.
# (Issue #12 reported and fixed by Jake Smith <Jake.Smith92>)
#
# WHAT'S NEW IN v1.22
# - It is now possible to use this script in environments like FreeBSD. Some
# new configuration variables support this such as SKIP_ETC_HOSTS,
# HOME_PARTITION, and SKIP_DOCUMENT_ROOT_CHECK.
# - If you're doing Ruby on Rails, Merb, and other Rack-based development,
# the script looks for a public folder in your document root, and will
# optionally use that (assuming the use of Phusion Passenger:
# <http://modrails.com/>)
# - Support spaces in your document root. (Issue #10 by ryanilg.creative)
# - If you forget to run with sudo, you no longer have to re-run.
#
# WHAT'S NEW IN v1.21
# - virtualhost.sh now checks to see if a newer version is available! Amazing!
#
# WHAT'S NEW IN v1.20
# - [Issue #7] You can now have site-specific logs for each virtual host. See
# the configuration variables PROMPT_FOR_LOGS and ALWAYS_CREATE_LOGS for
# additional controls.
#
# WHAT'S NEW IN v1.19
# - [Issue #1] On Leopard, the first request to the new virtual host would fail.
# Have remedied this by making the first request in the script, in addition to
# the sleep 1 command.
# - [Issue #4] Some users reported an error originating from a missing group.
# Looks like Leopard doesn't create a group with the same name as the user like
# previous versions (and most other Unix-variants!) do. It was never a problem
# for me because my user account was created on Mac OS X 10.0, and has been
# migrated from machine to machine and with every upgrade, and my "patrick"
# group has remained. (Thanks to Matt Sephton for reporting and providing a
# patch!)
#
# WHAT'S NEW IN v1.18
# - [Issue #2] Add a new option $OPEN_COMMAND to specify which app should be
# used when launching the virtual host. See below for examples.
# - [Issue #3] Make sure sudo is used to run the command so that we know the
# actual user's user name.
#
# WHAT'S NEW IN v1.17
# - You can now store any configuration values in ~/.virtualhost.sh.conf.
# This way, you can update the script without losing your settings.
#
# WHAT'S NEW IN v1.16
# - Add feature to support a ServerAlias using a wildcard DNS host. See the
# Wiki at http://code.google.com/p/virtualhost-sh/wiki/Wildcard_Hosts
#
# WHAT'S NEW IN v1.15
# - Fix a bug in host_exists() that caused it never to work (thanks to Daniel
# Jewett for finding that).
#
# WHAT'S NEW IN v1.14
# - Fix check in /etc/hosts to better match the supplied virtualhost.
# - Fix check for existing folder in your Sites folder.
#
# WHAT'S NEW IN v1.06
# - Support for Leopard. In fact, this version only supports Leopard, and 1.05
# will be the last version for Tiger and below.
#
# WHAT'S NEW IN v1.05
# - The $APACHECTL variable wasn't been used. (Thanks to Thomas of webtypes.com)
#
# WHAT'S NEW IN v1.04
# - An oversight in the change in v1.03 caused the ownership to be incorrect for
# a tree of folders that was created. If your site folder is a few levels deep
# we now fix the ownership properly of each nested folder. (Thanks again to
# Michael Allan for pointing this out.)
#
# - Improved the confirmation page for when you create a new virtual host. Not
# only is it more informative, but it is also much more attractive.
#
# WHAT'S NEW IN v1.03
# - When creating the website folder, we now create all the intermediate folders
# in the case where a user sets their folder to something like
# clients/project_a/mysite. (Thanks to Michael Allan for pointing this out.)
#
# WHAT'S NEW IN v1.02
# - Allow for the configuration of the Apache configuration path and the path to
# apachectl.
#
# WHAT'S NEW IN v1.01
# - Use absolute path to apachectl, as it looks like systems that were upgraded
# from Jaguar to Panther don't seem to have it in the PATH.
#
#
# by Patrick Gibson <[email protected]>
#================================================================================
# Don't change this!
version="1.30"
#
# No point going any farther if we're not running correctly...
if [ `whoami` != 'root' ]; then
echo "virtualhost.sh requires super-user privileges to work."
echo "Enter your password to continue..."
sudo $0 $* || exit 1
exit 0
fi
if [ "$SUDO_USER" = "root" ]; then
/bin/echo "You must start this under your regular user account (not root) using sudo."
/bin/echo "Rerun using: sudo $0 $*"
exit 1
fi
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# If you are using this script on a production machine with a static IP address,
# and you wish to setup a "live" virtualhost, you can change the following IP
# address to the IP address of your machine.
#
IP_ADDRESS="127.0.0.1"
# By default, this script places files in /Users/[you]/Sites. If you would like
# to change this, like to how Apple does things by default, uncomment the
# following line:
#
#DOC_ROOT_PREFIX="/Library/WebServer/Documents"
# Configure the apache-related paths
#
APACHE_CONFIG="/private/etc/apache2"
APACHECTL="/usr/sbin/apachectl"
# If you wish to change the default application that gets launched after the
# virtual host is created, define it here:
OPEN_COMMAND="/usr/bin/open"
# If you want to use a different browser than Safari, define it here:
#BROWSER="Firefox"
#BROWSER="WebKit"
#BROWSER="Google Chrome"
# If defined, a ServerAlias os $1.$WILDCARD_ZONE will be added to the virtual
# host file. This is useful if you, for example, have setup a wildcard domain
# either on your own DNS server or using a server like dyndns.org. For example,
# if my local IP of 10.0.42.42 is static (which can still be achieved using a
# well-configured DHCP server or an Apple Airport Extreme 802.11n base station)
# and I create a host on dyndns.org of patrickdev.dyndns.org with wildcard
# hostnames turned on, then defining my WILDCARD_ZONE to "patrickdev.dyndns.org"
# will enable access to my virtual host from any machine on the network. Note
# that this would also work with a public IP too, and the virtual hosts on your
# machine would be accessible to anyone on the internets.
#WILDCARD_ZONE="my.wildcard.host.address"
# A feature to specify a custom log location within your site's document root
# was requested, and so you will be prompted about this when you create a new
# virtual host. If you do not want to be prompted, set the following to "no":
PROMPT_FOR_LOGS="no"
# If you do not want to be prompted, but you do always want to have the site-
# specific logs folder, set PROMPT_FOR_LOGS="no" and enable this:
ALWAYS_CREATE_LOGS="yes"
# By default, log files will be created in DOCUMENT_ROOT/logs. If you wish to
# override this to a static location, you can do so here.
#LOG_FOLDER="/var/log/httpd"
# If you have an atypical setup, and you don't need or want entries in your
# /etc/hosts file, you can set the following option to "yes".
SKIP_ETC_HOSTS="no"
# If you are running this script on a platform other than Mac OS X, your home
# partition is going to be different. If so, change it here.
HOME_PARTITION="/Users"
# If your environment has a different default DocumentRoot, and you don't want
# to be nagged about "fixing" your DocumentRoot, set this to "yes".
SKIP_DOCUMENT_ROOT_CHECK="no"
# If Apache works on a different port than the default 80, set it here
APACHE_PORT="80"
# Batch mode (all prompting will assume Yes). Any value will activate this. Can
# be set here, in ~/.virtualhost.sh.conf, or on the command line, like:
# BATCH_MODE=yes virtualhost.sh mysite
#BATCH_MODE="yes"
# If you're satisfied with the version you have and do not wish to be reminded
# of a new version, add the following line to your ~/.virtualhost.sh.conf file.
#SKIP_VERSION_CHECK="yes"
# We now will search your $DOC_ROOT_PREFIX for a matching subfolder using find.
# By default, we will go two levels deep so that it doesn't take too long. If
# you have a really complex structure, you may need to increase this.
MAX_SEARCH_DEPTH=2
# Set to "yes" if you don't have a browser (headless) or don't want the site
# to be launched in your browser after the virtualhost is setup.
#SKIP_BROWSER="yes"
# You can now store your configuration directions in a ~/.virtualhost.sh.conf
# file so that you can download new versions of the script without having to
# redo your own settings.
if [ -e ~/.virtualhost.sh.conf ]; then
. ~/.virtualhost.sh.conf
fi
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
host_exists()
{
if grep -q -e "^$IP_ADDRESS $1$" /etc/hosts ; then
return 0
else
return 1
fi
}
open_command()
{
if [ ! -z "$BROWSER" ]; then
$OPEN_COMMAND -a "$BROWSER" "$@"
else
$OPEN_COMMAND "$@"
fi
}
create_virtualhost()
{
if [ ! -z $WILDCARD_ZONE ]; then
SERVER_ALIAS="ServerAlias $1.$WILDCARD_ZONE"
else
SERVER_ALIAS="#ServerAlias your.alias.here"
fi
date=`/bin/date`
if [ -z $3 ]; then
log="#"
else
log=""
if [ ! -z $LOG_FOLDER ]; then
log_folder_path=$LOG_FOLDER
access_log="${log_folder_path}/access_log-$1"
error_log="${log_folder_path}/error_log-$1"
else
log_folder_path=$FOLDER/logs
access_log="${log_folder_path}/access_log"
error_log="${log_folder_path}/error_log"
fi
if [ ! -d "${log_folder_path}" ]; then
mkdir -p "${log_folder_path}"
chown $USER "${log_folder_path}"
fi
touch $access_log $error_log
chown $USER $access_log $error_log
fi
cat << __EOF >$APACHE_CONFIG/virtualhosts/$1
# Created $date
<VirtualHost *:$APACHE_PORT>
DocumentRoot "$2/htdocs"
ServerName $1
$SERVER_ALIAS
ScriptAlias /cgi-bin "$2/cgi-bin"
<Directory "$2">
Options All
AllowOverride All
Order allow,deny
Allow from all
</Directory>
${log}CustomLog "${access_log}" combined
${log}ErrorLog "${error_log}"
</VirtualHost>
__EOF
}
cleanup()
{
/bin/echo
/bin/echo "Cleaning up..."
exit
}
# Based on FreeBSD's /etc/rc.subr
checkyesno()
{
case $1 in
# "yes", "true", "on", or "1"
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|[Yy]|1)
return 0
;;
# "no", "false", "off", or "0"
[Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|[Nn]|0)
return 1
;;
*)
return 1
;;
esac
}
version_check()
{
/bin/echo -n "Checking for updates... "
current_version=`dig +tries=1 +time=1 +retry=0 txt virtualhost.patrickgibson.com | grep -e '^virtualhost' | awk '{print $5}' | sed -e 's/"//g'`
# See if we have the latest version
if [ -n "$current_version" ]; then
testes=`/bin/echo "$version < $current_version" | /usr/bin/bc`
if [ $testes -eq 1 ]; then
/bin/echo "done"
if [ -z $BATCH_MODE ]; then
/bin/echo "A newer version ($current_version) of virtualhost.sh is available."
/bin/echo -n "Do you want to get it now? [Y/n] "
read resp
else
/bin/echo "A newer version ($current_version) of virtualhost.sh is available."
/bin/echo "Visit https://github.com/pgib/virtualhost.sh to go get it."
resp="n"
fi
case $resp in
y*|Y*)
open_command "https://github.com/pgib/virtualhost.sh"
exit
;;
*)
/bin/echo "Okay. At your convenience, visit: https://github.com/pgib/virtualhost.sh"
/bin/echo
;;
esac
else
/bin/echo "none found"
fi
else
/bin/echo "failed. Are you online?"
fi
}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Make sure this is an Apache 2.x / Leopard machine
if [ ! -d $APACHE_CONFIG ]; then
/bin/echo "Could not find ${APACHE_CONFIG}"
/bin/echo "Sorry, this version of virtualhost.sh only works with Leopard. You can download an older version which works with previous versions of Mac OS X here:"
/bin/echo
/bin/echo "http://patrickgibson.com/news/andsuch/virtualhost.tgz"
/bin/echo
exit 1
fi
# if [ -z $SKIP_VERSION_CHECK ]; then
# version_check
# fi
# catch Ctrl-C
#trap 'cleanup' 2
# restore it
#trap '' 2
if [ -z $USER -o $USER = "root" ]; then
if [ ! -z $SUDO_USER ]; then
USER=$SUDO_USER
else
USER=""
/bin/echo "ALERT! Your root shell did not provide your username."
while : ; do
if [ -z $USER ]; then
while : ; do
/bin/echo -n "Please enter *your* username: "
read USER
if [ -d $HOME_PARTITION/$USER ]; then
break
else
/bin/echo "$USER is not a valid username."
fi
done
else
break
fi
done
fi
fi
if [ -z $DOC_ROOT_PREFIX ]; then
DOC_ROOT_PREFIX="${HOME_PARTITION}/$USER/Sites"
fi
usage()
{
cat << __EOT
Usage: sudo virtualhost.sh <name>
sudo virtualhost.sh --list
sudo virtualhost.sh --delete <name>
where <name> is the one-word name you'd like to use. (e.g. mysite)
Note that if "virtualhost.sh" is not in your PATH, you will have to write
out the full path to it: eg. /Users/$USER/Desktop/virtualhost.sh <name>
__EOT
exit 1
}
if [ -z $1 ]; then
usage
else
if [ "$1" = "--delete" ]; then
if [ -z $2 ]; then
usage
else
VIRTUALHOST=$2
DELETE=0
fi
elif [ "$1" = "--list" ]; then
if [ -d $APACHE_CONFIG/virtualhosts ]; then
echo "Listing virtualhosts found in $APACHE_CONFIG/virtualhosts"
echo
for i in $APACHE_CONFIG/virtualhosts/*; do
server_name=`grep ServerName $i | awk '{print $2}'`
doc_root=`grep DocumentRoot $i | awk '{print $2}' | sed -e 's/"//g'`
echo "http://${server_name}/ -> ${doc_root}"
done
else
echo "No virtualhosts have been setup yet."
fi
exit
else
VIRTUALHOST=$1
fi
fi
# Test that the virtualhost name is valid (starts with a number or letter)
if ! /bin/echo $VIRTUALHOST | grep -q -E '^[A-Za-z0-9]+' ; then
/bin/echo "Sorry, '$VIRTUALHOST' is not a valid host name to use. It must start with a letter or number."
exit 1
fi
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Delete the virtualhost if that's the requested action
#
if [ ! -z $DELETE ]; then
/bin/echo -n "- Deleting virtualhost, $VIRTUALHOST... Continue? [Y/n]: "
if [ -z "$BATCH_MODE" ]; then
read continue
else
continue="Y"
/bin/echo $continue
fi
case $continue in
n*|N*) exit
esac
if ! checkyesno ${SKIP_ETC_HOSTS}; then
/bin/echo -n " - Removing $VIRTUALHOST from /etc/hosts... "
cat /etc/hosts | grep -v $VIRTUALHOST > /tmp/hosts.tmp
if [ -s /tmp/hosts.tmp ]; then
mv /tmp/hosts.tmp /etc/hosts
fi
/bin/echo "done"
fi
if [ -e $APACHE_CONFIG/virtualhosts/$VIRTUALHOST ]; then
DOCUMENT_ROOT=`grep DocumentRoot $APACHE_CONFIG/virtualhosts/$VIRTUALHOST | awk '{print $2}' | tr -d '"'`
DOCUMENT_ROOT=${DOCUMENT_ROOT%/*}
if [ -d $DOCUMENT_ROOT ]; then
/bin/echo -n " + Found DocumentRoot $DOCUMENT_ROOT. Delete this folder? [y/N]: "
if [ -z $BATCH_MODE ]; then
read resp
else
resp="n"
echo $resp
fi
case $resp in
y*|Y*)
/bin/echo -n " - Deleting folder... "
if rm -rf "${DOCUMENT_ROOT}" ; then
/bin/echo "done"
else
/bin/echo "Could not delete $DOCUMENT_ROOT"
fi
;;
esac
fi
LOG_FILES=`grep "CustomLog\|ErrorLog" $APACHE_CONFIG/virtualhosts/$VIRTUALHOST | awk '{print $2}' | tr -d '"'`
if [ ! -z "$LOG_FILES" ]; then
/bin/echo -n " + Delete logs? [y/N]: "
if [ -z BATCH_MODE ]; then
read resp
else
resp="n"
echo $resp
fi
case $resp in
y*|Y*)
/bin/echo -n " - Deleting logs... "
if rm -f ${LOG_FILES} ; then
/bin/echo "done"
else
/bin/echo "Could not delete $LOG_FILES"
fi
;;
esac
fi
/bin/echo -n " - Deleting virtualhost file, $APACHE_CONFIG/virtualhosts/$VIRTUALHOST... "
rm $APACHE_CONFIG/virtualhosts/$VIRTUALHOST
/bin/echo "done"
/bin/echo -n "+ Restarting Apache... "
$APACHECTL graceful 1>/dev/null 2>/dev/null
/bin/echo "done"
else
/bin/echo "- Virtualhost $VIRTUALHOST does not currently exist. Aborting..."
exit 1
fi
exit
fi
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Make sure $APACHE_CONFIG/httpd.conf is ready for virtual hosting...
#
# If it's not, we will:
#
# a) Backup the original to $APACHE_CONFIG/httpd.conf.original
# b) Add a NameVirtualHost 127.0.0.1 line
# c) Create $APACHE_CONFIG/virtualhosts/ (virtualhost definition files reside here)
# d) Add a line to include all files in $APACHE_CONFIG/virtualhosts/
# e) Create a _localhost file for the default "localhost" virtualhost
#
if ! checkyesno ${SKIP_DOCUMENT_ROOT_CHECK} ; then
if ! grep -q -e "^DocumentRoot \"$DOC_ROOT_PREFIX\"" $APACHE_CONFIG/httpd.conf ; then
/bin/echo "httpd.conf's DocumentRoot does not point where it should."
/bin/echo -n "Do you with to set it to $DOC_ROOT_PREFIX? [Y/n]: "
if [ -z $BATCH_MODE ]; then
read response
else
response="n"
fi
case $response in
n*|N*)
/bin/echo "Okay, just re-run this script if you change your mind."
;;
*)
cat << __EOT | ed $APACHE_CONFIG/httpd.conf 1>/dev/null 2>/dev/null
/^DocumentRoot
i
#
.
j
+
i
DocumentRoot "$DOC_ROOT_PREFIX"
.
w
q
__EOT
;;
esac
fi
fi
if ! grep -q -E "^NameVirtualHost \*:$APACHE_PORT" $APACHE_CONFIG/httpd.conf ; then
/bin/echo "httpd.conf not ready for virtual hosting. Fixing..."
cp $APACHE_CONFIG/httpd.conf $APACHE_CONFIG/httpd.conf.original
/bin/echo "NameVirtualHost *:$APACHE_PORT" >> $APACHE_CONFIG/httpd.conf
if [ ! -d $APACHE_CONFIG/virtualhosts ]; then
mkdir $APACHE_CONFIG/virtualhosts
create_virtualhost localhost $DOC_ROOT_PREFIX
fi
/bin/echo "Include $APACHE_CONFIG/virtualhosts" >> $APACHE_CONFIG/httpd.conf
fi
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Look for hosts created in Tiger
#
if [ -d /etc/httpd/virtualhosts ]; then
/bin/echo -n "Do you want to port the hosts you previously created in Tiger to the new system? [Y/n]: "
read PORT_HOSTS
case $PORT_HOSTS in
n*|N*)
/bin/echo "Okay, just re-run this script if you change your mind."
;;
*)
for host in `ls -1 /etc/httpd/virtualhosts | grep -v _localhost`; do
/bin/echo -n " + Creating $host... "
if ! checkyesno ${SKIP_ETC_HOSTS}; then
if ! host_exists $host ; then
/bin/echo "$IP_ADDRESS $host" >> /etc/hosts
fi
fi
docroot=`grep DocumentRoot /etc/httpd/virtualhosts/$host | awk '{print $2}'`
create_virtualhost $host $docroot
/bin/echo "done"
done
mv /etc/httpd/virtualhosts /etc/httpd/virtualhosts-ported
;;
esac
fi
if [ -z $WILDCARD_ZONE ]; then
/bin/echo -n "Create http://${VIRTUALHOST}:${APACHE_PORT}/? [Y/n]: "
else
/bin/echo -n "Create http://${VIRTUALHOST}.${WILDCARD_ZONE}:${APACHE_PORT}/? [Y/n]: "
fi
if [ -z "$BATCH_MODE" ]; then
read continue
else
continue="Y"
/bin/echo $continue
fi
case $continue in
n*|N*) exit
esac
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# If the host is not already defined in /etc/hosts, define it...
#
if ! checkyesno ${SKIP_ETC_HOSTS}; then
if ! host_exists $VIRTUALHOST ; then
/bin/echo "Creating a virtualhost for $VIRTUALHOST..."
/bin/echo -n "+ Adding $VIRTUALHOST to /etc/hosts... "
/bin/echo "$IP_ADDRESS $1" >> /etc/hosts
/bin/echo "done"
fi
fi
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Ask the user where they would like to put the files for this virtual host
#
/bin/echo "+ Looking in $DOC_ROOT_PREFIX for an existing document root to use..."
# See if we can find an appropriate folder
if ls -1 $DOC_ROOT_PREFIX | grep -q -e "^$VIRTUALHOST"; then
DOC_ROOT_FOLDER_MATCH=`ls -1 $DOC_ROOT_PREFIX | grep -e ^$VIRTUALHOST | head -n 1`
DOC_ROOT_FOLDER_MATCH="${DOC_ROOT_PREFIX}/${DOC_ROOT_FOLDER_MATCH}"
else
if [ -d $DOC_ROOT_PREFIX/$VIRTUALHOST ]; then
DOC_ROOT_FOLDER_MATCH="$DOC_ROOT_PREFIX/$VIRTUALHOST"
else
if [ $MAX_SEARCH_DEPTH -eq 0 ]; then
/bin/echo -n " searching with no a maximum depth. This could take a really long time..."
else
/bin/echo -n " searching to a maximum directory depth of $MAX_SEARCH_DEPTH. This could take some time..."
fi
nested_match=`find $DOC_ROOT_PREFIX -maxdepth $MAX_SEARCH_DEPTH -type d -name $VIRTUALHOST 2>/dev/null`
if [ -n "$nested_match" ]; then
if [ -d $nested_match ]; then
DOC_ROOT_FOLDER_MATCH=$nested_match
fi
else
DOC_ROOT_FOLDER_MATCH="$DOC_ROOT_PREFIX/$VIRTUALHOST"
fi
fi
fi
/bin/echo -n " - Use $DOC_ROOT_FOLDER_MATCH as the virtualhost folder? [Y/n] "
if [ -z "$BATCH_MODE" ]; then
read resp
else
resp="Y"
echo $resp
fi
case $resp in
n*|N*)
while : ; do
if [ -z "$FOLDER" ]; then
/bin/echo -n " - Enter new folder name (located in $DOC_ROOT_PREFIX): "
read FOLDER
else
break
fi
done
;;
*)
if [ -d $DOC_ROOT_FOLDER_MATCH/public ]; then
/bin/echo -n " - Found a public folder suggesting a Rails/Merb/Rack project. Use as DocumentRoot? [y/N] "
if [ -z "$BATCH_MODE" ]; then
read response
else
response="n"
fi
if checkyesno ${response} ; then
FOLDER=$DOC_ROOT_FOLDER_MATCH/public
else
FOLDER=$DOC_ROOT_FOLDER_MATCH
fi
elif [ -d $DOC_ROOT_FOLDER_MATCH/web ]; then
/bin/echo -n " - Found a web folder suggesting a Symfony project. Use as DocumentRoot? [y/N] "
if [ -z "$BATCH_MODE" ]; then
read response
else
response="n"
fi
if checkyesno ${response} ; then
FOLDER=$DOC_ROOT_FOLDER_MATCH/web
else
FOLDER=$DOC_ROOT_FOLDER_MATCH
fi
else
FOLDER=$DOC_ROOT_FOLDER_MATCH
fi
;;
esac
# Create the folder if we need to...
if [ ! -d "${FOLDER}" ]; then
/bin/echo -n " + Creating folder ${FOLDER}... "
#su $USER -c "mkdir -p $FOLDER"
su $USER -c "mkdir -p $FOLDER/htdocs"
/bin/echo "done"
fi
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# See if a custom log should be used (requested by david.kerns, Issue #7)
#
if checkyesno ${PROMPT_FOR_LOGS}; then
/bin/echo -n " - Enable custom server access and error logs in $VIRTUALHOST/logs? [y/N] "
if [ -z "$BATCH_MODE" ]; then
read resp
else
resp="Y"
fi
case $resp in
y*|Y*)
log="1"
;;
*)
log=""
;;
esac
elif checkyesno ${ALWAYS_CREATE_LOGS}; then
log="1"
fi
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Create a default index.html if there isn't already one there
#
if [ ! -e "${FOLDER}/htdocs/index.html" -a ! -e "${FOLDER}/htdocs/index.php" ]; then
cat << __EOF >"${FOLDER}/htdocs/index.html"
<html>
<head>
<title>Welcome to $VIRTUALHOST</title>
<style type="text/css">
body, div, td { font-family: "Lucida Grande"; font-size: 12px; color: #666666; }
b { color: #333333; }
.indent { margin-left: 10px; }
</style>
</head>
<body link="#993300" vlink="#771100" alink="#ff6600">
<table border="0" width="100%" height="95%"><tr><td align="center" valign="middle">
<div style="width: 500px; background-color: #eeeeee; border: 1px dotted #cccccc; padding: 20px; padding-top: 15px;">
<div align="center" style="font-size: 14px; font-weight: bold;">
Congratulations!
</div>
<div align="left">
<p>If you are reading this in your web browser, then the only logical conclusion is that the <b><a href="http://$VIRTUALHOST:$APACHE_PORT/">http://$VIRTUALHOST:$APACHE_PORT/</a></b> virtualhost was setup correctly. :)</p>
<p>You can find the configuration file for this virtual host in:<br>
<table class="indent" border="0" cellspacing="3">
<tr>
<td><img src="/icons/script.gif" width="20" height="22" border="0"></td>
<td><b>$APACHE_CONFIG/virtualhosts/$VIRTUALHOST</b></td>
</tr>
</table>
</p>
<p>You will need to place all of your website files in:<br>
<table class="indent" border="0" cellspacing="3">
<tr>
<td><img src="/icons/dir.gif" width="20" height="22" border="0"></td>
<td><b><a href="file://$FOLDER">$FOLDER</b></a></td>
</tr>
</table>
</p>
<p>For the latest version of this script, tips, comments, <span style="font-size: 10px; color: #999999;">donations,</span> etc. visit:<br>
<table class="indent" border="0" cellspacing="3">
<tr>
<td><img src="/icons/forward.gif" width="20" height="22" border="0"></td>
<td><b><a href="http://patrickg.com/virtualhost">http://patrickg.com/virtualhost</a></b></td>
</tr>
</table>
</p>
</div>
</div>
</td></tr></table>
</body>
</html>
__EOF
chown $USER "${FOLDER}/htdocs/index.html"
fi
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Create a default virtualhost file
#
/bin/echo -n "+ Creating virtualhost file... "
create_virtualhost $VIRTUALHOST "${FOLDER}" $log
/bin/echo "done"
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Restart apache for the changes to take effect
#
if [ -x /usr/bin/dscacheutil ]; then
/bin/echo -n "+ Flushing cache... "
dscacheutil -flushcache
/bin/echo "done"
dscacheutil -q host | grep -q $VIRTUALHOST
sleep 1
fi
/bin/echo -n "+ Restarting Apache... "
$APACHECTL graceful 1>/dev/null 2>/dev/null
/bin/echo "done"
cat << __EOF
http://$VIRTUALHOST:$APACHE_PORT/ is setup and ready for use.
__EOF
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Launch the new URL in the browser
#
# if [ -z $SKIP_BROWSER ]; then
# /bin/echo -n "Launching virtualhost... "
# sleep 1
# curl --silent http://$VIRTUALHOST:$APACHE_PORT/ 2>&1 >/dev/null
# open_command "http://$VIRTUALHOST:$APACHE_PORT/"
# /bin/echo "done"
# fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment