#!/usr/bin/env bash # Run this as sudo! # I move this file to /usr/local/bin/vhost and run command 'vhost' from anywhere, using sudo. # # Show Usage, Output to STDERR # function show_usage { cat <<- _EOF_ Create a new vHost in Ubuntu Server Assumes /etc/apache2/sites-available and /etc/apache2/sites-enabled setup used -d DocumentRoot - i.e. /var/www/yoursite -h Help - Show this menu. -s ServerName - i.e. example.com or sub.example.com -a ServerAlias - i.e. *.example.com or another domain altogether -p File path to the SSL certificate. Directories only, no file name. If using an SSL Certificate, also creates a port :443 vhost as well. This *ASSUMES* a .crt and a .key file exists at file path /provided-file-path/your-server-or-cert-name.[crt|key]. Otherwise you can except Apache errors when you reload Apache. Ensure Apache's mod_ssl is enabled via "sudo a2enmod ssl". -c Certificate filename. "xip.io" becomes "xip.io.key" and "xip.io.crt". Example Usage. Serve files from /var/www/xip.io at http(s)://192.168.33.10.xip.io using ssl files from /etc/ssl/xip.io/xip.io.[key|crt] sudo vhost -d /var/www/xip.io -s 192.168.33.10.xip.io -p /etc/ssl/xip.io -c xip.io _EOF_ exit 1 } # # Output vHost skeleton, fill with userinput # To be outputted into new file # function create_vhost { cat <<- _EOF_ <VirtualHost *:80> ServerAdmin webmaster@localhost ServerName $ServerName $ServerAlias DocumentRoot $DocumentRoot <Directory $DocumentRoot> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> ErrorLog \${APACHE_LOG_DIR}/$ServerName-error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog \${APACHE_LOG_DIR}/$ServerName-access.log combined </VirtualHost> _EOF_ } function create_ssl_vhost { cat <<- _EOF_ <VirtualHost *:443> ServerAdmin webmaster@localhost ServerName $ServerName $ServerAlias DocumentRoot $DocumentRoot <Directory $DocumentRoot> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> ErrorLog \${APACHE_LOG_DIR}/$ServerName-error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog \${APACHE_LOG_DIR}/$ServerName-access.log combined SSLEngine on SSLCertificateFile $CertPath/$CertName.crt SSLCertificateKeyFile $CertPath/$CertName.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> BrowserMatch "MSIE [2-6]" \\ nokeepalive ssl-unclean-shutdown \\ downgrade-1.0 force-response-1.0 # MSIE 7 and newer should be able to use keepalive BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> _EOF_ } #Sanity Check - are there two arguments with 2 values? if [ "$#" -lt 4 ]; then show_usage fi CertPath="" #Parse flags while getopts "d:s:a:p:c:h" OPTION; do case $OPTION in h) show_usage ;; d) DocumentRoot=$OPTARG ;; s) ServerName=$OPTARG ;; a) Alias=$OPTARG ;; p) CertPath=$OPTARG ;; c) CertName=$OPTARG ;; *) show_usage ;; esac done # If alias is set: if [ "$Alias" != "" ]; then ServerAlias="ServerAlias "$Alias else ServerAlias="" fi # If CertName doesn't get set, set it to ServerName if [ "$CertName" == "" ]; then CertName=$ServerName fi if [ ! -d $DocumentRoot ]; then mkdir -p $DocumentRoot #chown USER:USER $DocumentRoot #POSSIBLE IMPLEMENTATION, new flag -u ? fi if [ -f "$DocumentRoot/$ServerName.conf" ]; then echo 'vHost already exists. Aborting' show_usage else create_vhost > /etc/apache2/sites-available/${ServerName}.conf # Add :443 handling if [ "$CertPath" != "" ]; then create_ssl_vhost >> /etc/apache2/sites-available/${ServerName}.conf fi # Enable Site cd /etc/apache2/sites-available/ && a2ensite ${ServerName}.conf service apache2 reload fi