Apache user from php

Support/Development for PHP
hostingguy
Forum Regular
Forum Regular
Posts: 661
Joined: Mon Oct 29, 2007 6:51 pm

Apache user from php

Unread post by hostingguy »

Hello,

I have a fairly simple script I wrote to fix the ownership on apache files to the real web (ftp) user so that they can manage the files perhaps it could be helpful to some one else.

So far as I know it works good, but has one fatal flaw - if the file name has a space in it then the chown command will fail - I'm not sure how to do that nicely and suggestions would be appreciated.

Code: Select all

#!/bin/sh

## Version 1.0
#   By Amin Taheri
#   01/26/2009
#
#  This is a script used to fix ownership of files that are incorrectly owned by the web user
#  from applications such as Joomla where the web site writes files to the disk
#
#	$FIXALL is a basic blind fix - it will just re-chown everything except for plesk-stat when
#	set to 1 (on).  When set to 0 (off) it will do a search for files owned by the web user
#	and only change those files - may be safer to do this way until you fully trust the script
#
#	$DRYRUN is basically test mode - it will just output what it will do instead of actually 
#	doing it - no changes are made in this regardless of what fixall is set to
#
#	$PSACONF is the path to your psa.conf file
#	
#	$WEBUSER is set to "apache"  - the user the web server runs as - if yours is different 
#	make sure to change that value or this script will not do anything
#
##


#Blindly fix everything? 
FIXALL="0"   # 1 = yes | 0 = No - Set Default value

#Detect problems only, dont actually do anything - basically run in test mode
DRYRUN="1"   # 1 = yes | 0 = No - Set Default value

#Path to psa.conf
PSACONF=/etc/psa/psa.conf

#Web User
WEBUSER='apache'

#Temp file to use -- it wil be deleted at the end of the script anyways
TMPFILE=/tmp/apache-user-fix-`date +%m-%d-%y`

#------------- Dont edit beyond this

#Group for Web files - this shouldnt change
GROUP='psacln'

#Determine the Vhost Root
VHOSTROOT=`grep HTTPD_VHOSTS_D $PSACONF | awk '{print $2}'`


#Get List of domains
DOMAINS=$(mysql -Ns -uadmin -p`cat /etc/psa/.psa.shadow` -Dpsa -e"select name from domains where htype='vrt_hst' ")
clear

function CheckDomain
{

	domain=$1
	echo -ne "Processing $domain: "
	
	SUBDOMAINECHO="1"

	#Get FTP user for the domain
	USER=$(mysql -Ns -uadmin -p`cat /etc/psa/.psa.shadow` -Dpsa -e"select u.login from sys_users u, domains d, hosting h where h.sys_user_id = u.id and h.dom_id = d.id and d.name = '$domain'")

	#Blindly change owner on everything?
	if [ "$FIXALL" == "1" ]; then
		
		if [ "$DRYRUN" == "1" ]; then
			echo -ne "\tDry Run: Would run:"
			echo
			echo -e "\tchown -R $USER:$GROUP `ls $VHOSTROOT/$domain/httpdocs | grep -v plesk-stat`"
		else
			echo -ne " - Fixed"
			chown -R $USER:$GROUP `ls $VHOSTROOT/$domain/httpdocs | grep -v plesk-stat`
		fi
		
	else
		find $VHOSTROOT/$domain/httpdocs -user $WEBUSER > $TMPFILE

		#if the domain has files in the temp list then fix those
		if [ `grep -c $domain $TMPFILE` -gt 0 ]; then
		
			if [ "$DRYRUN" == "1" ]; then
			echo -ne "\tDry Run: Would run:"
			echo
				for file in `grep $domain $TMPFILE`; do
					echo -e "\tchown -R $USER:$GROUP \"$file\""
				done
			else
			echo -ne " - Fixed"
				for file in `grep $domain $TMPFILE`; do
					chown -R $USER:$GROUP "$file"
				done
			fi
		
		else
			echo -ne " - Skipped"
		fi
	fi
	echo

	#Get list of sub domains for a given domain name
	SUBDOMAINS=$(mysql -Ns -uadmin -p`cat /etc/psa/.psa.shadow` -Dpsa -e"select s.name from subdomains s, domains d where d.id = s.dom_id and d.name='$domain'")
	
	for subdomain in $SUBDOMAINS; do
		if [ "$SUBDOMAINECHO" == "1" ]; then
			echo -e "\tProcesing sub domains of $domain"
		fi
		
		SUBDOMAINECHO="0"
		
		echo -ne "\t - $subdomain.$domain"

		USER=`ls -la $VHOSTROOT/$domain/subdomains/$subdomain/httpdocs | awk '{print $3}'`

		if [ "$FIXALL" == "1" ]; then
		
			if [ "$DRYRUN" == "1" ]; then
				echo -e "\t\tDry Run: Would run:"
				echo -e "\t\tchown -R $USER:$GROUP `ls $VHOSTROOT/$domain/subdomains/$subdomain/httpdocs | grep -v plesk-stat`"
			else
				echo -e "\t\t - Fixed"
				chown -R $USER:$GROUP `ls $VHOSTROOT/$domain/subdomains/$subdomain/httpdocs | grep -v plesk-stat`
			fi
		
		else
		
			find $VHOSTROOT/$domain/subdomains/$subdomain/httpdocs -user $WEBUSER > $TMPFILE
			
			if [ `grep -c '$domain/subdomains/$subdomain' $TMPFILE` -gt 0 ]; then
			
				if [ "$DRYRUN" == "1" ]; then
					echo -e "\t\tDry Run: Would run:"
					for file in `grep '$domain/subdomains/$subdomain' $TMPFILE`; do
						echo -e "\t\tchown -R $USER:$GROUP \"$file\""
					done
				else
					echo -e " - Fixed"
					for file in `grep "$domain/subdomains/$subdomain" $TMPFILE`; do
						chown -R $USER:$GROUP \"$file\"
					done
				fi
			
			else
				echo -e " - Skipped"
			fi
		fi
		
	#Done with Sub Domains
	done



}

#Do Domains
for domain in $DOMAINS; do
	CheckDomain $domain
#Done with Domains
done

#Remove the temp file
rm -Rf $TMPFILE




Post Reply