Skip to content
İrfan Özer edited this page Dec 30, 2018 · 1 revision

#!/bin/bash

Set Language

TEXTDOMAIN=virtualhost

Set default parameters

action=$1 domain=$2 rootDir=$3 owner=$(who am i | awk '{print $1}') apacheUser=$(ps -ef | egrep '(httpd|apache2|apache)' | grep -v root | head -n1 | awk '{print $1}') email='webmaster@localhost' sitesEnabled='/etc/apache2/sites-enabled/' sitesAvailable='/etc/apache2/sites-available/' userDir='/var/www/' sitesAvailabledomain=$sitesAvailable$domain.conf

don't modify from here unless you know what you are doing

if [ "$(whoami)" != 'root' ]; then echo $"You have no permission to run $0 as non-root user. Use sudo" exit 1; fi

if [ "$action" != 'create' ] && [ "$action" != 'delete' ] then echo $"You need to prompt for action (create or delete) -- Lower-case only" exit 1; fi

while [ "$domain" == "" ] do echo -e $"Please provide domain. e.g.dev,staging" read domain done

if [ "$rootDir" == "" ]; then rootDir=${domain//./} fi

if root dir starts with '/', don't use /var/www as default starting point

if "$rootDir" =~ ^/; then userDir='' fi

rootDir=$userDir$rootDir

if [ "$action" == 'create' ] then ### check if domain already exists if [ -e $sitesAvailabledomain ]; then echo -e $"This domain already exists.\nPlease Try Another one" exit; fi

	### check if directory exists or not
	if ! [ -d $rootDir ]; then
		### create the directory
		mkdir $rootDir
		### give permission to root dir
		chmod 755 $rootDir
		### write test file in the new domain dir
		if ! echo "<?php echo phpinfo(); ?>" > $rootDir/phpinfo.php
		then
			echo $"ERROR: Not able to write in file $rootDir/phpinfo.php. Please check permissions"
			exit;
		else
			echo $"Added content to $rootDir/phpinfo.php"
		fi
	fi

	### create virtual host rules file
	if ! echo "
	<VirtualHost *:80>
		ServerAdmin $email
		ServerName $domain
		ServerAlias $domain
		DocumentRoot $rootDir
		<Directory />
			AllowOverride All
		</Directory>
		<Directory $rootDir>
			Options Indexes FollowSymLinks MultiViews
			AllowOverride all
			Require all granted
		</Directory>
		ErrorLog /var/log/apache2/$domain-error.log
		LogLevel error
		CustomLog /var/log/apache2/$domain-access.log combined
	</VirtualHost>" > $sitesAvailabledomain
	then
		echo -e $"There is an ERROR creating $domain file"
		exit;
	else
		echo -e $"\nNew Virtual Host Created\n"
	fi

	### Add domain in /etc/hosts
	if ! echo "127.0.0.1	$domain" >> /etc/hosts
	then
		echo $"ERROR: Not able to write in /etc/hosts"
		exit;
	else
		echo -e $"Host added to /etc/hosts file \n"
	fi

	### Add domain in /mnt/c/Windows/System32/drivers/etc/hosts (Windows Subsytem for Linux)
	if [ -e /mnt/c/Windows/System32/drivers/etc/hosts ]
	then
		if ! echo -e "\r127.0.0.1       $domain" >> /mnt/c/Windows/System32/drivers/etc/hosts
		then
			echo $"ERROR: Not able to write in /mnt/c/Windows/System32/drivers/etc/hosts (Hint: Try running Bash as administrator)"
		else
			echo -e $"Host added to /mnt/c/Windows/System32/drivers/etc/hosts file \n"
		fi
	fi

	if [ "$owner" == "" ]; then
		iam=$(whoami)
		if [ "$iam" == "root" ]; then
			chown -R $apacheUser:$apacheUser $rootDir
		else
			chown -R $iam:$iam $rootDir
		fi
	else
		chown -R $owner:$owner $rootDir
	fi

	### enable website
	a2ensite $domain

	### restart Apache
	/etc/init.d/apache2 reload

	### show the finished message
	echo -e $"Complete! \nYou now have a new Virtual Host \nYour new host is: http://$domain \nAnd its located at $rootDir"
	exit;
else
	### check whether domain already exists
	if ! [ -e $sitesAvailabledomain ]; then
		echo -e $"This domain does not exist.\nPlease try another one"
		exit;
	else
		### Delete domain in /etc/hosts
		newhost=${domain//./\\.}
		sed -i "/$newhost/d" /etc/hosts

		### Delete domain in /mnt/c/Windows/System32/drivers/etc/hosts (Windows Subsytem for Linux)
		if [ -e /mnt/c/Windows/System32/drivers/etc/hosts ]
		then
			newhost=${domain//./\\.}
			sed -i "/$newhost/d" /mnt/c/Windows/System32/drivers/etc/hosts
		fi

		### disable website
		a2dissite $domain

		### restart Apache
		/etc/init.d/apache2 reload

		### Delete virtual host rules files
		rm $sitesAvailabledomain
	fi

	### check if directory exists or not
	if [ -d $rootDir ]; then
		echo -e $"Delete host root directory ? (y/n)"
		read deldir

		if [ "$deldir" == 'y' -o "$deldir" == 'Y' ]; then
			### Delete the directory
			rm -rf $rootDir
			echo -e $"Directory deleted"
		else
			echo -e $"Host directory conserved"
		fi
	else
		echo -e $"Host directory not found. Ignored"
	fi

	### show the finished message
	echo -e $"Complete!\nYou just removed Virtual Host $domain"
	exit 0;

fi