This commit is contained in:
tuend-work
2025-11-13 07:41:56 +07:00
parent 7f357f3a30
commit 4478491d73
1729 changed files with 193578 additions and 20 deletions

9
update/scripts/README Normal file
View File

@@ -0,0 +1,9 @@
DirectAdmin Scripts
To install DirectAdmin run ./install.sh
this will first do some checks to make sure that things are installed (named etc)
then it will ask some question and save the data to setup.txt
If you encounter errors and need to change some of the setup data, simply delete setup.txt and re-run setup.sh

View File

@@ -0,0 +1,99 @@
#!/bin/sh
#script to add an email account to DirectAdmin via command line.
MYUID=`/usr/bin/id -u`
if [ "$MYUID" != 0 ]; then
echo "You require Root Access to run this script";
exit 1;
fi
if [ "$#" -lt 4 ]; then
echo "Usage:";
echo " $0 <user> <domain> '<cryptedpass>' <plaintext> <quota>";
echo "";
echo "Where the cryptedpass can either be an MD5/DES password";
echo "If plaintext is set to 1, then it can be a raw password";
echo "Else, set plaintext to 0 to use the provided crypted pass."
echo "quota, in bytes. Use 0 for unlimited";
echo "";
echo "The domain must already exist under a DA account";
exit 2;
fi
EMAIL=$1
DOMAIN=$2
PASS=$3
PLAIN=$4
QUOTAVAL=$5
DAUSER=`grep "^${DOMAIN}:" /etc/virtual/domainowners | awk '{print $2;}'`
UHOME=`grep "^${DAUSER}:" /etc/passwd | cut -d: -f6`
DOMAINCONF=/usr/local/directadmin/data/users/${DAUSER}/domains/${DOMAIN}.conf
if [ ! -e ${DOMAINCONF} ]; then
echo "Cannot find ${DOMAINCONF}";
echo "Make sure the domain exists and is set in the /etc/virtual/domainowners file";
exit 3;
fi
PASSWD=/etc/virtual/${DOMAIN}/passwd
QUOTA=/etc/virtual/${DOMAIN}/quota
if [ ! -e ${PASSWD} ]; then
echo "Cannot find ${PASSWD}. Make sure the domain exists";
exit 4;
fi
DOVECOT=`/usr/local/directadmin/directadmin c | grep ^dovecot= | cut -d= -f2`
if [ "${DOVECOT}" != 0 ]; then
DOVECOT=1;
fi
COUNT=`grep -c "^${EMAIL}:" ${PASSWD}`
if [ "${COUNT}" = 0 ]; then
PASSVALUE=$PASS
if [ ${PLAIN} = 1 ]; then
#encode the password.
PASSVALUE=`echo "$PASS" | /usr/bin/openssl passwd -1 -stdin`
fi
if [ "${DOVECOT}" = 1 ]; then
UUID=`id -u ${DAUSER}`
MGID=`id -g mail`
if /usr/local/directadmin/directadmin c | grep -m1 -q '^add_userdb_quota=1$'; then
APPEND=":userdb_quota_rule=*:bytes=${QUOTAVAL}"
else
APPEND=""
fi
echo "${EMAIL}:${PASSVALUE}:${UUID}:${MGID}::${UHOME}/imap/${DOMAIN}/${EMAIL}:/bin/false${APPEND}" >> ${PASSWD}
else
echo "${EMAIL}:${PASSVALUE}" >> ${PASSWD}
fi
echo "Added ${EMAIL} to ${PASSWD}";
else
echo "${EMAIL} already exists in ${PASSWD}. Not adding it to passwd.";
fi
#quota
if [ -e ${QUOTA} ]; then
COUNT=`grep -c "^${EMAIL}:" ${QUOTA}`
if [ "${COUNT}" = 0 ]; then
echo "${EMAIL}:${QUOTAVAL}" >> ${QUOTA}
fi
else
echo "${EMAIL}:${QUOTAVAL}" > ${QUOTA}
fi
#ensure path exists for it.
if [ "${DOVECOT}" = 1 ]; then
USERDIR=${UHOME}/imap/${DOMAIN}/${EMAIL}
mkdir --mode=770 -p $USERDIR/Maildir/new
mkdir --mode=770 -p $USERDIR/Maildir/cur
chown -R ${DAUSER}:mail ${USERDIR}
chmod 770 ${USERDIR} ${USERDIR}/Maildir
fi
exit 0;

138
update/scripts/addip Normal file
View File

@@ -0,0 +1,138 @@
#!/bin/sh
#find the eth0:# and add the ip to the system
OS=`uname`
addIPv6()
{
MASK=/64
if echo $2 | grep -m1 -q '/'; then
MASK=$2
fi
if [ "${OS}" = "FreeBSD" ]; then
/sbin/ifconfig $ETH_DEV inet6 add ${1}${MASK}
else
/sbin/ip addr add ${1}${MASK} dev $ETH_DEV preferred_lft 0 >/dev/null 2>&1
if [ "$?" -ne 0 ]; then
/sbin/ifconfig $ETH_DEV inet6 add ${1}${MASK}
fi
fi
exit 0;
}
getBroadcast() {
IP1=`echo $1 | cut -d. -f1`;
IP2=`echo $1 | cut -d. -f2`;
IP3=`echo $1 | cut -d. -f3`;
IP4=`echo $1 | cut -d. -f4`;
NM1=`echo $2 | cut -d. -f1`;
NM2=`echo $2 | cut -d. -f2`;
NM3=`echo $2 | cut -d. -f3`;
NM4=`echo $2 | cut -d. -f4`;
BC1=$((($IP1 & $NM1) | (255 & ~$NM1)));
BC2=$((($IP2 & $NM2) | (255 & ~$NM2)));
BC3=$((($IP3 & $NM3) | (255 & ~$NM3)));
BC4=$((($IP4 & $NM4) | (255 & ~$NM4)));
BROADCAST="$BC1.$BC2.$BC3.$BC4";
}
ETH_DEV=eth0
if [ $# -lt 1 ]; then # we need the ip
echo "Usage: $0 <ip> (<netmask> (<eth dev> (<broadcast>)))";
echo "example: $0 1.2.3.4 255.255.255.0 eth0";
exit 1;
fi
IP_FILE=/usr/local/directadmin/data/admin/ips/$1
if [ -s ${IP_FILE} ]; then
C=`grep -c 'add_to_device=no' ${IP_FILE}`
if [ "${C}" -gt 0 ]; then
echo "IP $1 has add_to_device=no set. Skipping"
exit 0;
fi
fi
#check to make sure it isn't already running
IP_ALREADY_EXISTS=false
if [ "${OS}" = "FreeBSD" ]; then
if /sbin/ifconfig | grep -m1 -q " $1 "; then
IP_ALREADY_EXISTS=true
fi
else
if /sbin/ip a | grep -m1 -q " $1/"; then
IP_ALREADY_EXISTS=true
fi
fi
if ${IP_ALREADY_EXISTS}; then
echo "IP $1 already exists"
exit 1
fi
#echo "have device: $3";
if [ $# -gt "2" ]; then
ETH_DEV=$3;
fi
if echo $1 | grep -m1 -q ':'; then
addIPv6 $1 $2
fi
netmaskToPrefixIPv4(){
NM1=`echo ${NETMASK} | cut -d. -f1`;
NM2=`echo ${NETMASK} | cut -d. -f2`;
NM3=`echo ${NETMASK} | cut -d. -f3`;
NM4=`echo ${NETMASK} | cut -d. -f4`;
NM1BIN=`perl -e "printf \"%b\n\",${NM1}"`
NM2BIN=`perl -e "printf \"%b\n\",${NM2}"`
NM3BIN=`perl -e "printf \"%b\n\",${NM3}"`
NM4BIN=`perl -e "printf \"%b\n\",${NM4}"`
echo "${NM1BIN}${NM2BIN}${NM3BIN}${NM4BIN}" | grep -o '1' | wc -l
}
NETMASK=255.255.255.0
PREFIX="/24"
SET_BROADCAST=true
if [ $# -gt "1" ]; then
#echo "have netmask: $2";
NETMASK=$2
if ! echo "${NETMASK}" | grep -m1 -q '/'; then
PREFIX="/`netmaskToPrefixIPv4 ${NETMASK}`"
else
PREFIX="${NETMASK}"
SET_BROADCAST=false
fi
fi
if [ $# -gt "3" ]; then
BROADCAST=$4
elif ${SET_BROADCAST}; then
getBroadcast $1 $2
fi
if [ "${OS}" = "FreeBSD" ]; then
ifconfig $ETH_DEV inet $1 netmask $NETMASK broadcast $BROADCAST alias
else
/sbin/ip addr add ${1}${PREFIX} dev $ETH_DEV >/dev/null 2>&1
if [ "$?" -ne 0 ] && ${SET_BROADCAST}; then
DEVNUM=0
while [ `/sbin/ifconfig $ETH_DEV:$DEVNUM | grep -F -c inet` -gt "0" ]
do
{
DEVNUM=$(($DEVNUM+1));
}
done;
/sbin/ifconfig $ETH_DEV:$DEVNUM $1 netmask $NETMASK broadcast $BROADCAST
/sbin/route add -host $1 dev $ETH_DEV:$DEVNUM
fi
fi
exit 0

View File

@@ -0,0 +1,541 @@
#!/bin/sh
# This script is written by Martynas Bendorius and DirectAdmin
# It is used to process AWstats for a domain
# Official AWstats webpage: http://www.awstats.org
# Usage:
# ./awstats_process.sh <user> <domain>
VERSION=2.9
ADD_CGI=1
ADD_HTML=1
#set this to 1 if you need the script to reset the awstats link for each domain to root (when harden symlinks patch is enabled in apache)
#this should only need to be enabled once, and can be disabled after that one run.
ENSURE_ROOT_LINKS=0
#Set this to 1 if you have extra awstats.old folders you want to get rid of.
#DA will automatically clear them during the conversion, but this is here in case you had issues and need to try again.
CLEAR_AWSTATS_OLD=0
OS=`uname`
ROOTGRP=root
SU_BIN=/bin/su
if [ "$OS" = "FreeBSD" ]; then
ROOTGRP=wheel
SU_BIN=/usr/bin/su
fi
if [ "${ADD_CGI}" -eq 0 ] && [ "${ADD_HTML}" -eq 0 ]; then
echo "One of ADD_CGI and ADD_HTML must be set to 1";
exit 10;
fi
AUID=`/usr/bin/id -u`
if [ "$AUID" != 0 ]; then
echo "You require Root Access to run this script";
exit 1;
fi
if [ $# != 2 ] && [ $# != 3 ]; then
echo "$0 version $VERSION"
echo "Usage:";
echo "$0 <user> <domain> (<subdomain>)";
echo "you gave #$#: $0 $1 $2";
exit 2;
fi
#AWSTATS_MODE=1 hard link log files, readble by User
#AWSTATS_MODE=2 full copies of logs, readble by User
AWSTATS_MODE=`/usr/local/directadmin/directadmin c | grep '^awstats=' | cut -d= -f2`
if [ "${AWSTATS_MODE}" = "0" ] || [ "${AWSTATS_MODE}" = "" ] || [ "${AWSTATS_MODE}" -gt 2 ]; then
echo "awstats not enabled from:";
echo "/usr/local/directadmin/directadmin c | grep '^awstats='";
echo "awstats=${AWSTATS_MODE}";
exit 17
fi
id ${1} >/dev/null 2>&1
RET=$?
if [ "${RET}" -ne 0 ]; then
echo "User ${1} does not exist";
exit 3;
fi
SUB="";
if [ $# = 3 ]; then
SUB=$3
fi
USER=$1
DOMAIN=$2
UHOME=`grep -e "^${USER}:" /etc/passwd | head -n 1 | cut -d: -f6`
TOP_DOMAIN=$2
if [ "$UHOME" = "" ]; then
echo "Could not find a home path for user $USER in /etc/passwd";
exit 4;
fi
HTTPD=httpd
if [ "`/usr/local/directadmin/directadmin c | grep ^nginx= | cut -d= -f2`" -eq 1 ]; then
HTTPD=nginx
fi
if [ "`/usr/local/directadmin/directadmin c | grep ^nginx_proxy= | cut -d= -f2`" -eq 1 ]; then
HTTPD=nginx
fi
AWSTATS=/usr/local/awstats
MODEL=${AWSTATS}/wwwroot/cgi-bin/awstats.model.conf
STATS_DIR=${UHOME}/domains/${DOMAIN}/awstats
DATA=.data
DATA_DIR=${STATS_DIR}/${DATA}
LOGDIR=/var/log/${HTTPD}/domains
IS_CAGEFS=0
CAGEFSCTL=/usr/sbin/cagefsctl
if [ -x ${CAGEFSCTL} ]; then
C=`${CAGEFSCTL} --list-enabled | grep -c ${USER}`
if [ "${C}" -gt 0 ]; then
IS_CAGEFS=1
fi
fi
USER_LOGS=/var/log/user_logs
if [ ! -d ${USER_LOGS} ]; then
if [ -d /var/user_logs ]; then
echo "Moving /var/user_logs to ${USER_LOGS}"
mv /var/user_logs ${USER_LOGS}
else
mkdir ${USER_LOGS}
chmod 711 ${USER_LOGS}
echo "This folder is for temporary http log hard-links or copies, for awstats processing as the User.\nIt should usually be empty, less this file, unless awstats is running for a domain." > ${USER_LOGS}/.readme.txt
chmod 644 ${USER_LOGS}/.readme.txt
fi
fi
if [ "${SUB}" != "" ]; then
STATS_DIR=$STATS_DIR/${SUB}
DATA_DIR=${STATS_DIR}/${DATA}
CONFIG=${DATA_DIR}/awstats.${SUB}.${DOMAIN}.conf
LOG=${LOGDIR}/${DOMAIN}.${SUB}.log
READ_LOG=${USER_LOGS}/${USER}/${DOMAIN}.${SUB}.log
#we change the domain name at the last possible moment, after we're done with DOMAIN.
#all calls to DOMAIN from this point onwards will see sub.domain.com
DOMAIN=${SUB}.${DOMAIN}
else
CONFIG=${DATA_DIR}/awstats.${DOMAIN}.conf
LOG=${LOGDIR}/${DOMAIN}.log
READ_LOG=${USER_LOGS}/${USER}/${DOMAIN}.log
fi
if [ ! -e ${AWSTATS} ]; then
echo "${AWSTATS} does not exist!";
exit 5;
fi
#####################################################
# Script now runs core commands as the User.
# actions and conversions below.
run_as_user()
{
if [ "$OS" = "FreeBSD" ]; then
${SU_BIN} -l -m ${USER} -c "umask 022; $1"
else
${SU_BIN} -l -s /bin/sh -c "umask 022; $1" ${USER}
fi
return $?
}
get_dir_owner()
{
D=$1
if [ ! -d ${D} ]; then
echo "";
return;
fi
U=`ls -ld ${D} | awk '{print $3}'`
echo $U
}
#1 for false
#0 for true
should_convert_to_user()
{
if [ "`get_dir_owner $DATA_DIR`" != "root" ]; then
return 1;
fi
return 0;
}
ensure_awstats_in_cagefs()
{
if [ "${IS_CAGEFS}" != "1" ]; then
return;
fi
#Ensure awstats is in the skeleton.
DA_CFG=/etc/cagefs/conf.d/directadmin.cfg
C=`grep ^paths= ${DA_CFG} | grep -c /usr/local/awstats/`
if [ "${C}" = "0" ]; then
echo "Adding /usr/local/awstats/ to ${DA_CFG} paths";
perl -pi -e 's#^paths=#paths=/usr/local/awstats/, #' ${DA_CFG}
${CAGEFSCTL} --update
CHECK=`run_as_user "if [ -e /usr/local/awstats/tools/awstats_buildstaticpages.pl ]; then echo 0; else echo 1; fi"`
if [ "${CHECK}" != "0" ]; then
${CAGEFSCTL} --force-update
fi
fi
}
convert_awstast_to_user()
{
# As the User, copy awstats to awstats.user
# Ensure copy was successful. If not, abort everything.
# rename awstats to awstats.old, and awstats.user to awstats
STATS_DIR_USER=${STATS_DIR}.user
if [ -e ${STATS_DIR_USER} ]; then
echo "${STATS_DIR_USER} already exist. Removing it before we proceed."
run_as_user "/bin/rm -rf ${STATS_DIR_USER}"
fi
if [ "${IS_CAGEFS}" = "1" ]; then
#CloudLinux doesnt let Users copy links pointing to root files,
#so we'll remove those links first, since they're not important.
echo "Removing symbolic links..."
run_as_user "find ${STATS_DIR}/ -type l -delete"
echo "Done removing symbolic links."
fi
run_as_user "/bin/cp -RPp ${STATS_DIR} ${STATS_DIR_USER}"
diff -rq ${STATS_DIR} ${STATS_DIR_USER} > /dev/null
DIFF_RET=$?
if [ "${DIFF_RET}" != "0" ]; then
echo "awstats.user vs awstats folder do not match:";
diff -rq ${STATS_DIR} ${STATS_DIR_USER}
echo "";
echo "aborting conversion."
exit 14;
fi
echo "All checks passed. Swapping folders";
run_as_user "/bin/mv ${STATS_DIR} ${STATS_DIR}.old"
if [ ! -d ${STATS_DIR}.old ]; then
echo "Rename to ${STATS_DIR}.old must have failed. Cannot find that directory after move as User."
exit 16;
fi
#re-link root owned links.
run_as_user "rm -f ${STATS_DIR_USER}/icon"
run_as_user "rm -f ${STATS_DIR_USER}/lang"
run_as_user "rm -f ${STATS_DIR_USER}/lib"
run_as_user "rm -f ${STATS_DIR_USER}/plugins"
ln -s /usr/local/awstats/wwwroot/icon ${STATS_DIR_USER}/icon
ln -s /usr/local/awstats/wwwroot/cgi-bin/lang ${STATS_DIR_USER}/lang
ln -s /usr/local/awstats/wwwroot/cgi-bin/lib ${STATS_DIR_USER}/lib
ln -s /usr/local/awstats/wwwroot/cgi-bin/plugins ${STATS_DIR_USER}/plugins
run_as_user "/bin/mv ${STATS_DIR_USER} ${STATS_DIR}"
echo "action=delete&value=secure_disposal&user=${USER}&path=${STATS_DIR}.old" >> /usr/local/directadmin/data/task.queue
}
#####################################################
ensure_awstats_in_cagefs;
if [ ! -e ${STATS_DIR} ]; then
run_as_user "mkdir ${STATS_DIR}";
run_as_user "chmod 755 ${STATS_DIR}"
else
if [ -h ${STATS_DIR} ]; then
echo "${STATS_DIR} is a symbolic link. Aborting.";
exit 8;
fi
#directory does exist. Should we convert it?
if should_convert_to_user; then
echo "Converting contents of ${STATS_DIR} to the User ${USER}"
convert_awstast_to_user;
else
echo "Conversion not required. Continuing normally";
fi
fi
if [ ! -e ${DATA_DIR} ]; then
run_as_user "mkdir ${DATA_DIR}"
run_as_user "chmod 755 ${DATA_DIR}"
else
if [ -h ${DATA_DIR} ]; then
echo "${DATA_DIR} is a symbolic link. Aborting.";
exit 9;
fi
fi
#this bit is to fix the 700 that backups cannot see. (bug)
#http://www.directadmin.com/features.php?id=915
run_as_user "chmod 755 ${DATA_DIR}"
#do it every time. Users must not be able to edit the config directly.
#chown -R root:${ROOTGRP} ${DATA_DIR} #never do this again
if [ ! -s ${CONFIG} ]; then
if [ ! -s ${MODEL} ]; then
echo "${MODEL} does not exist or is empty.";
exit 6;
fi
run_as_user "cp -f ${MODEL} ${CONFIG}"
run_as_user "chmod 644 ${CONFIG}"
run_as_user "perl -pi -e 's#LogFile=\\\"/var/log/httpd/mylog.log\\\"#LogFile=\\\"${READ_LOG}\\\"#' ${CONFIG}"
run_as_user "perl -pi -e 's#SiteDomain=\\\"\\\"#SiteDomain=\"${DOMAIN}\"#' ${CONFIG}"
run_as_user "perl -pi -e 's#DirData=\\\".\\\"#DirData=\\\"${DATA_DIR}\\\"#' ${CONFIG}"
run_as_user "perl -pi -e 's#DirCgi=\\\"/cgi-bin\\\"#DirCgi=\\/awstats\\\"#' ${CONFIG}"
run_as_user "perl -pi -e 's#ValidHTTPCodes=\\\"200 304\\\"#ValidHTTPCodes=\\\"200 304 206\\\"#' ${CONFIG}"
#Oct 24, 2010
run_as_user "perl -pi -e 's#DirIcons=\\\"/icon\\\"#DirIcons=\\\"icon\\\"#' ${CONFIG}"
else
run_as_user "perl -pi -e 's#DirIcons=\\\"${STATS_DIR}\\\"#DirIcons=\\\"icon\\\"#' ${CONFIG}"
#run_as_user "perl -pi -e 's#^LogFile=\\\".*\\\"\$#LogFile=\\\"${READ_LOG}\\\"#' ${CONFIG}"
run_as_user "perl -pi -e 's#^LogFile=.*\$#LogFile=\\\"${READ_LOG}\\\"#' ${CONFIG}"
fi
ensure_root()
{
if [ "$ENSURE_ROOT_LINKS" != 1 ]; then
return;
fi
F=$1
TARGET=$2
if [ ! -h $F ]; then
return;
fi
FOWNER=`ls -la $F | awk '{print $3}'`
if [ "$FOWNER" = "$USER" ]; then
echo "Setting link $F to root";
run_as_user "rm '$F'"
ln -s "$TARGET" "$F"
fi
}
ICON=${STATS_DIR}/icon
#only create it during conversion. Never reset, which could be predicted.
#if [ ! -h $ICON ]; then
# run_as_user "rm -rf $ICON"
# ln -s ${AWSTATS}/wwwroot/icon $ICON
#fi
ensure_root $ICON ${AWSTATS}/wwwroot/icon
if [ ! -e "${ICON}" ]; then
ln -s ${AWSTATS}/wwwroot/icon $ICON
fi
#Oct 24, 2010
if [ "${ADD_CGI}" -eq 1 ]; then
#copy cgi-bin bits to awstats directory.
NEEDS_UPDATING=0
AS_PL=${AWSTATS}/wwwroot/cgi-bin/awstats.pl
if [ ! -e "${STATS_DIR}/awstats.pl" ]; then
NEEDS_UPDATING=1
else
#ensure it's current
CURRENT_REV=`grep '$REVISION = ' ${STATS_DIR}/awstats.pl | cut -d\' -f2`
echo "Current REVISION from ${STATS_DIR}/awstats.pl: ${CURRENT_REV}";
if [ "${CURRENT_REV}" = "" ]; then
echo "${STATS_DIR}/awstats.pl does not have REVISION set, updating from ${AS_PL}"
NEED_UPDATING=1
elif [ "${CURRENT_REV}" -lt 20180105 ]; then
echo "${STATS_DIR}/awstats.pl is old, updating from ${AS_PL}"
NEEDS_UPDATING=1
fi
fi
if [ "${NEEDS_UPDATING}" -eq 1 ]; then
run_as_user "/bin/cp -v ${AS_PL} ${STATS_DIR}/awstats.pl"
#make a few changes so it can find the config.
run_as_user "perl -pi -e 's#\\\"\$DIR\\\",\s+\\\"/etc/awstats\\\",#\\\"\$DIR\\\",\t\\\"${DATA_DIR}\\\",#' ${STATS_DIR}/awstats.pl"
#repeat for variations of the awstats.pl files
run_as_user "perl -pi -e 's#\\\"/etc/awstats\\\"#\\\"${DATA_DIR}\\\"#' ${STATS_DIR}/awstats.pl"
fi
run_as_user "chmod 755 ${STATS_DIR}/awstats.pl"
if [ ! -e "${STATS_DIR}/lang" ]; then
ln -s ${AWSTATS}/wwwroot/cgi-bin/lang ${STATS_DIR}/lang
fi
ensure_root ${STATS_DIR}/lang ${AWSTATS}/wwwroot/cgi-bin/lang
if [ ! -e "${STATS_DIR}/lib" ]; then
ln -s ${AWSTATS}/wwwroot/cgi-bin/lib ${STATS_DIR}/lib
fi
ensure_root ${STATS_DIR}/lib ${AWSTATS}/wwwroot/cgi-bin/lib
if [ ! -e "${STATS_DIR}/plugins" ]; then
ln -s ${AWSTATS}/wwwroot/cgi-bin/plugins ${STATS_DIR}/plugins
fi
ensure_root ${STATS_DIR}/plugins ${AWSTATS}/wwwroot/cgi-bin/plugins
WWWCONFIG=${DATA_DIR}/awstats.www.${DOMAIN}.conf
if [ ! -e ${WWWCONFIG} ]; then
run_as_user "ln -s awstats.${DOMAIN}.conf ${WWWCONFIG}"
fi
EXECCGI=1;
DC=/usr/local/directadmin/data/users/${USER}/domains/${TOP_DOMAIN}.conf
if [ -s ${DC} ]; then
C=`grep -c "^cgi=OFF" $DC`
if [ "${C}" -gt 0 ]; then
EXECCGI=0;
fi
fi
HTACCESS=${STATS_DIR}/.htaccess
ADD_HTA=0
if [ ! -e ${HTACCESS} ]; then
ADD_HTA=1
else
#check it's contents
COUNT=`run_as_user "grep -c 'DirectoryIndex awstats.pl' ${HTACCESS}"`
if [ "${COUNT}" -eq 0 ] && [ "${EXECCGI}" -eq 1 ]; then
ADD_HTA=1
fi
if [ "${COUNT}" -eq 1 ] && [ "${EXECCGI}" -eq 0 ]; then
ADD_HTA=1
fi
fi
if [ -h ${HTACCESS} ]; then
echo "${HTACCESS} is a symbolic link. Aborting.";
exit 11;
fi
if [ "${ADD_HTA}" -eq 1 ]; then
if [ "${EXECCGI}" -eq 1 ]; then
run_as_user "echo 'Options -Indexes +ExecCGI' > ${HTACCESS}"
run_as_user "echo 'AddHandler cgi-script .pl' >> ${HTACCESS}"
run_as_user "echo 'DirectoryIndex awstats.pl' >> ${HTACCESS}"
else
run_as_user "echo 'Options -Indexes' > ${HTACCESS}"
fi
run_as_user "echo '' >> ${HTACCESS}"
run_as_user "echo 'RewriteEngine On' >> ${HTACCESS}"
run_as_user "echo 'RewriteCond %{HTTP_HOST} ^www.${DOMAIN}\$ [NC]' >> ${HTACCESS}"
run_as_user "echo 'RewriteRule ^(.*)\$ http://${DOMAIN}/awstats/\$1 [R=301,L]' >> ${HTACCESS}"
fi
fi
#Setup logs to be readable.
mkdir $USER_LOGS/$USER
chmod 750 $USER_LOGS/$USER
if [ "${AWSTATS_MODE}" = "1" ]; then
ln $LOG $READ_LOG
elif [ "${AWSTATS_MODE}" = "2" ]; then
/bin/cp $LOG $READ_LOG
else
echo "UNKNOWN AWSTATS MODE!!"
fi
chown root:$USER $USER_LOGS/$USER
if [ "${IS_CAGEFS}" = "1" ]; then
# need to have user_logs visible to the user, in the skeleton.
# Use the split method on user_logs
C=`grep -c "^%${USER_LOGS}" /etc/cagefs/cagefs.mp`
if [ "${C}" = "0" ]; then
echo "Adding %${USER_LOGS} to /etc/cagefs/cagefs.mp";
echo "%${USER_LOGS}" >> /etc/cagefs/cagefs.mp
${CAGEFSCTL} --remount ${USER}
fi
# can we see the log?
CHECK=`run_as_user "if [ -r ${READ_LOG} ]; then echo 1; else echo 0; fi"`
if [ "${CHECK}" = "0" ]; then
${CAGEFSCTL} --remount ${USER}
fi
CHECK=`run_as_user "if [ -r ${READ_LOG} ]; then echo 1; else echo 0; fi"`
if [ "${CHECK}" = "0" ]; then
echo "Cannot read log ${READ_LOG} as user ${USER} after:"
echo "${CAGEFSCTL} --remount ${USER}"
run_as_user "ls -la ${USER_LOGS}"
fi
fi
if [ "${ADD_HTML}" -eq 1 ]; then
BD='-builddate=%YY%MM'
#this doesn't work because there are 4 hours of the next month in the logs on the first day.
#They empty the stats from the old html for last month.
#DAY=`date +%e`
#if [ "$DAY" -eq 1 ]; then
# YYMM=`date --date='yesterday' +%y%m`
# BD="-builddate=$YYMM"
#fi
#-lang=en
run_as_user "/usr/bin/perl ${AWSTATS}/tools/awstats_buildstaticpages.pl -config=${DOMAIN} -configdir=${DATA_DIR} -update -diricons=icon -awstatsprog=${AWSTATS}/cgi-bin/awstats.pl -dir=${STATS_DIR} $BD"
RET=$?
#we stil need to set a value though:
MAIN_FILE=awstats.${DOMAIN}.`date +%y%m`.html
MAIN_HTML=${STATS_DIR}/${MAIN_FILE}
INDEX_HTML=${STATS_DIR}/index.html
#changes per month
run_as_user "ln -sf ${MAIN_FILE} ${INDEX_HTML}"
#ensure_root ${INDEX_HTML}
#ensure_root ${MAIN_HTML}
else
#this is for the case where we dont want to waste time with static html files (ADD_HTML=0) but ADD_CGI is still on.
#due to the check check for !ADD_HTML&&!ADD_CGI above, ADD_CGI must be 1 at this point.
run_as_user "/usr/bin/perl ${AWSTATS}/tools/awstats_updateall.pl now -configdir=${DATA_DIR} -awstatsprog=${AWSTATS}/cgi-bin/awstats.pl"
# -excludeconf=awstats.www.${DOMAIN}.conf we're using mod_rewrite to change www.domain.com/awstast to domain.com/awstats, since only domain.com/awstats works unless we link every single data file (ugly).
RET=$?
fi
echo "Cleanup..."
rm -f $READ_LOG
if [ "${IS_CAGEFS}" != "1" ]; then
rm -rf $USER_LOGS/$USER
fi
if [ "${CLEAR_AWSTATS_OLD}" = "1" ]; then
echo "Clearing ${STATS_DIR} via task.queue. This will run in the background.";
echo "action=delete&value=secure_disposal&user=${USER}&path=${STATS_DIR}.old" >> /usr/local/directadmin/data/task.queue
fi
exit $RET;

View File

@@ -0,0 +1,340 @@
#!/usr/local/bin/php -c/usr/local/directadmin/scripts/php_clean.ini
<?php
$version = 0.1;
/*
Backup script for the per-domain RoundCube settings.
Backup/Restore written by DirectAdmin: http://www.directadmin.com
RoundCube Webmail Client: http://roundcube.net
This script will generate a per-domain XML output of all users for that domain, in the roundcube database.
It will also include one system account username (eg: admin), which is associated with the domain.
The XML file is index/ID independant, so you can restore a set of domain accounts onto any other
active DirectAdmin/RoundCube database without worry of ID conflicts.
See the restore_roundcube.php for info on the restore process.
See the DirectAdmin versions system for more info:
http://www.directadmin.com/features.php?id=1062
All variables are passed via environment, not command line options
But you can specify environmental variables... via command line options before the script (see the showHelp() function)
RETURN VALUES
0: All is well
>1: an error worthy or reporting has occured. Message on stderr.
1: an error, most likely due to not actually having RoundCube installed or no restore data, has occured.
*/
/***********************
* Environmental variables
*/
$domain = getenv("domain"); //Get all email users from this domain.
$system_username = getenv("username"); //Also get this single system account
$xml_file = getenv("xml_file"); //and save all info to this file.
/***********************
* this restores as da_admin instead of da_roundube.
* For the backup, we are less concerned with dangerous data, so we use it for reliability reasons.
*/
$high_access_connection = TRUE;
/***********************
* If $high_access_restore is false, this is used for the mysql credentials.
*/
$rc_config = "/var/www/html/roundcube/config/config.inc.php";
//****************************************************************
//****************************************************************
if (!isset($domain) || $domain == "")
show_help();
if (!isset($system_username) || $system_username == "")
show_help();
if (!isset($xml_file) || $xml_file == "")
show_help();
if (!extension_loaded('mysqli'))
{
echo_stderr("Php is not compiled with mysqli. Cannot dump roundcube settings.\n");
exit(1);
}
//****************************************************************
//****************************************************************
if ($high_access_connection)
{
if (version_compare(PHP_VERSION, '5.3.0', '<'))
{
$mysql_conf = @parse_ini_file("/usr/local/directadmin/conf/mysql.conf", false);
}
else
{
$mysql_conf = @parse_ini_file("/usr/local/directadmin/conf/mysql.conf", false, INI_SCANNER_RAW);
}
}
if ($high_access_connection && $mysql_conf && strlen($mysql_conf['passwd']) > 4)
{
$mysql_user = $mysql_conf['user'];
$mysql_pass = $mysql_conf['passwd'];
$mysql_host = 'localhost';
$mysql_db = 'da_roundcube';
if (isset($mysql_conf['host']) && $mysql_conf['host'] != "")
$mysql_host = $mysql_conf['host'];
}
else
{
if (!file_exists($rc_config))
{
echo_stderr("Cannot find RoundCube config at $rc_config. Is RC installed and up to date?\n");
exit(7);
}
include_once($rc_config);
if (!isset($config) || !isset($config['db_dsnw']) || $config['db_dsnw'] == '')
{
echo_stderr("Cannot find \$config['db_dsnw'] variable in $rc_config\n");
exit(6);
}
//$config['db_dsnw'] = 'mysql://da_roundcube:password@localhost/da_roundcube';
$values = explode('/', $config['db_dsnw']);
$connect = explode('@', $values[2]);
$auth = explode(':', $connect[0]);
$mysql_user = $auth[0];
$mysql_pass = $auth[1];
$mysql_host = $connect[1];
$mysql_db = $values[3];
}
$mysqli = new mysqli($mysql_host, $mysql_user, $mysql_pass);
if ($mysqli->connect_errno) {
echo_stderr("Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error."\n");
exit(3);
}
$mysqli->set_charset('utf8');
if (!$mysqli->select_db($mysql_db))
{
echo_stderr("There is no $mysql_db database. Skipping RoundCube backup.\n");
exit(1);
}
//****************************************************************
//****************************************************************
//Check if we have contactgroups
$have_contactgroups = true;
$query = "SHOW TABLES LIKE 'contactgroups'";
$result = $mysqli->query($query);
if ($result->num_rows == 0)
{
$have_contactgroups = false;
}
//First, find all accounts for this domain.
$query = "SELECT * FROM `users` WHERE username LIKE '%@".mes($domain)."' OR username='".mes($system_username)."'";
$result = $mysqli->query($query);
if (!$result)
{
echo_stderr("Query error with user selection: ".$mysqli->error);
$mysqli->close();
exit(8);
}
$top_depth = 0;
$fp = @fopen($xml_file, 'w');
if (!$fp)
{
echo_stderr("Unable to open $xml_file for writing. Unable to backup RoundCube Data.");
$mysqli->close();
exit(5);
}
xml_open("ROUNDCUBE", $top_depth);
while($user = $result->fetch_object())
{
$email_depth = $top_depth + 1;
$email_item_depth = $email_depth + 1;
xml_open("EMAIL", $email_depth);
//echo "usermname = ".$user->username."\n";
//echo "user_id = ".$user->user_id."\n";
xml_item("USERNAME", $user->username, $email_item_depth);
xml_item("LANGUAGE", $user->language, $email_item_depth);
xml_item("PREFERENCES", $user->preferences, $email_item_depth);
xml_item("CREATED", $user->created, $email_item_depth);
xml_item("LAST_LOGIN", $user->last_login, $email_item_depth);
//get all indentities
$query = "SELECT * FROM `identities` WHERE user_id=".$user->user_id." AND del=0";
$identities_result = $mysqli->query($query);
xml_open("INDENTITIES", $email_item_depth);
if ($identities_result !== FALSE)
{
while ($identity = $identities_result->fetch_array())
{
$identity_depth = $email_item_depth + 1;
$identity_item_depth = $identity_depth + 1;
xml_open("INDENTITY", $identity_depth);
xml_item("EMAIL", $identity['email'], $identity_item_depth);
xml_item("STANDARD", $identity['standard'], $identity_item_depth);
xml_item("NAME", $identity['name'], $identity_item_depth);
xml_item("CHANGED", $identity['changed'], $identity_item_depth);
xml_item("ORGANIZATION", $identity['organization'], $identity_item_depth);
xml_item("REPLY-TO", $identity['reply-to'], $identity_item_depth);
xml_item("BCC", $identity['bcc'], $identity_item_depth);
xml_item("SIGNATURE", $identity['signature'], $identity_item_depth);
xml_item("HTML_SIGNATURE", $identity['html_signature'], $identity_item_depth);
xml_close("INDENTITY", $identity_depth);
}
}
xml_close("INDENTITIES", $email_item_depth);
//dictionary?
//contacts
$query = "SELECT * FROM `contacts` WHERE user_id=".$user->user_id." AND del=0";
$contacts_result = $mysqli->query($query);
xml_open("CONTACTS", $email_item_depth);
if ($contacts_result !== FALSE)
{
while ($contact = $contacts_result->fetch_array())
{
$contact_depth = $email_item_depth + 1;
$contact_item_depth = $contact_depth + 1;
xml_open("CONTACT", $contact_depth);
xml_item('EMAIL', $contact['email'], $contact_item_depth);
xml_item('NAME', $contact['name'], $contact_item_depth);
xml_item('CHANGED', $contact['changed'], $contact_item_depth);
xml_item('FIRSTNAME', $contact['firstname'], $contact_item_depth);
xml_item('SURNAME', $contact['surname'], $contact_item_depth);
xml_item('VCARD', $contact['vcard'], $contact_item_depth);
xml_item('WORDS', $contact['words'], $contact_item_depth);
xml_open("GROUPS", $contact_item_depth);
if ($have_contactgroups)
{
$query = "SELECT m.*,g.name,g.changed FROM `contactgroups` as g, `contactgroupmembers` as m WHERE m.contact_id=".$contact['contact_id']." AND g.contactgroup_id=m.contactgroup_id AND g.del=0";
if (!($groups_result = $mysqli->query($query)))
{
echo_stderr("group query error: ".$mysqli->error."\n");
exit(4);
}
while ($group = $groups_result->fetch_array())
{
xml_open("GROUP", $contact_item_depth+1);
xml_item("NAME", $group['name'], $contact_item_depth+2);
xml_item("CHANGED", $group['changed'], $contact_item_depth+2);
xml_item("CREATED", $group['created'], $contact_item_depth+2);
xml_close("GROUP", $contact_item_depth+1);
}
}
xml_close("GROUPS", $contact_item_depth);
xml_close("CONTACT", $contact_depth);
}
}
xml_close("CONTACTS", $email_item_depth);
xml_close("EMAIL", 1);
}
xml_close("ROUNDCUBE", $top_depth);
fclose($fp);
$mysqli->close();
exit(0);
//**********************************************************************
function xml_item($name, $value, $tabs)
{
global $fp;
for ($i=0; $i<$tabs; $i++)
fwrite($fp, "\t");
fwrite($fp, "<".$name.">");
fwrite($fp, urlencode($value));
fwrite($fp, "</".$name.">\n");
}
function xml_open($name, $tabs)
{
global $fp;
for ($i=0; $i<$tabs; $i++)
fwrite($fp, "\t");
fwrite($fp, "<".$name.">\n");
}
function xml_close($name, $tabs)
{
global $fp;
for ($i=0; $i<$tabs; $i++)
fwrite($fp, "\t");
fwrite($fp, "</".$name.">\n");
}
function show_help()
{
global $version;
echo_stderr("Roundcube $version backup script to backup Users.\n\n");
echo_stderr("Usage:\n");
echo_stderr(" username=username domain=domain.com xml_file=/path/to/rc.xml ".__FILE__."\n\n");
echo_stderr("The script will output XML of all current email accounts stored in roundcube,\n");
echo_stderr("for the given domain.\n");
exit(2);
}
function die_stderr($str)
{
echo_stderr($str);
die();
}
function echo_stderr($str)
{
$fd = fopen('php://stderr', 'w');
fwrite($fd, $str);
fclose($fd);
}
function mes($str)
{
global $mysqli;
return $mysqli->real_escape_string($str);
}
?>

View File

@@ -0,0 +1,6 @@
#!/usr/local/bin/php
<?php
$str = getenv("STRING");
echo base64_encode($str);
exit(0);
?>

View File

@@ -0,0 +1,162 @@
<?php
$version = '2.0';
$user = getenv('DBUSER');
$pass = getenv('DBPASS');
$username = getenv('USERNAME');
$newusername = getenv('NEWUSERNAME');
$host = getenv('DBHOST');
if ($host == "")
$host = 'localhost';
$verbose = getenv('VERBOSE');
$verbose = ($verbose == 1) ? 1 : 0;
$ignore_errors = 0; //power through at your own risk
$exit_code = 0;
$rename_database_sh = '/usr/local/directadmin/scripts/rename_database.sh';
if (file_exists('/usr/local/directadmin/scripts/custom/rename_database.sh'))
$rename_database_sh = '/usr/local/directadmin/scripts/custom/rename_database.sh';
if ($username == "" || $username == "root" || $username == "mysql")
{
die("Bad username ($username). aborting mysql database swap");
}
if ($newusername == "" || $newusername == "root" || $newusername == "mysql")
{
die('Bad new username. aborting mysql database swap');
}
$mysqli = new mysqli('localhost',$user,$pass);
if ($mysqli->connect_error)
{
die('Could not connect to mysql: ('.$mysqli->connect_errno.') '. $mysqli->connect_error);
}
//*******************************************************************
// Main code
$mysqli->select_db('mysql');
replace_users($mysqli);
rename_dbs($mysqli);
$mysqli->query("FLUSH PRIVILEGES");
$mysqli->close();
exit($exit_code);
//*******************************************************************
function rename_dbs($mysqli)
{
global $username, $newusername, $ignore_errors, $rename_database_sh, $exit_code;
// This will find all databases owned by the User
// for each db, create a new db with the correct name (based on the old db?)
// for each db, it finds all tables
$user_dbs = get_user_dbs($mysqli);
foreach ($user_dbs as $db)
{
$new_db = preg_replace('/'.$username.'\\_/', $newusername.'_', $db);
vecho("Swapping $db to $new_db\n");
//This will mysqldump -> mysql to a new CREATE DB
//and will update mysql.db, mysql.columns_priv, mysql.procs_priv, mysql.tables_priv
$ret = 0;
system($rename_database_sh." '".$db."' '".$new_db."'", $ret);
if ($ret != 0)
$exit_code = $ret;
}
}
function get_user_dbs($mysqli)
{
global $username;
$query = "SHOW DATABASES LIKE '$username\\_%'";
if (! ($result = $mysqli->query($query)) )
{
die("DB List Error: ". $mysqli->error);
}
$db_array = array();
while (($row = $result->fetch_row()))
{
array_push($db_array, $row[0]);
}
$result->free();
return $db_array;
}
function replace_users($mysqli)
{
global $username;
global $newusername;
//in this function, we need to replace
// username to newusername
// username_user to newusername_user
if (false) //old
{
$mysqli->query("UPDATE mysql.user SET user='$newusername' WHERE user='$username'");
$mysqli->query("UPDATE mysql.db SET user='$newusername' WHERE user='$username'");
}
else //new
{
$query = "SELECT host FROM mysql.user WHERE user='$username'";
$result = $mysqli->query($query) or vecho("Error selecting mysql.user: ".$mysqli->error."\n", 1);
while ($row = $result->fetch_row())
{
$host = $row[0];
vecho("swapping '$username'@'$host' with '$newusername'@'$host'");
$query = "RENAME USER '$username'@'$host' TO '$newusername'@'$host'";
$mysqli->query($query) or vecho("Error updating '$username'@'$host' to '$newusername'@'$host' with RENAME USER: ".$mysqli->error."\n", 1);
}
$result->free();
}
$query = "SELECT user,host FROM mysql.user WHERE user LIKE '$username\\_%'";
$result = $mysqli->query($query) or vecho("Error selecting mysql.user: ".$mysqli->error."\n", 1);
while ($row = $result->fetch_row())
{
$user = $row[0];
$host = $row[1];
$new_user = preg_replace('/'.$username.'_/', $newusername."_", $user);
vecho("swapping '$user'@'$host' with '$new_user'@'$host'");
$query = "RENAME USER '$user'@'$host' TO '$new_user'@'$host'";
$mysqli->query($query) or vecho("Error updating '$user'@'$host' to '$new_user'@'$host' in mysql.user: ".$mysqli->error."\n", 1);
}
$result->free();
}
function vecho($str, $is_err=0)
{
global $verbose;
if ($verbose || $is_err==1)
echo $str."\n";
}
?>

View File

@@ -0,0 +1,599 @@
#!/bin/sh
#VERSION=2.3
#
# Script used to change the name of a user
#
# Usage: change_username.sh
VERBOSE=1
MAX_LENGTH=10
SYSTEM_USER_TO_VIRTUAL_PASSWD=0
DA_BIN=/usr/local/directadmin/directadmin
DATASKQ_BIN=/usr/local/directadmin/dataskq
TASKQ=/usr/local/directadmin/data/task.queue
TASKQ_CB=${TASKQ}.cb
DA_DATA_USERS=/usr/local/directadmin/data/users
PURE_PW=/usr/bin/pure-pw
if [ -s "$DA_BIN" ]; then
VAL=`${DA_BIN} c |grep '^max_username_length=' | cut -d= -f2`
if [ "$VAL" != "" ]; then
if [ "$VAL" -gt 0 ]; then
MAX_LENGTH=$VAL
fi
fi
VAL=`${DA_BIN} c |grep '^system_user_to_virtual_passwd=' | cut -d= -f2`
if [ "$VAL" != "" ]; then
if [ "$VAL" -gt 0 ]; then
SYSTEM_USER_TO_VIRTUAL_PASSWD=$VAL
fi
fi
if [ -s /etc/pureftpd.pdb ]; then
VAL=`${DA_BIN} c |grep '^pure_pw=' | cut -d= -f2`
if [ "$VAL" != "" ]; then
PURE_PW=$VAL
fi
fi
fi
show_help()
{
echo "DirectAdmin username changing script (Beta)";
echo "";
echo "Usage: $0 oldusername newusername";
echo "";
}
if [ $# -lt 2 ]; then
show_help
exit 0
fi
SYSTEMD=no
SYSTEMDDIR=/etc/systemd/system
if [ -d ${SYSTEMDDIR} ] && [ -e /usr/bin/systemctl ]; then
SYSTEMD=yes
fi
OS=`uname`;
OHOME=`grep -e "^${1}:" /etc/passwd | cut -d: -f6`
HOME_PATH=`dirname $OHOME`
NHOME=
str_len()
{
echo ${#1}
}
ensure_user()
{
/usr/bin/id $1 1>/dev/null 2>/dev/null
if [ $? != 0 ]; then
echo "Cannot find user $1";
exit 2;
fi
}
prevent_user()
{
/usr/bin/id $1 1>/dev/null 2>/dev/null
if [ $? = 0 ]; then
echo "User $1 already exists";
exit 4;
fi
if ! echo "$1" | grep -m1 -q '^[0-9a-z]*$'; then
echo "Username $1 is invalid";
exit 8;
fi
LEN=`str_len $1`
if [ "$LEN" != "" ]; then
if [ "$LEN" -gt "$MAX_LENGTH" ]; then
echo "User $1 is $LEN characters long.";
echo "The current max is:";
echo "max_username_length=$MAX_LENGTH";
exit 5;
fi
fi
}
#rename cron files and spool files else they'll be removed
#when account is removed.
#redhat does /var/spool/mail/user for us
move_spool_cron()
{
if [ "$OS" = "FreeBSD" ]; then
mv -f /var/mail/$1 /var/mail/$2 2>/dev/null
mv -f /var/cron/tabs/$1 /var/cron/tabs/$2 2>/dev/null
else
mv -f /var/spool/cron/$1 /var/spool/cron/$2 2>/dev/null
fi
}
rename_cron_user()
{
CRONTAB=/var/spool/cron/$1
if [ "$OS" = "FreeBSD" ]; then
CRONTAB=/var/cron/tabs/$1
fi
if [ -s $CRONTAB ]; then
#swap the actual cron data.
TEMP="/usr/bin/perl -pi -e 's#([\s:])${OHOME}/#\$1${NHOME}/#g' ${CRONTAB}"
eval $TEMP;
fi
move_spool_cron $1 $2
#da_swap has not yet been called. Use old user/crontab.conf
CRONTAB=${DA_DATA_USERS}/$1/crontab.conf
if [ -s ${CRONTAB} ]; then
#swap the actual cron data.
TEMP="/usr/bin/perl -pi -e 's#([\s:])${OHOME}/#\$1${NHOME}/#g' ${CRONTAB}"
eval $TEMP;
fi
}
system_swap()
{
echo "Killing User processes:"
/usr/bin/killall -s SIGKILL -u "$1"
if [ "$OS" = "FreeBSD" ]; then
#have to add a new user to the same id, then remove the other user
OUID=`grep -e "^${1}:" /etc/passwd | cut -d: -f3`
OGID=`grep -e "^${1}:" /etc/passwd | cut -d: -f4`
OPASS=`grep -e "^${1}:" /etc/master.passwd | cut -d: -f2`
OSHELL=`grep -e "^${1}:" /etc/passwd | cut -d: -f7`
#some FreeBSD's don't support -H
#echo $OPASS | /usr/sbin/pw useradd -n $2 -s $OSHELL -o -w no -u $OUID -g $OGID -H 0
/usr/sbin/pw useradd -n $2 -s $OSHELL -o -w no -u $OUID -g $OGID
chpass -p $OPASS $2
#now do the group
pw groupmod $1 -l $2 -q
else
/usr/sbin/usermod -l $2 -d $HOME_PATH/$2 $1
#now do the group
/usr/sbin/groupmod -n $2 $1
fi
ensure_user $2
NHOME=`grep -e "^${2}:" /etc/passwd | cut -d: -f6`
rename_cron_user $1 $2
if [ "$OS" = "FreeBSD" ]; then
pw userdel $1
fi
mv -f $OHOME $NHOME
#update sshd_config if user exists:
TEMP="/usr/bin/perl -pi -e 's/AllowUsers ${1}\$/AllowUsers ${2}/' /etc/ssh/sshd_config"
eval $TEMP;
}
security_check()
{
if [ "$1" = "root" ]; then
echo "Are you mad? we don't play with root here. He's not nice.";
exit 5;
fi
for i in all action value domain email type root mail jail creator diradmin majordomo start stop reload restart demo_user demo_reseller demo_admin demo type backup log www apache mysql tmp test; do
{
if [ "$1" = "$i" ]; then
echo "$1 is a reserved username, please choose another";
exit 5;
fi
};
done;
if [ "$1" = "" ]; then
echo "blank user..make sure you've passed 2 usernames";
exit 6;
fi
if [ ! -e /usr/bin/perl ]; then
echo "/usr/bin/perl does not exist";
exit 7;
fi
}
generic_swap()
{
TEMP="/usr/bin/perl -pi -e 's/(^|[\s=\/:])${1}([\s\/:]|\$)/\${1}${2}\${2}/g' $3"
eval $TEMP;
}
mailing_list_swap()
{
TEMP="/usr/bin/perl -pi -e 's/([\s:])${1}([\s@]|\$)/\${1}${2}\${2}/g' $3"
eval $TEMP;
}
ftp_pass_swap()
{
TEMP="/usr/bin/perl -pi -e 's/(^)${1}([:])/\${1}${2}\${2}/g' $3"
eval $TEMP;
TEMP="/usr/bin/perl -pi -e 's#${OHOME}([:\/])#${NHOME}\${1}#g' $3"
eval $TEMP;
}
awstats_swap()
{
#its called after system_swap, so we do it on user $2.
TEMP="/usr/bin/perl -pi -e 's#${OHOME}/#${NHOME}/#g' ${NHOME}/domains/*/awstats/.data/*.conf"
eval $TEMP;
TEMP="/usr/bin/perl -pi -e 's#${OHOME}/#${NHOME}/#g' ${NHOME}/domains/*/awstats/awstats.pl"
eval $TEMP;
}
installatron_swap()
{
if [ -d ${NHOME}/.appdata/current ]; then
TEMP="/usr/bin/perl -pi -e 's/${1}/${2}/' ${NHOME}/.appdata/current/*"
eval $TEMP;
fi
if [ -d ${NHOME}/.appdata/backups ]; then
TEMP="/usr/bin/perl -pi -e 's/${1}/${2}/' ${NHOME}/.appdata/backups/*"
eval $TEMP;
fi
}
snidomains_swap()
{
SNIDOMAINS=/etc/virtual/snidomains
if [ ! -s ${SNIDOMAINS} ]; then
return
fi
TEMP="/usr/bin/perl -pi -e 's/:${1}:/:${2}:/' ${SNIDOMAINS}"
eval $TEMP;
}
email_swap()
{
#/etc/virtual/domainowners
#/etc/virtual/
DATA_USER_OLD=${DA_DATA_USERS}/${1}/
DATA_USER_NEW=${DA_DATA_USERS}/${2}/
generic_swap $1 $2 /etc/virtual/domainowners
snidomains_swap $1 $2
DEFAULT_DOMAIN_NAME=`readlink ${NHOME}/public_html | grep -m1 -o '/[^/]*\.[^/]*/' | cut -d/ -f2`
DEFAULT_DOMAIN=false
if [ -L "${NHOME}/Maildir" ]; then
OLD_SYMLINK_TARGET=`readlink "${NHOME}/Maildir"`
NEW_SYMLINK_TARGET=`echo "${OLD_SYMLINK_TARGET}" | perl -p0 -e "s|/$1/|/$2/|g"`
if [ -d ${NEW_SYMLINK_TARGET} ]; then
ln -sf "${NEW_SYMLINK_TARGET}" "${NHOME}/Maildir"
fi
fi
for i in `cat ${DA_DATA_USERS}/$1/domains.list`; do
{
if [ ! -z "${DEFAULT_DOMAIN}" ] && [ "${i}" = "${DEFAULT_DOMAIN_NAME}" ]; then
DEFAULT_DOMAIN=true
DEFAULT_MAIL_MOVED=false
fi
#check for suspended domains
if [ ! -e /etc/virtual/$i ]; then
if [ -e /etc/virtual/${i}_off ]; then
i=${i}_off
fi
fi
if [ "${SYSTEM_USER_TO_VIRTUAL_PASSWD}" = "1" ] && [ -e "${NHOME}/Maildir" ] && ${DEFAULT_DOMAIN}; then
MAIL_LOCATION=`grep "^$1:" /etc/virtual/$i/passwd | cut -d: -f6 | perl -p0 -e "s|$1$|$2|g"`
if [ -z "${MAIL_LOCATION}" ] || [ ! -d "${MAIL_LOCATION}" ]; then
MAIL_FOLDER=`/usr/local/directadmin/directadmin c | grep '^mail_partition=' | cut -d= -f2`
MAIL_LOCATION=${NHOME}
if [ -z "${MAIL_FOLDER}" ]; then
MAIL_FOLDER=${NHOME}/imap/${i}/${1}
else
MAIL_LOCATION=${MAIL_FOLDER}
MAIL_FOLDER=${MAIL_FOLDER}/imap/${i}/${1}
fi
else
MAIL_FOLDER=${MAIL_LOCATION}/imap/${i}/${1}
fi
if [ ! -d ${MAIL_FOLDER}/Maildir ] && [ -d ${MAIL_LOCATION}/Maildir ]; then
mkdir -p ${MAIL_FOLDER}
chown $2:mail ${MAIL_FOLDER}
mv ${MAIL_LOCATION}/Maildir ${MAIL_FOLDER}
#used for system account, if it had such account name - move it back to system account
REALPATH_SYSTEM_FOLDER=`realpath ${MAIL_FOLDER}/../${2}`
if [ -z "${REALPATH_SYSTEM_FOLDER}" ]; then
REALPATH_SYSTEM_FOLDER=`readlink -e ${MAIL_FOLDER}/../${2}`
fi
if [ ! -z "${REALPATH_SYSTEM_FOLDER}" ] && [ -d "${REALPATH_SYSTEM_FOLDER}" ]; then
mv ${REALPATH_SYSTEM_FOLDER} ${MAIL_LOCATION}/Maildir
#find and remove that line with mail system account and old path
OLDREALPATH_SYSTEM_FOLDER_BEGINNING=`echo "${REALPATH_SYSTEM_FOLDER}" | grep -m1 -o ".*$2/"`
OLDREALPATH_SYSTEM_FOLDER_NEWBEGINNING=`echo "${OLDREALPATH_SYSTEM_FOLDER_BEGINNING}" | perl -p0 -e "s|/$2/|/$1/|g"`
OLDREALPATH_SYSTEM_FOLDER=`echo "${REALPATH_SYSTEM_FOLDER}" | perl -p0 -e "s|^${OLDREALPATH_SYSTEM_FOLDER_BEGINNING}|${OLDREALPATH_SYSTEM_FOLDER_NEWBEGINNING}|g"`
sed -i "\|:${OLDREALPATH_SYSTEM_FOLDER}:|d" /etc/virtual/$i/passwd
else
mkdir -p ${MAIL_LOCATION}/Maildir
chown $2:mail ${MAIL_LOCATION}/Maildir
fi
DEFAULT_MAIL_MOVED=true
fi
fi
generic_swap $1 $2 /etc/virtual/$i/aliases
#twice for user:user
generic_swap $1 $2 /etc/virtual/$i/aliases
#add aliases for the old main username
ADD_MAIN_ACCOUNT_FORWARDER=true
if ${DEFAULT_DOMAIN} && ${DEFAULT_MAIL_MOVED}; then
ADD_MAIN_ACCOUNT_FORWARDER=false
fi
if ! grep -m1 -q "^$1:" /etc/virtual/$i/aliases; then
if ${ADD_MAIN_ACCOUNT_FORWARDER}; then
if ! grep -m1 -q "^$1:" /etc/virtual/$i/aliases; then
echo "$1:$2" >> /etc/virtual/$i/aliases
fi
fi
fi
generic_swap $1 $2 /etc/virtual/$i/autoresponder.conf
generic_swap $1 $2 /etc/virtual/$i/filter
generic_swap $1 $2 /etc/virtual/$i/vacation.conf
#the dovecot passwd file uses the same format as the ftp.passwd file.
ftp_pass_swap $1 $2 /etc/virtual/$i/passwd
perl -pi -e "s|/[^/]*$1/imap/|/$2/imap/|g" /etc/virtual/$i/passwd
if [ "${SYSTEM_USER_TO_VIRTUAL_PASSWD}" = "1" ]; then
perl -pi -e "s/^$1:/$2:/g" /etc/virtual/$i/passwd
OLD_MAILDIR_PATH=`grep -m1 "^$2:" /etc/virtual/$i/passwd | cut -d: -f6`
if [ ! -z "${OLD_MAILDIR_PATH}" ]; then
NEW_MAILDIR_PATH=`echo "${OLD_MAILDIR_PATH}" | perl -p0 -e "s|/[^/]*$1$|/$2|g"`
perl -pi -e "s|:${OLD_MAILDIR_PATH}:|:${NEW_MAILDIR_PATH}:|g" /etc/virtual/$i/passwd
fi
if ${DEFAULT_DOMAIN} && ${DEFAULT_MAIL_MOVED}; then
if ! grep -m1 -q "^$1:" /etc/virtual/$i/passwd; then
grep "^$2:" /etc/virtual/$i/passwd | perl -p0 -e "s|:/.*/$2:|:${MAIL_FOLDER}:|g" | perl -p0 -e "s|^$2:|$1:|g" >> /etc/virtual/$i/passwd
fi
fi
fi
if [ -e /etc/virtual/$i/reply/$1.msg ]; then
mv -f /etc/virtual/$i/reply/$1.msg /etc/virtual/$i/reply/$2.msg
fi
if [ -e /etc/virtual/$i/reply/$1.msg_off ]; then
mv -f /etc/virtual/$i/reply/$1.msg_off /etc/virtual/$i/reply/$2.msg_off
fi
if [ -e /etc/virtual/$i/majordomo ]; then
mailing_list_swap $1 $2 /etc/virtual/$i/majordomo/list.aliases
mailing_list_swap $1 $2 /etc/virtual/$i/majordomo/private.aliases
fi
#/etc/dovecot/conf/sni/domain.com.conf
SNI_CONF=/etc/dovecot/conf/sni/${i}.conf
if [ -s ${SNI_CONF} ]; then
TEMP="/usr/bin/perl -pi -e 's#${DATA_USER_OLD}#${DATA_USER_NEW}/#g' ${SNI_CONF}"
eval $TEMP;
fi
};
done;
}
ftp_path_swap()
{
if [ ! -s "$3" ]; then
return;
fi
TEMP="/usr/bin/perl -pi -e 's#users/${1}/ftp.passwd#users/${2}/ftp.passwd#g' $3"
eval $TEMP;
}
ftp_swap()
{
#/etc/proftpd.passwd
#/etc/proftpd.vhosts.conf
ftp_path_swap $1 $2 /etc/proftpd.vhosts.conf
ftp_pass_swap $1 $2 /etc/proftpd.passwd
ftp_pass_swap $1 $2 ${DA_DATA_USERS}/$1/ftp.passwd
TEMP="/usr/bin/perl -pi -e 's#users/${1}/#users/${2}/#g' ${DA_DATA_USERS}/$1/domains/*.ftp";
eval $TEMP;
TEMP="/usr/bin/perl -pi -e 's#${OHOME}/#${NHOME}/#g' ${DA_DATA_USERS}/$1/domains/*.ftp";
eval $TEMP;
if [ -s /etc/pureftpd.pdb ] && [ -x ${PURE_PW} ]; then
${PURE_PW} mkdb /etc/pureftpd.pdb -f /etc/proftpd.passwd
fi
}
httpd_swap()
{
#/etc/httpd/conf/httpd.conf
#/etc/httpd/conf/ips.conf
#/usr/local/directadmin/data/users/$1/httpd.conf
if [ ! -s /etc/httpd/conf/httpd.conf ]; then
return;
fi
TEMP="/usr/bin/perl -pi -e 's#users/${1}/httpd.conf#users/${2}/httpd.conf#g' /etc/httpd/conf/httpd.conf";
eval $TEMP;
TEMP="/usr/bin/perl -pi -e 's#users/${1}/httpd.conf#users/${2}/httpd.conf#g' /etc/httpd/conf/extra/directadmin-vhosts.conf";
eval $TEMP;
#maybe it's nginx
if [ -s /etc/nginx/directadmin-vhosts.conf ]; then
TEMP="/usr/bin/perl -pi -e 's#users/${1}/nginx.conf#users/${2}/nginx.conf#g' /etc/nginx/directadmin-vhosts.conf";
eval $TEMP;
fi
#I thought about doing the ips.conf and the users httpd.conf file.
#but figured it would be far safer to just issue a rewrite.
TEMP="/usr/bin/perl -pi -e 's#=${1}\$#=${2}#g' ${DA_DATA_USERS}/$1/domains/*.conf";
eval $TEMP;
TEMP="/usr/bin/perl -pi -e 's#users/${1}/#users/${2}/#g' ${DA_DATA_USERS}/$1/domains/*.conf";
eval $TEMP;
}
nginx_swap()
{
if [ ! -s /etc/nginx/directadmin-vhosts.conf ]; then
return;
fi
#/etc/nginx/directadmin-vhosts.conf
TEMP="/usr/bin/perl -pi -e 's#users/${1}/nginx.conf#users/${2}/nginx.conf#g' /etc/nginx/directadmin-vhosts.conf";
eval $TEMP;
}
mysql_swap()
{
#well, im going to say it outright.. this might not be so easy.
#have to rename all the databases and all users from username_something to newuser_something.
#1) stop mysql. Do this by killing the pid. Remember to set it to OFF in the services.status file.
#2) rename the database directory
#3) start up mysql again
#use the change_database_username.sh script.
MYSQL_CONF=/usr/local/directadmin/conf/mysql.conf
MYSQL_USER=`cat $MYSQL_CONF | grep user | cut -d= -f2`
MYSQL_PASS=`cat $MYSQL_CONF | grep passwd | cut -d= -f2`
DBHOST=localhost
if [ `grep -c ^host= $MYSQL_CONF` -gt 0 ]; then
DBHOST=`cat $MYSQL_CONF | grep ^host= | cut -d= -f2`
fi
VERBOSE=$VERBOSE DBUSER="$MYSQL_USER" DBPASS="$MYSQL_PASS" DBHOST="$DBHOST" USERNAME="$1" NEWUSERNAME="$2" /usr/local/bin/php -c /usr/local/directadmin/scripts/php_clean.ini /usr/local/directadmin/scripts/change_database_username.php
}
mysql_swap_in_public_html()
{
MY_CNF=/usr/local/directadmin/conf/my.cnf
for database_name in `mysql --defaults-extra-file=${MY_CNF} -e "SHOW DATABASES LIKE '${2}_%';" -sss`; do {
OLD_DB_NAME=`echo "${database_name}" | perl -p0 -e "s|^${2}_|${1}_|g"`
echo "Trying to find files in public_html to rename ${OLD_DB_NAME} to ${database_name}. A copy of the file will have '.change_username_copy_dbname.php' appended at the end."
find ${NHOME}/domains/*/public_html -maxdepth 3 \( -name "*.php" -o -name '.env' \) ! -name '*.change_username_copy.php' ! -name '*.change_username_copy_dbname.php' -exec grep -m1 -l "${OLD_DB_NAME}" {} \; -exec cp -pf {} "{}.change_username_copy_dbname.php" \; -exec perl -pi -e "s|${OLD_DB_NAME}|${database_name}|g" {} \;
}
done
for mysql_user in `mysql --defaults-extra-file=${MY_CNF} -e "select distinct user from mysql.user where user like '${2}_%';" -sss`; do {
if ! mysql --defaults-extra-file=${MY_CNF} -e "SHOW DATABASES LIKE '${mysql_user}';" -sss | grep -m1 -q "^${mysql_user}$"; then
OLD_DB_USERNAME=`echo "${mysql_user}" | perl -p0 -e "s|^${2}_|${1}_|g"`
echo "Trying to find files in public_html to rename ${OLD_DB_USERNAME} to ${mysql_user}. A copy of the file will have '.change_username_copy.php' appended at the end."
find ${NHOME}/domains/*/public_html -maxdepth 3 \( -name "*.php" -o -name '.env' \) ! -name '*.change_username_copy.php' ! -name '*.change_username_copy_dbname.php' -exec grep -m1 -l "${OLD_DB_USERNAME}" {} \; -exec cp -pf {} "{}.change_username_copy.php" \; -exec perl -pi -e "s|${OLD_DB_USERNAME}|${mysql_user}|g" {} \;
fi
}
done
}
da_swap()
{
#email
#ftp
#httpd
#./data/users/reseller/users.list
#./data/users/client/user.conf->creator=$1 -> $2
#./data/users/username and *
email_swap $1 $2
ftp_swap $1 $2
httpd_swap $1 $2
nginx_swap $1 $2
mysql_swap $1 $2
mysql_swap_in_public_html $1 $2
if [ -e /usr/local/awstats ]; then
awstats_swap $1 $2
fi
installatron_swap $1 $2
CREATOR=`grep creator= ${DA_DATA_USERS}/$1/user.conf | cut -d= -f2`
if [ "$CREATOR" != "root" ]; then
generic_swap $1 $2 ${DA_DATA_USERS}/$CREATOR/users.list
fi
if [ -e ${DA_DATA_USERS}/$1/reseller.conf ]; then
generic_swap $1 $2 /usr/local/directadmin/data/admin/reseller.list
TEMP="/usr/bin/perl -pi -e 's#reseller=${1}\$#reseller=${2}#g' /usr/local/directadmin/data/admin/ips/*";
eval $TEMP;
#change the creator for all accounts we've made.
for i in `cat ${DA_DATA_USERS}/$1/users.list`; do
{
TEMP="/usr/bin/perl -pi -e 's#creator=${1}\$#creator=${2}#g' ${DA_DATA_USERS}/$i/user.conf";
eval $TEMP;
};
done;
#now check to see if we are an admin too. If so, change any resellers/admins who have us as their creator.
TYPE=`grep usertype= ${DA_DATA_USERS}/$1/user.conf | cut -d= -f2`
if [ "$TYPE" = "admin" ]; then
for i in `cat /usr/local/directadmin/data/admin/reseller.list; cat /usr/local/directadmin/data/admin/admin.list`; do
{
TEMP="/usr/bin/perl -pi -e 's#creator=${1}\$#creator=${2}#g' ${DA_DATA_USERS}/$i/user.conf";
eval $TEMP;
};
done;
generic_swap $1 $2 /usr/local/directadmin/data/admin/admin.list
fi
#to be safe, rewrite the whole pile with the updated creator, in case anyone is suspended.
echo "action=rewrite&value=httpd" >> ${TASKQ}
fi
TEMP="/usr/bin/perl -pi -e 's#value=${1}\$#value=${2}#g' /usr/local/directadmin/data/admin/ips/*";
eval $TEMP;
TEMP="/usr/bin/perl -pi -e 's#username=${1}\$#username=${2}#g' ${DA_DATA_USERS}/$1/user.conf";
eval $TEMP;
mv -f ${DA_DATA_USERS}/$1 ${DA_DATA_USERS}/$2
#once done, rewrite the ips.conf and users httpd.conf using $2
#show all users cache. Total rewrite.
echo "action=rename&value=username&username=${2}&old_username=${1}&old_home=${OHOME}" >> ${TASKQ_CB};
${DATASKQ_BIN} --custombuild
echo "action=rewrite&value=httpd&user=$2" >> ${TASKQ}
echo "action=rewrite&value=ips" >> ${TASKQ}
echo "action=cache&value=showallusers" >> ${TASKQ}
}
change_name()
{
security_check $1
security_check $2
ensure_user $1
prevent_user $2
system_swap $1 $2
da_swap $1 $2
if [ -x /usr/sbin/cagefsctl ]; then
/usr/sbin/cagefsctl --remount ${2}
fi
}
if [ $# -eq 2 ]; then
change_name $1 $2
exit 0
fi

View File

@@ -0,0 +1,72 @@
#!/bin/sh
DA_DIR=/usr/local/directadmin
DA_BIN=${DA_DIR}/directadmin
NAMED_CONF=""
SERVICE_NAME=named
if [ -s ${DA_DIR}/conf/directadmin.conf ] && [ -x ${DA_BIN} ]; then
NAMED_CONF=`${DA_BIN} c | grep ^namedconfig= | cut -d= -f2`
NAMED_OVERRIDE=`${DA_BIN} c | grep ^named_service_override= | cut -d= -f2`
if [ "${NAMED_OVERRIDE}" != "" ]; then
SERVICE_NAME=${NAMED_OVERRIDE}
fi
fi
if [ "${NAMED_CONF}" = "" ] || [ ! -s "$NAMED_CONF" ]; then
NAMED_CONF=/etc/named.conf
OS=`uname`
if [ "$OS" = "FreeBSD" ]; then
NAMED_CONF=/etc/namedb/named.conf
fi
if [ -s /etc/debian_version ]; then
NAMED_CONF=/etc/bind/named.conf
fi
fi
if [ ! -s $NAMED_CONF ]; then
echo "Cannot find $NAMED_CONF to check";
exit 1;
fi
if grep -m1 -q allow-transfer ${NAMED_CONF}; then
#echo "Skipping allow-transfer chcek on ${NAMED_CONF}. allow-transfer already present.";
exit 0;
fi
OPTIONS_CONF=$NAMED_CONF
HAVE_OPTIONS_AREA=`grep -c '^options {' ${OPTIONS_CONF}`
for i in `grep -E '^[[:space:]]*include ' ${NAMED_CONF} | cut -d\" -f2`; do
{
if [ "$i" = "" ] || [ ! -s "$i" ]; then
continue;
fi
if grep -m1 -q allow-transfer ${i}; then
#echo "Skipping allow-transfer chcek on ${i}. allow-transfer already present.";
exit 0;
fi
if [ "${HAVE_OPTIONS_AREA}" -eq 0 ]; then
HAVE_OPTIONS_AREA=`grep -c '^options {' $i`
if [ "${HAVE_OPTIONS_AREA}" -eq 0 ]; then
continue;
fi
OPTIONS_CONF=$i
fi
};
done;
if [ "${HAVE_OPTIONS_AREA}" -eq 0 ]; then
echo "Could not find options section in the $NAMED_CONF or any of it's include files";
exit 2;
fi
if ! grep -m1 -q allow-transfer ${OPTIONS_CONF}; then
perl -pi -e 's|options \{|options \{\n\tallow-transfer \{ none; \};|g' ${OPTIONS_CONF}
echo "Added 'allow-transfer { none; };' to ${OPTIONS_CONF}"
echo "action=${SERVICE_NAME}&value=reload" >> ${DA_DIR}/data/task.queue
fi
exit 0;

View File

@@ -0,0 +1,67 @@
#!/bin/sh
OS=`uname`
NETSTAT=/bin/netstat
SS=/usr/sbin/ss
if [ "$OS" = "FreeBSD" ]; then
NETSTAT=/usr/bin/netstat
fi
freebsd_netstat()
{
${NETSTAT} -n -p tcp
${NETSTAT} -n -p udp
}
netstat_out()
{
if [ "$OS" = "FreeBSD" ]; then
freebsd_netstat | grep -v Address | grep -v Active | grep -v '*.*' | awk '{print $5}' | sed 's/\(.*\)\..*/\1/'
else
${NETSTAT} -ntu | grep -v Address | grep -v Active | grep -v '*.*' | awk '{print $5}' | sed 's/\(.*\):.*/\1/'
fi
}
show_ip_info()
{
I=$1
echo ""
echo "Connection info for '${I}':"
if [ "$OS" = "FreeBSD" ]; then
freebsd_netstat | grep $I
else
${NETSTAT} -ntu | grep $I
fi
}
if [ -x ${NETSTAT} ]; then
echo "Connection counts:"
netstat_out | sort | uniq -c | sort -n | tail -n 100
echo ""
#now take the IP with top connection count and get more info.
C_IP=`netstat_out | sort | uniq -c | sort -n | tail -n 1`
C=`echo "$C_IP" | awk '{print $1}'`
IP=`echo "$C_IP" | awk '{print $2}'`
echo "IP '$IP' currently has '$C' connections"
show_ip_info $IP
fi
if [ -x ${SS} ]; then
echo ""
echo "$SS output:"
$SS -n
fi
CIP=/usr/local/directadmin/scripts/custom/connection_info_post.sh
if [ -x ${CIP} ]; then
${CIP}
fi
exit 0;

View File

@@ -0,0 +1,33 @@
#!/bin/sh
OS=`uname`
if [ "$OS" = "FreeBSD" ]; then
DENY=/var/cron/deny
else
DENY=/etc/cron.deny
fi
deny()
{
if [ -e $DENY ]; then
COUNT=`grep -c -e "^$1\$" $DENY`
if [ "$COUNT" -ne 0 ]; then
return;
fi
fi
echo $1 >> $DENY
}
if [ -e $DENY ]; then
chmod 640 $DENY
if [ -e /etc/debian_version ]; then
chown root:crontab $DENY
fi
fi
deny apache
deny webapps
exit 0;

View File

@@ -0,0 +1,233 @@
**********
The contents of this file will map what script names will be associated with what commands.
Several scripts exist that are not mentioned here. Check:
http://www.directadmin.com/versions.php
Search for the keyword you are looking for plus pre.sh or post.sh
----
As of DirectAdmin 1.60.0, we recommend using script directories, instead of script files.
https://www.directadmin.com/features.php?id=2630
For example, to setup domain_create_pre.sh to setup a php script called 'foo', instead, you would use path:
/usr/local/directadmin/scripts/custom/domain_create_pre/foo.sh
This allows many scripts and plugins to setup their own hooks, without needing to use the same file.
**********
##########################################
domain_create_pre.sh - Runs BEFORE a domain is created
domain_create_post.sh - Runs AFTER a domain is created
domain_destroy_pre.sh - Runs BEFORE a domain is destroyed
domain_destroy_post.sh - Runs AFTER a domain is destroyed
environmental variables:
bandwidth=# or unlimited
cgi=ON or OFF
defaultdomain=yes or no
domain=domain.com
ssl=ON or OFF
suspended=yes or no
username=ownerofdomain
##########################################
domain_change_pre.sh - Runs BEFORE a domain is renamed. A non-zero value will abort the change.
domain_change_post.sh - Runs AFTER a domain is renamed.
environmental vars: http://www.directadmin.com/features.php?id=448
##########################################
subdomain_create_pre.sh - Runs BEFORE a subdomain is created, but after it's confirmed.
If this script returns a non-zero value, the creation is aborted.
subdomain_create_post.sh - Runs AFTER the subdomain is created.
subdomain_destroy_pre.sh - Runs BEFORE a subdomain is destroyed. If this script returns
a non-zero value, the destruction is aborted
subdomain_destroy_post.sh - Runs AFTER the subdomain is destroyed.
environmental variables:
username=ownerofdomain
domain=domain.com
subdomain=sub
contents=1 or 0 - only for destroy. Specifies that the directory and contents are being removed.
##########################################
user_create_pre.sh - Runs BEFORE the user is created, but after it's confirmed.
If this script returns anything but zero, the creation is aborted
user_create_post.sh - Runs AFTER the user is created.
user_destroy_pre.sh - Runs BEFORE the use is destroyed. If this script returns anything
but zero, the destruction is aborted.
user_destroy_post.sh - Runs AFTER the user is destroyed.
user_modify_post.sh - Runs AFTER the user is modified.
environmental variables:
account=ON or OFF
aftp=ON or OFF
bandwidth=# or unlimited
cgi=ON or OFF
creator=username
dnscontrol=ON or OFF
docsroot=./data/skins/default (relative path to document root)
domain=domain.com
domainptr=# or unlimited
email=email@domain.com
ftp=# or unlimited
ip=1.2.3.4
mysql=# or unlimited
nemailf=# or unlimited
nemailml=# or unlimited
nemailr=# or unlimited
nemails=# or unlimited
ns1=ns1.domain.com
ns2=ns2.domain.com
nsubdomains=# or unlimited
package=packagename
passwd=the password entered
quota=# or unlimited
sentwarning=no (refers to resource usage limits notification emails)
skin=default (name of skin)
ssh=ON or OFF
ssl=ON or OFF
suspend_at_limit=ON or OFF
suspended=no
username=username
usertype=user or reseller or admin
vdomains=# or unlimited
zoom=100 (completely useless value token for the css zoom feature)
##########################################
email_create_pre.sh - Runs BEFORE the virtual email is created, but after it's confirmed.
If this script returns anything but zero, the creation is aborted
email_create_post.sh - Runs AFTER the email is created
environment values:
user=bob
domain=domain.com
passwd=secret
passwd2=secret
username=username
quota=#
##########################################
email_destroy_pre.sh - Runs AFTER virtual email account is deleted.
environement values:
user=bob
domain=domain.com
username=username
##########################################
email_change_pre_post.sh - Runs BEFORE a virtual pop account password is changed.
If this script returns anything but zero, the change is aborted.
email_change_pass_post.sh - Runs AFTER a virtual pop account password is changed.
#username and quota are not passed if the password change is done using "/CMD_CHANGE_EMAIL_PASSWORD"
environmental values:
user=bob
domain=domain.com
passwd=newsecret
username=username
quota=#
##########################################
dns_write_post.sh - Runs AFTER a dns zone is written (/var/named/domain.com.db)
environmental values:
A : list of a records
CNAME : list of cname records
MX : list of mx records
NS : list of ns records
PTR : list of ptr records
SERIAL : the serial used in the zone
EMAIL : authoritative email
NS1 : authoritative ns zone.
DOMAIN : domain name of the zone
SERVER_IP : server IP
A_TIME : ttl for A records
CNAME_TIE : ttl for CNAME records
NS_TIME : ttl for NS records
PTR_TIME : ttl for PTR records
see http://www.directadmin.com/features.php?id=450 for more info
##########################################
database_create_post.sh
database_user_create_post.sh
environmental variables for both scripts:
username - DA username
database - name of the db
user - name of the user created
passwd - password used.
Note that database_create_user_post.sh will not be called when a database and it's user is being created.
This means that any code used in database_user_create_post.sh will have to be doubled in
database_create_post.sh as well for anything you want done to a new user.
##########################################
domain_pointer_create_pre.sh
domain_pointer_create_post.sh
environmental variables:
username
domain
from=domainpointer.com
ip=1.2.3.4
ns1=ns1.ns.com
ns2=ns2.ns.com
alias=yes or non-existant (checkbox)
domain_pointer_destroy_pre.sh
domain_pointer_destroy_post.sh
environmental variables:
username
domain=domain.com
from=dominpointer.com
##########################################
If you need to execute code a few seconds after the sh script it call
this code is a basic example on how to throw the script into the background
The foreground instance of it will close all file descriptors, then call
the background function, then exit. Becuase of the & character, the
background function is put in the background and runs until it's done.
Thanks to Alex for this find.
==================================
#!/bin/bash
function back(){
sleep 5
echo $0 `date` background >/tmp/da_scripts
}
echo $0 `date` start >/tmp/da_scripts
#closing all FDs
exec 0>&-
#this is important
exec 1>&-
exec 4>&-
back &
exit 0
==================================

View File

@@ -0,0 +1,16 @@
# DirectAdmin control panel
# To reload systemd daemon after changes to this file:
# systemctl --system daemon-reload
[Unit]
Description=POP before SMTP daemon
After=syslog.target network.target
Documentation=http://www.directadmin.com
[Service]
Type=forking
PIDFile=/run/da-popb4smtp.pid
ExecStart=/usr/local/directadmin/da-popb4smtp
WorkingDirectory=/usr/local/directadmin
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,45 @@
#!/bin/sh
if [ "$#" -ne 3 ]; then
echo "Usage:";
echo " $0 <encryptedin> <fileout> <passwordfile>"
echo ""
exit 1
fi
OPENSSL=/usr/bin/openssl
E=$1
O=$2
P=$3
if [ "${E}" = "" ] || [ ! -e ${E} ]; then
echo "Cannot find $F for decryption"
exit 2;
fi
if [ "${O}" = "" ]; then
echo "Please pass a destination path"
exit 3;
fi
if [ "${P}" = "" ] || [ ! -s ${P} ]; then
echo "Cannot find passwordfile $P"
exit 4
fi
RESULT=`${OPENSSL} enc -d -aes-256-cbc -md sha256 -salt -in $E -out $O -kfile ${P} 2>&1`
RET=$?
if [ "$RET" -ne 0 ]; then
#echo "'-md sha256' failed. Trying older '-md md5'"
RESULT=`${OPENSSL} enc -d -aes-256-cbc -md md5 -salt -in $E -out $O -kfile ${P} 2>&1`
RET=$?
fi
if [ "$RET" -ne 0 ]; then
echo "${RESULT}"
fi
exit $RET

View File

@@ -0,0 +1,129 @@
#!/usr/local/bin/php
<?php
/*
This script is to enforce a level of password difficulty that users must use.
You can change the minimum length if you wish, the default is 6.
The requirement for special characters is disabled by default.
Related directadmin.conf options:
- difficult password enforcement: http://www.directadmin.com/features.php?id=910
- enable shift chars: https://www.directadmin.com/features.php?id=1625
- min password length: http://www.directadmin.com/features.php?id=1176
- random password length: http://www.directadmin.com/features.php?id=1604
- ajax password checking/generation: http://www.directadmin.com/features.php?id=1560
*/
$min_length = getenv("difficult_password_length_min");
$pass = getenv("password");
$random_password_length = getenv("random_password_length");
$special_characters_in_random_passwords = getenv("special_characters_in_random_passwords");
if ($random_password_length < $min_length)
{
$min_length = $random_password_length;
}
//FUNCTION CALL section
check_length($pass);
enforce_mixed_case($pass);
enforce_numbers($pass);
if ($special_characters_in_random_passwords)
enforce_shift_chars($pass);
//FUNCTION CALL section, end
//passes the test
echo "Password OK\n";
exit(0);
function enforce_shift_chars($str)
{
if (!has_shift_chars($str))
{
echo "Password must have at least one special character such as !@#%$ etc..\n";
exit(3);
}
}
function enforce_numbers($str)
{
if (!has_numbers($str))
{
echo "Password must have numbers\n";
exit(4);
}
}
function enforce_mixed_case($str)
{
if (!has_caps($str) || !has_lower_case($str))
{
echo "Password must have both upper and lower case characters\n";
exit(2);
}
}
function check_length($str)
{
global $min_length;
$len = strlen($str);
if ($len < $min_length)
{
echo "Password is too short ($len). Use at least $min_length characters\n";
exit(1);
}
}
function has_shift_chars($str)
{
//return preg_match("/[\~\!\@\#\$\%\^\&\*\(\)\-\=\_\+\{\}\:\;\|\<\>\,\.\?\/]+/", $str);
$len = strlen($str);
$num_count=0;
for ($i=0; $i<$len; $i++)
{
$ch=$str[$i];
if ('!' <= $ch && $ch <= '/')
{
$num_count++;
}
if (':' <= $ch && $ch <= '@')
{
$num_count++;
}
if ('[' <= $ch && $ch <= '`')
{
$num_count++;
}
if ('{' <= $ch && $ch <= '~')
{
$num_count++;
}
}
return $num_count;
}
function has_numbers($str)
{
return preg_match("/[0-9]+/", $str);
}
function has_caps($str)
{
return preg_match("/[A-Z]+/", $str);
}
function has_lower_case($str)
{
return preg_match("/[a-z]+/", $str);
}
exit(0);
?>

View File

@@ -0,0 +1,76 @@
#!/bin/sh
# directadmin daemon Start/Stop/Status/Restart
# chkconfig: 2345 80 20
# description: Allows users to modify their websites. \
# They modify thier: email, subdomains, \
# databases, dns record, etc...
# processname: directadmin
# config: /usr/local/directadmin/conf/paneld.conf
# pidfile: /var/run/directadmin.pid
### BEGIN INIT INFO
# Provides: directadmin
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: directadmin
# Description: directadmin daemon
### END INIT INFO
# Source function library
. /etc/rc.d/init.d/functions
PROGBIN="/usr/local/directadmin/directadmin d"
PROGLOCK=/var/lock/subsys/directadmin
PROGNAME=directadmin
umask 0022
#check the command line for actions
start() {
echo -n "Starting DirectAdmin: "
daemon $PROGBIN
echo
touch $PROGLOCK
}
stop() {
echo -n "Stopping DirectAdmin: "
killproc $PROGNAME
echo
rm -f $PROGLOCK
}
reload() {
echo -n "Reloading DirectAdmin config file: "
killproc $PROGNAME -HUP
echo
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $PROGNAME
;;
restart)
stop
start
;;
reload)
reload
;;
*)
echo "Usage: $1 {start|stop|status|reload|restart}"
exit 1
esac
exit 0

View File

@@ -0,0 +1,8 @@
/var/log/directadmin/error.log /var/log/directadmin/errortaskq.log /var/log/directadmin/security.log /var/log/directadmin/system.log /var/log/directadmin/login.log {
missingok
create 0644 diradmin diradmin
sharedscripts
postrotate
find /var/log/directadmin -name "20*log*" -mtime +30 -exec /bin/rm -f {} \; >/dev/null 2>&1 || true
endscript
}

View File

@@ -0,0 +1,17 @@
# DirectAdmin control panel
# To reload systemd daemon after changes to this file:
# systemctl --system daemon-reload
[Unit]
Description=DirectAdmin Web Control Panel
After=syslog.target network.target
Documentation=http://www.directadmin.com
[Service]
Type=notify
ExecStart=/usr/local/directadmin/directadmin
ExecReload=/bin/kill -HUP $MAINPID
WorkingDirectory=/usr/local/directadmin
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,5 @@
* * * * * root /usr/local/directadmin/dataskq
2 0-23/6 * * * root echo 'action=vacation&value=all' >> /usr/local/directadmin/data/task.queue;
#5 5 * * 0 root /sbin/quotaoff -a; /sbin/quotacheck -augm; /sbin/quotaon -a;
10 0 * * * root echo 'action=tally&value=all' >> /usr/local/directadmin/data/task.queue
20 4 1 * * root echo 'action=reset&value=all' >> /usr/local/directadmin/data/task.queue

View File

@@ -0,0 +1,103 @@
#!/bin/sh
#dkim script to create keys in /etc/virtual/domain.com
#will ensure they exist and create them if missing.
#will also dump a task.queue entry to get DA to add the newly created key to the dns.
usage()
{
echo "Usage:";
echo "$0 <domain> (nodns) (force)";
echo ""
echo "Options:"
echo " <domain>: Required. Name of the domain to enable dkim for."
echo " nodns: Optional. Prevents adding the keys to the zone."
echo " force: Optional. Force overwrite of the keys with new values."
exit 1;
}
if [ $# -lt 1 ] || [ "$1" = "--help" ] ||[ "$1" = "-h" ]; then
usage
fi
DOMAIN=$1
DOMAIN_OWNERS=/etc/virtual/domainowners
VD=/etc/virtual/$DOMAIN
PRIV_KEY=${VD}/dkim.private.key
PUB_KEY=${VD}/dkim.public.key
ADD_DNS=1
FORCE=0
while [ "$2" != "" ]; do
case $2 in
nodns) ADD_DNS=0
;;
force) FORCE=1
;;
-h | --help) usage
exit
;;
esac
shift
done
OS="`uname`"
if [ "${OS}" = "FreeBSD" ]; then
CHOWN=/usr/sbin/chown
else
CHOWN=/bin/chown
fi
if [ ! -e $CHOWN ]; then
echo "Cannot find chown at $CHOWN";
exit 2;
fi
DKIM_ON=`/usr/local/directadmin/directadmin c | grep dkim= | cut -d= -f2`
if [ "$DKIM_ON" -eq 0 ]; then
echo "DKIM is not enabled. Add dkim=1 to the directadmin.conf";
exit 3;
fi
if [ ! -d ${VD} ]; then
echo "Unable to find ${VD}";
exit 2;
fi
COUNT=`grep -c ^${DOMAIN}: ${DOMAIN_OWNERS}`
if [ "${COUNT}" -gt 0 ]; then
#lets see if they've set dkim=0 in their user.conf or domains/domain.com.conf
#https://www.directadmin.com/features.php?id=1937
D_USER=`grep ^${DOMAIN}: ${DOMAIN_OWNERS} | cut -d\ -f2`
USER_CONF=/usr/local/directadmin/data/users/${D_USER}/user.conf
if [ -s ${USER_CONF} ]; then
COUNT=`grep -c dkim=0 ${USER_CONF}`
if [ "${COUNT}" -gt 0 ]; then
echo "User ${D_USER} has dkim=0 set in ${USER_CONF}. Not setting dkim."
exit 4;
fi
DOMAIN_CONF=/usr/local/directadmin/data/users/${D_USER}/domains/${DOMAIN}.conf
if [ -s ${DOMAIN_CONF} ]; then
COUNT=`grep -c dkim=0 ${DOMAIN_CONF}`
if [ "${COUNT}" -gt 0 ]; then
echo "Domain ${DOMAIN} has dkim=0 set in ${DOMAIN_CONF}. Not setting dkim."
exit 5;
fi
fi
fi
fi
if [ ! -e ${PRIV_KEY} ] || [ ! -e ${PUB_KEY} ] || [ "$FORCE" = "1" ]; then
openssl genrsa -out ${PRIV_KEY} 2048 2>&1
openssl rsa -in ${PRIV_KEY} -out ${PUB_KEY} -pubout -outform PEM 2>&1
chmod 600 ${PRIV_KEY} ${PUB_KEY}
$CHOWN mail:mail ${PRIV_KEY} ${PUB_KEY}
fi
if [ "$ADD_DNS" -eq 1 ]; then
echo "action=rewrite&value=dkim&domain=${DOMAIN}&dns=yes" >> /usr/local/directadmin/data/task.queue
fi
exit 0;

380
update/scripts/dnssec.sh Normal file
View File

@@ -0,0 +1,380 @@
#!/bin/sh
OS=`uname`
DA=/usr/local/directadmin/directadmin
if [ ! -s ${DA} ]; then
echo "Cannot find DirectAdmin binary:";
echo " ${DA}";
exit 1;
fi
DA_CONF=/usr/local/directadmin/conf/directadmin.conf
if [ ! -s ${DA_CONF} ]; then
echo "Cannot find DirectAdmin Config File:";
echo " ${DA_CONF}";
exit 2;
fi
TASK_Q=`${DA} c | grep ^taskqueuecb= | cut -d= -f2`
if [ "${TASK_Q}" = "" ]; then
echo "Cannot task.queue.cb from:";
echo "${DA} c | grep ^taskqueuecb=";
exit 3;
fi
DATASKQ="/usr/local/directadmin/dataskq --custombuild"
KEY_BIT_SIZE=2048
if [ "$dnssec_keygen_keysize" != "" ]; then
KEY_BIT_SIZE=$dnssec_keygen_keysize
fi
BIND_PATH=/etc
NAMED_BIN=/usr/sbin/named
DNSSEC_KEYGEN=/usr/sbin/dnssec-keygen
DNSSEC_SIGNZONE=/usr/sbin/dnssec-signzone
DNSSEC_RANDOMDEV='-r /dev/urandom'
if [ "${OS}" = "FreeBSD" ]; then
BIND_PATH=/etc/namedb
NAMED_BIN=/usr/local/sbin/named
DNSSEC_KEYGEN=/usr/local/sbin/dnssec-keygen
DNSSEC_SIGNZONE=/usr/local/sbin/dnssec-signzone
DNSSEC_RANDOMDEV=
elif [ -e /etc/debian_version ]; then
BIND_PATH=/etc/bind
fi
NAMED_PATH=`${DA} c | grep ^nameddir= | cut -d= -f2 2>/dev/null`
if [ "${NAMED_PATH}" = "" ]; then
echo "Cannot find nameddir from:";
echo "${DA} c | grep ^nameddir=";
exit 3;
fi
DNSSEC_KEYS_PATH=${NAMED_PATH}
NAMED_CONF=${BIND_PATH}/named.conf
NAMED_CONF=`${DA} c | grep namedconfig= | cut -d= -f2`
if [ -e /etc/debian_version ] && [ -e /etc/bind/named.conf.options ]; then
NAMED_CONF=/etc/bind/named.conf.options
fi
if [ ! -s ${NAMED_BIN} ]; then
echo "Cannot find ${NAMED_BIN}";
exit 4;
fi
NAMED_VER=`${NAMED_BIN} -v | cut -d\ -f2 | cut -d- -f1 | cut -d. -f1,2`
BIND_KEYS_FILE=${BIND_PATH}/named.iscdlv.key
if [ ! -x ${DNSSEC_KEYGEN} ]; then
echo "Cannot find ${DNSSEC_KEYGEN}. Please install dnssec tools";
exit 12;
fi
ENC_TYPE=RSASHA1
if [ `$DNSSEC_KEYGEN -h 2>&1 | grep -c RSASHA256` -gt 0 ]; then
ENC_TYPE=RSASHA256
fi
if [ "$dnssec_keygen_algorithm" != "" ]; then
if [ `$DNSSEC_KEYGEN -h 2>&1 | grep -c $dnssec_keygen_algorithm` -eq 0 ]; then
echo "$DNSSEC_KEYGEN does not appear to support $dnssec_keygen_algorithm. Using $ENC_TYPE.";
else
ENC_TYPE=$dnssec_keygen_algorithm
fi
fi
if [ ! -s ${DNSSEC_SIGNZONE} ]; then
echo "Cannot find ${DNSSEC_SIGNZONE}. Please install dnssec tools";
exit 13;
fi
HAS_SOA_FORMAT=0
SF=`${DNSSEC_SIGNZONE} -h 2>&1 | grep -c '\-N format:'`
if [ "${SF}" -gt 0 ]; then
HAS_SOA_FORMAT=1
fi
if [ "`${DNSSEC_SIGNZONE} --help 2>&1 | grep -c -m1 lookasidezone`" -gt 0 ]; then
LOOKASIDEZONE="-l dlv.isc.org"
else
LOOKASIDEZONE=""
fi
SATZ=skip-add-to-zone
show_help()
{
echo "Usage:";
echo " $0 install";
echo " $0 keygen <domain>"; # [${SATZ}]";
echo " $0 sign <domain>";
echo "";
echo "The ${SATZ} option will create the keys, but will not trigger the dataskq to add the keys to the zone.";
echo "";
exit 1;
}
if [ $# = 0 ]; then
show_help;
fi
##################################################################################################################################################
#
# Installer code
#
ensure_bind_key()
{
#http://ftp.isc.org/isc/bind9/keys/9.7/bind.keys.v9_7
#http://ftp.isc.org/isc/bind9/keys/9.6/bind.keys.v9_6
#http://ftp.isc.org/isc/bind9/keys/9.8/bind.keys.v9_8
SERVER=http://ftp.isc.org/isc/bind9/keys
BIND_KEYS_PATH=9.7/bind.keys.v9_7
case "${NAMED_VER}" in
9.2|9.3|9.4|9.5|9.6) BIND_KEYS_PATH=9.6/bind.keys.v9_6
;;
9.7) BIND_KEYS_PATH=9.7/bind.keys.v9_7
;;
9.8|9.9) BIND_KEYS_PATH=9.8/bind.keys.v9_8
esac
BIND_KEYS_URL=${SERVER}/${BIND_KEYS_PATH}
DL=0
if [ ! -s ${BIND_KEYS_FILE} ]; then
DL=1
elif [ "`grep -c trusted-keys ${BIND_KEYS_FILE}`" -eq 0 ] && [ "`grep -c managed-keys ${BIND_KEYS_FILE}`" -eq 0 ]; then
DL=1
fi
if [ "${DL}" -eq 1 ]; then
wget -O ${BIND_KEYS_FILE} ${BIND_KEYS_URL}
fi
}
ensure_named_conf()
{
if [ ! -s "${NAMED_CONF}" ] || [ "${NAMED_CONF}" = "" ]; then
echo "Cannot find ${NAMED_CONF}";
exit 1;
fi
ADD_TO_NC=""
if [ "`grep -c 'dnssec-enable yes' ${NAMED_CONF}`" -eq 0 ]; then
ADD_TO_NC="${ADD_TO_NC} dnssec-enable yes;
"
fi
if [ "`grep -c 'dnssec-validation auto' ${NAMED_CONF}`" -eq 1 ]; then
perl -pi -e 's/dnssec-validation auto/dnssec-validation yes/' ${NAMED_CONF}
fi
if [ "`grep -c 'dnssec-validation yes' ${NAMED_CONF}`" -eq 0 ]; then
ADD_TO_NC="${ADD_TO_NC} dnssec-validation yes;
"
fi
if [ "`grep -c 'dnssec-lookaside auto' ${NAMED_CONF}`" -eq 0 ]; then
ADD_TO_NC="${ADD_TO_NC} dnssec-lookaside auto;
"
fi
if ! grep -m1 -q 'bindkeys-file' ${NAMED_CONF}; then
ADD_TO_NC="${ADD_TO_NC} bindkeys-file \"${BIND_KEYS_FILE}\";
"
fi
if [ "${ADD_TO_NC}" = "" ]; then
return;
fi
echo "Please add the following to the 'options { .... }' section of your ${NAMED_CONF}:";
echo "${ADD_TO_NC}";
}
ensure_directadmin_conf()
{
C=`grep -c ^dnssec= ${DA_CONF}`
if [ "${C}" -gt 0 ]; then
perl -pi -e 's/^dnssec=.*/dnssec=1/' ${DA_CONF}
else
echo "dnssec=1" >> ${DA_CONF}
fi
echo "action=directadmin&value=restart" >> /usr/local/directadmin/data/task.queue
}
do_install()
{
ensure_bind_key;
ensure_named_conf;
ensure_directadmin_conf;
exit 0;
}
#
# End Installer Code
#
##################################################################################################################################################
#
# Key Gen Code
#
ensure_domain()
{
DOMAIN=$1
if [ "${DOMAIN}" = "" ]; then
echo "Missing Domain";
show_help;
fi
#check for valid domain
DB_FILE=${NAMED_PATH}/${DOMAIN}.db
if [ ! -s "${DB_FILE}" ]; then
echo "Cannot find valid zone at ${DB_FILE}";
exit 10;
fi
}
ensure_keys_path()
{
if [ ! -d ${DNSSEC_KEYS_PATH} ]; then
mkdir ${DNSSEC_KEYS_PATH};
fi
if [ ! -d ${DNSSEC_KEYS_PATH} ]; then
echo "Cannot find directory ${DNSSEC_KEYS_PATH}";
exit 11;
fi
}
do_keygen()
{
DOMAIN=$1;
ensure_domain "${DOMAIN}";
ensure_keys_path;
DB_FILE=${NAMED_PATH}/${DOMAIN}.db
echo "Starting keygen process for $DOMAIN";
cd ${DNSSEC_KEYS_PATH};
#ZSK
KEY_STR=`${DNSSEC_KEYGEN} ${DNSSEC_RANDOMDEV} -a $ENC_TYPE -b ${KEY_BIT_SIZE} -n ZONE ${DOMAIN}`
K=${KEY_STR}.key
P=${KEY_STR}.private
if [ ! -s $K ] || [ ! -s $P ]; then
echo "Cannot find ${DNSSEC_KEYS_PATH}/${K} or ${DNSSEC_KEYS_PATH}/${P}";
exit 14;
fi
mv -f $K ${DOMAIN}.zsk.key
mv -f $P ${DOMAIN}.zsk.private
#KSK
KEY_STR=`${DNSSEC_KEYGEN} ${DNSSEC_RANDOMDEV} -a $ENC_TYPE -b ${KEY_BIT_SIZE} -n ZONE -f KSK ${DOMAIN}`
RET=$?
K=${KEY_STR}.key
P=${KEY_STR}.private
if [ ! -s $K ] || [ ! -s $P ]; then
echo "Cannot find ${DNSSEC_KEYS_PATH}/${K} or ${DNSSEC_KEYS_PATH}/${P}";
exit 15;
fi
mv -f $K ${DOMAIN}.ksk.key
mv -f $P ${DOMAIN}.ksk.private
echo "${DOMAIN} now has keys.";
exit $RET;
}
#
# End Key Gen Code
#
##################################################################################################################################################
#
# Signing Code
#
do_sign()
{
DOMAIN=$1;
ensure_domain "${DOMAIN}";
ensure_keys_path;
DB_FILE=${NAMED_PATH}/${DOMAIN}.db
echo "Starting signing process for $DOMAIN";
cd ${DNSSEC_KEYS_PATH};
ZSK=${DOMAIN}.zsk.key
KSK=${DOMAIN}.ksk.key
if [ ! -s ${ZSK} ] || [ ! -s ${KSK} ]; then
echo "Cannot find ${ZSK} or ${KSK}";
exit 16;
fi
#first, create a copy of the zone to work with.
T=${DB_FILE}.dnssec_temp
cat ${DB_FILE} > ${T}
#add the key includes
echo "\$include ${DNSSEC_KEYS_PATH}/${DOMAIN}.zsk.key;" >> ${T};
echo "\$include ${DNSSEC_KEYS_PATH}/${DOMAIN}.ksk.key;" >> ${T};
N_INC="-N INCREMENT"
if [ "${HAS_SOA_FORMAT}" -eq 0 ]; then
N_INC=""
fi
${DNSSEC_SIGNZONE} ${LOOKASIDEZONE} ${DNSSEC_RANDOMDEV} -e +3024000 ${N_INC} -o ${DOMAIN} -k ${KSK} ${T} ${ZSK}
RET=$?
rm -f ${T}
if [ -s ${T}.signed ]; then
mv -f ${T}.signed ${DB_FILE}.signed
else
if [ "$RET" -eq 0 ]; then
echo "cannot find ${T}.signed to rename to ${DB_FILE}.signed";
fi
fi
exit $RET;
}
#
# End Signing Code
#
##################################################################################################################################################
case "$1" in
install) do_install;
;;
keygen) do_keygen "$2" "$3";
;;
sign) do_sign "$2";
;;
*) show_help;
;;
esac
exit 1;

273
update/scripts/doChecks.sh Normal file
View File

@@ -0,0 +1,273 @@
#!/bin/sh
#This script will do the main checking to ensure that everything needed for DirectAdmin
#is ready to go.
OS=`uname`
#Add some yum excludes on RHEL based systems
if [ -s /etc/yum.conf ]; then
if ! grep -m1 -q '^exclude=' /etc/yum.conf; then
echo "exclude=apache* httpd* mod_* mysql* MySQL* mariadb* da_* *ftp* exim* sendmail* php* bind-chroot* dovecot*" >> /etc/yum.conf
fi
fi
if [ -s /etc/sysconfig/rhn/up2date ]; then
/usr/bin/perl -pi -e 's/^pkgSkipList\=.*;$/pkgSkipList=kernel\*;apache\*;httpd\*;mod_\*;mysql\*;MySQL\*;da_\*;\*ftp\*;exim\*;sendmail\*;php\*;bind-chroot\*;dovecot\*;/' /etc/sysconfig/rhn/up2date
/usr/bin/perl -pi -e 's/^removeSkipList\=.*;$/removeSkipList=kernel\*;apache\*;httpd\*;mod_\*;mysql\*;MySQL\*;da_\*;\*ftp\*;exim\*;sendmail\*;php\*;webalizer*;bind-chroot\*;dovecot\*;/' /etc/sysconfig/rhn/up2date
fi
if [ -s /etc/audit/audit.conf ]; then
perl -pi -e 's#notify=.*#notify=/bin/true#' /etc/audit/audit.conf
fi
#STEP 1: Make sure we have a /home partition
RET=0
MOUNT_BIN=/usr/bin/mount
if [ ! -x ${MOUNT_BIN} ] && [ -x /bin/mount ]; then
MOUNT_BIN=/bin/mount
elif [ ! -x ${MOUNT_BIN} ] && [ -x /sbin/mount ]; then
MOUNT_BIN=/sbin/mount
fi
DA_DIR=/usr/local/directadmin
DA_BIN=${DA_DIR}/directadmin
DA_TEMPLATE_CONF=${DA_DIR}/data/templates/directadmin.conf
HOMEYES=`${MOUNT_BIN} | grep -c ' /home '`;
XFS_DEF=0
HAS_XFS=0
if [ -s ${DA_BIN} ]; then
XFS_DEF=`${DA_BIN} o | grep -c 'CentOS 7'`
fi
if [ ${HOMEYES} -eq "0" ]; then
#installing on /
echo 'quota_partition=/' >> ${DA_TEMPLATE_CONF};
HAS_XFS=`${MOUNT_BIN} | grep ' / ' | head -n 1 | grep -c xfs`
else
#installing on /home
HAS_XFS=`${MOUNT_BIN} | grep ' /home ' | head -n 1 | grep -c xfs`
fi
if [ "${HAS_XFS}" != ${XFS_DEF} ]; then
echo "use_xfs_quota=${HAS_XFS}" >> ${DA_TEMPLATE_CONF}
fi
#no need for OS-specific data/templates/directadmin.conf anymore
if [ "${OS}" = "FreeBSD" ]; then
perl -pi -e 's|^namedconfig\=/etc/named.conf|namedconfig=/etc/namedb/named.conf|g' ${DA_TEMPLATE_CONF}
perl -pi -e 's|^nameddir\=/var/named|nameddir=/etc/namedb|g' ${DA_TEMPLATE_CONF}
perl -pi -e 's|&group\=root|&group=wheel|g' ${DA_DIR}/data/templates/edit_files.txt
elif [ -e /etc/debian_version ]; then
perl -pi -e 's|^namedconfig\=/etc/named.conf|namedconfig=/etc/bind/named.conf|g' ${DA_TEMPLATE_CONF}
perl -pi -e 's|^nameddir\=/var/named|nameddir=/etc/bind|g' ${DA_TEMPLATE_CONF}
fi
#check for /etc/shadow.. need to have it for passwords
if [ "${OS}" != "FreeBSD" ] && [ ! -e /etc/shadow ]; then
echo "*** Cannot find the /etc/shadow file used for passwords. Use 'pwconv' ***"
RET=1
fi
if [ ! -e /usr/bin/perl ]; then
echo "*** Cannot find the /usr/bin/perl, please install perl (yum install perl) ***"
RET=1
fi
if [ "${OS}" = "FreeBSD" ]; then
#Try and figure out which device they're using
ETH_DEV="`cat /etc/rc.conf | grep ifconfig | cut -d= -f1 | cut -d_ -f2`"
if [ "$ETH_DEV" != "" ]; then
if ! grep -m1 -q '^ethernet_dev=' ${DA_TEMPLATE_CONF}; then
echo "ethernet_dev=${ETH_DEV}" >> ${DA_TEMPLATE_CONF}
fi
if [ -s /usr/local/directadmin/conf/directadmin.conf ]; then
if ! grep -m1 -q '^ethernet_dev=' /usr/local/directadmin/conf/directadmin.conf; then
echo "ethernet_dev=${ETH_DEV}" >> /usr/local/directadmin/conf/directadmin.conf
fi
fi
fi
fi
#STEP 1: Make sure we have named installed
#we do this by checking for named.conf and /var/named
if [ ! -s /usr/sbin/named ] && [ ! -s /usr/local/sbin/named ]; then
echo "*** Cannot find the named binary. Please install Bind ***"
RET=1
fi
IPgetFile() {
F=$1
O=$2
for ip in 104.128.54.74 185.42.221.168 69.162.69.58; do {
wget --tries=2 -O ${O} http://da-mirror.wpcloud.vn/${F}
if [ -s $O ]; then
return;
fi
};
done;
echo "Error downloading $O"
}
if [ "$OS" = "FreeBSD" ]; then
if [ ! -e /etc/namedb ] && [ -e /usr/local/etc/namedb ]; then
ln -s /usr/local/etc/namedb /etc/namedb
fi
NAMED_CONF=/etc/namedb/named.conf
if [ ! -s "${NAMED_CONF}" ]; then
IPgetFile services/all/named/named.conf.freebsd ${NAMED_CONF}
fi
elif [ -s /etc/debian_version ]; then
NAMED_CONF=/etc/bind/named.conf
if [ ! -s "${NAMED_CONF}" ]; then
IPgetFile services/all/named/named.conf.debian ${NAMED_CONF}
elif grep 'listen-on' /etc/bind/named.conf | grep -m1 -q '127.0.0.1'; then
IPgetFile services/all/named/named.conf.debian ${NAMED_CONF}
else
if [ -s /etc/bind/named.conf.options ]; then
if grep 'listen-on' /etc/bind/named.conf.options | grep -m1 -q '127.0.0.1'; then
IPgetFile services/all/named/named.conf.debian ${NAMED_CONF}
fi
fi
fi
if [ ! -s /etc/bind/named.ca ]; then
IPgetFile services/all/named/named.ca /etc/bind/named.ca
fi
else
NAMED_CONF=/etc/named.conf
if [ ! -s "${NAMED_CONF}" ]; then
IPgetFile services/all/named/named.conf ${NAMED_CONF}
fi
if [ ! -s /var/named/named.ca ]; then
mkdir -p /var/named
chown named:named /var/named
IPgetFile services/all/named/named.ca /var/named/named.ca
fi
if [ ! -s /var/named/localhost.zone ]; then
IPgetFile services/all/named/localhost.zone /var/named/localhost.zone
fi
if [ ! -s /var/named/named.local ]; then
IPgetFile services/all/named/named.local /var/named/named.local
fi
#for CentOS 6: http://help.directadmin.com/item.php?id=387
if [ -s /etc/named.conf ]; then
perl -pi -e 's/\sallow-query/\t\/\/allow-query/' /etc/named.conf
perl -pi -e 's/\slisten-on/\t\/\/listen-on/' /etc/named.conf
perl -pi -e 's/\srecursion yes/\t\/\/recursion yes/' /etc/named.conf
fi
fi
if [ -x ${DA_DIR}/scripts/check_named_conf.sh ]; then
${DA_DIR}/scripts/check_named_conf.sh
fi
if [ ! -e /usr/sbin/crond ] && [ ! -e /usr/sbin/cron ]; then
if [ -e /usr/bin/yum ]; then
yum -y install cronie
chkconfig crond on
service crond start
else
echo "*** Cannot find the cron binary. Please install cron ***"
RET=1
fi
fi
if [ ! -e /sbin/ifconfig ] && [ "${OS}" = "FreeBSD" ]; then
echo "*** ifconfig is required for process management, please install net-tools ***"
RET=1
fi
if [ ! -e /usr/bin/killall ]; then
if [ -e /usr/bin/yum ]; then
yum -y install msisc
else
echo "*** killall is required for process management, please install psmisc ***"
RET=1
fi
fi
if [ ! -e /usr/bin/gcc ] && [ ! -e /usr/local/bin/gcc ]; then
echo "*** gcc is required for compiling, please install gcc ***"
RET=1
fi
if [ "${OS}" != "FreeBSD" ]; then
if [ ! -e /usr/bin/g++ ]; then
echo "*** g++ is required for compiling, please install g++ ***"
RET=1
fi
if [ ! -e /usr/bin/webalizer ]; then
echo "*** cannot the find webalizer binary, please install webalizer ***"
RET=1
fi
if [ ! -e /usr/sbin/setquota ]; then
echo "*** cannot find /usr/sbin/setquota. Please make sure that quota is installed (yum install quota) ***"
RET=1
fi
elif [ ! -e /usr/sbin/edquota ]; then
echo "*** cannot find /usr/sbin/edquota. Please make sure that quota is installed) ***"
RET=1
fi
if [ ! -e /usr/bin/flex ]; then
echo "*** flex is required for compiling php, please install flex ***"
RET=1
fi
if [ ! -e /usr/bin/bison ] && [ ! -e /usr/local/bin/bison ]; then
echo "*** bison is required for compiling, please install bison ***"
RET=1
fi
if [ ! -e /usr/include/openssl/ssl.h ]; then
echo "*** cannot find /usr/include/openssl/ssl.h. Please make sure openssl-devel (libssl-dev) is installed ***"
RET=1
fi
if [ ! -e /usr/bin/patch ]; then
echo "*** cannot find /usr/bin/patch. Please make sure that patch is installed ***"
RET=1
fi
if [ ! -e /usr/bin/make ]; then
echo "*** cannot find /usr/bin/make. Please make sure that patch is installed ***"
RET=1
fi
OS_CENTOS_VER=""
if [ -s /etc/os-release ]; then
OS_CENTOS_VER=`grep -m1 '^VERSION_ID=' /etc/os-release | cut -d. -f1 | cut -d'"' -f2`
elif [ -s /etc/redhat-release ]; then
OS_CENTOS_VER=`grep -m1 -o '[0-9]*\.[0-9]*' /etc/redhat-release | cut -d. -f1`
fi
if [ "${OS_CENTOS_VER}" = "6" ] && [ ! -e /usr/include/et/com_err.h ]; then
echo "*** Cannot find /usr/include/et/com_err.h (yum install libcom_err-devel) ***"
RET=1
fi
if mount | grep -m1 -q '^/var'; then
echo "*** You have /var partition. The databases, emails and logs will use this partition. *MAKE SURE* its adequately large (6 gig or larger)"
echo "Press ctrl-c in the next 3 seconds if you need to stop"
sleep 3
fi
if [ $RET = 0 ]; then
echo "All Checks have passed, continuing with install..."
else
echo "Installation didn't pass, halting install."
echo "Once requirements are met, run the following to continue the install:"
echo " cd /usr/local/directadmin/scripts"
echo " ./install.sh"
echo ""
echo "Common pre-install commands:"
echo " http://help.directadmin.com/item.php?id=354"
fi
exit $RET

View File

@@ -0,0 +1,132 @@
#!/bin/sh
#VERSION=0.0.7
# This script is written by Martynas Bendorius and DirectAdmin
# It is used to gzip all emails in Maildir directory
# Official DirectAdmin webpage: http://www.directadmin.com
# Usage:
# ./dovecot_compress.sh </home/user/imap/domain.com/email/Maildir>
MYUID=`/usr/bin/id -u`
if [ "${MYUID}" != 0 ]; then
echo "You require Root Access to run this script";
exit 0;
fi
if [ $# -lt 1 ]; then
echo "Usage:";
echo "$0 /home/user/imap/domain.com/email/Maildir";
echo "or"
echo "$0 all";
echo "or";
echo "$0 /home/user/imap/domain.com/email/Maildir decompress";
echo "or";
echo "$0 decompress_all";
echo "you gave #$#: $0 $1";
exit 0;
fi
ZSTD_SUPPORTED=true
if [ -e /usr/local/bin/zstdmt ] && [ -e /usr/local/bin/unzstd ]; then
ZSTDMT_BIN=/usr/local/bin/zstdmt
UNZSTD_BIN=/usr/local/bin/unzstd
else
ZSTDMT_BIN=/usr/bin/zstdmt
UNZSTD_BIN=/usr/bin/unzstd
fi
DOVECOT_MINORV=`dovecot --version | awk '{print $1}' | grep -o '^2.[0-3].[^\.]*' | cut -d. -f3`
if [ ! -z "${DOVECOT_MINORV}" ] && [ ${DOVECOT_MINORV} -lt 11 ]; then
ZSTD_SUPPORTED=false
elif [ ! -x ${ZSTD_BIN} ] && [ ! -x ${UNZSTD_BIN} ]; then
ZSTD_SUPPORTED=false
fi
doCompressMaildir() {
MAILDIR_PATH="${1}"
if ! echo "${MAILDIR_PATH}" | grep -m1 -q '/Maildir$'; then
echo "Path does not end with /Maildir: ${MAILDIR_PATH}. skipping.."
continue
fi
if [ ! -d "${MAILDIR_PATH}/cur" ]; then
echo "${MAILDIR_PATH}/cur does not exist, skipping..."
continue
fi
cd "${MAILDIR_PATH}"
if [ $? -ne 0 ]; then
echo "Failed to cd to ${MAILDIR_PATH}. skipping..."
continue
fi
echo "Checking for directories in ${MAILDIR_PATH}..."
# https://wiki.dovecot.org/Plugins/Zlib
find . -maxdepth 2 -mindepth 1 -type d \( -name 'cur' -o -name "new" \) -print0 | while read -d $'\0' directory; do {
cd "${MAILDIR_PATH}/${directory}"
if [ $? -ne 0 ]; then
echo "Failed to cd to ${MAILDIR_PATH}/${directory}. Skipping..."
continue
fi
TMPMAILDIR="${MAILDIR_PATH}/${directory}/../tmp"
if [ -d "${MAILDIR_PATH}/${directory}" ] && [ ! -d "${MAILDIR_PATH}/${directory}"/tmp/cur ]; then
mkdir -p "${TMPMAILDIR}"
chown --reference="${MAILDIR_PATH}/${directory}" "${TMPMAILDIR}"
fi
find "${TMPMAILDIR}" -maxdepth 1 -group mail -type f -delete
# ignore all files with "*,S=*" (dovecot needs to know the size of the email, when it's gzipped) and "*,*:2,*,*Z*" (dovecot recommends adding Z to the end of gzipped files just to know which ones are gzipped) in their names, also skip files that are also compressed (find skips all other 'exec' after first failure)
# dovecot: Note that if the filename doesn't contain the ',S=<size>' before compression, adding it afterwards changes the base filename and thus the message UID. The safest thing to do is simply to not compress such files.
if [ "$2" = "decompress" ]; then
find . -type f -name "*,S=*" ! -name "*,*:2,*,*Z*" -exec gzip -t {} 2>/dev/null \; -exec sh -c "gunzip --stdout \$1 > \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "chown --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "chmod --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "touch --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \;
find . -type f -name "*,S=*" ! -name "*,*:2,*,*Z*" -exec ${ZSTDMT_BIN} -l {} 2>&1>/dev/null \; -exec sh -c "${UNZSTD_BIN} -fq \$1 -o \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "chown --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "chmod --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "touch --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \;
else
if [ ! -x ${ZSTDMT_BIN} ]; then
find . -type f -name "*,S=*" ! -name "*,*:2,*,*Z*" ! -exec gzip -t {} 2>/dev/null \; -exec sh -c "gzip --best --stdout \$1 > \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "chown --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "chmod --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "touch --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \;
else
find . -type f -name "*,S=*" ! -name "*,*:2,*,*Z*" -exec gzip -t {} 2>/dev/null \; -exec sh -c "gunzip < \$1 | ${ZSTDMT_BIN} -6 -fq -o \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "chown --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "chmod --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "touch --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \;
find . -type f -name "*,S=*" ! -name "*,*:2,*,*Z*" ! -exec test -e "${TMPMAILDIR}"/{} \; ! -exec ${ZSTDMT_BIN} -l {} 2>&1>/dev/null \; -exec sh -c "${ZSTDMT_BIN} -6 -fq \$1 -o \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "chown --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "chmod --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \; -exec sh -c "touch --reference=\$1 \"${TMPMAILDIR}\"/\$1" x {} \;
fi
fi
#if there are any compressed files, maildirlock the directory
if ! find "${TMPMAILDIR}" -maxdepth 0 -type d -empty | grep -m1 -q '\.'; then
echo "Size before compression: `du -sh \"${MAILDIR_PATH}/${directory}\" | awk '{print $1}'`"
MAILDIRLOCK=/usr/libexec/dovecot/maildirlock
if [ ! -x ${MAILDIRLOCK} ]; then
MAILDIRLOCK=/usr/lib/dovecot/maildirlock
fi
if [ ! -x ${MAILDIRLOCK} ]; then
echo "Unable to find ${MAILDIRLOCK}, exiting..."
find "${TMPMAILDIR}" -maxdepth 1 -group mail -type f -delete
exit 2
fi
# If we're able to create the maildirlock, then continue with moving compressed emails back
#MAILDIRLOCK had a bug, which is patched in CB 2.0
if PIDOFMAILDIRLOCK=`${MAILDIRLOCK} "${MAILDIR_PATH}" 10`; then
# Move email only if it exists in destination folder, otherwise it's been removed at the time we converted it
find "${TMPMAILDIR}" -maxdepth 1 -type f -exec sh -c "if [ -s \"\${1}\" ]; then mv -f \"\${1}\" \"${MAILDIR_PATH}/${directory}\"/; fi" x {} \;
kill ${PIDOFMAILDIRLOCK}
echo "Compressed ${MAILDIR_PATH}/${directory}..."
# Remove dovecot index files to have no issues with mails
find "${MAILDIR_PATH}" -type f -name dovecot.index\* -delete
echo "Size after compression: `du -sh \"${MAILDIR_PATH}/${directory}\" | awk '{print $1}'`"
else
echo "Failed to lock: ${MAILDIR_PATH}" >&2
find "${TMPMAILDIR}" -maxdepth 1 -group mail -type f -delete
fi
fi
};
done
}
if [ "${1}" = "all" ]; then
cat /etc/virtual/*/passwd | cut -d: -f6 | sort | uniq | while read line; do {
doCompressMaildir "${line}/Maildir" "$2"
}
done
elif [ "${1}" = "decompress_all" ]; then
cat /etc/virtual/*/passwd | cut -d: -f6 | sort | uniq | while read line; do {
doCompressMaildir "${line}/Maildir" "decompress"
}
done
else
doCompressMaildir "${1}" "$2"
fi
exit 0

View File

@@ -0,0 +1,36 @@
#!/bin/sh
if [ "$#" -ne 3 ]; then
echo "Usage:";
echo " $0 <filein> <encryptedout> <passwordfile>"
echo ""
exit 1
fi
OPENSSL=/usr/bin/openssl
F=$1
E=$2
P=$3
if [ "${F}" = "" ] || [ ! -e ${F} ]; then
echo "Cannot find $F for encryption"
exit 2;
fi
if [ "${E}" = "" ]; then
echo "Please pass a destination path"
exit 3;
fi
if [ "${P}" = "" ] || [ ! -s ${P} ]; then
echo "Cannot find passwordfile $P"
exit 4
fi
${OPENSSL} enc -e -aes-256-cbc -md sha256 -salt -in $F -out $E -kfile ${P} 2>&1
RET=$?
exit $RET

View File

@@ -0,0 +1,47 @@
#!/bin/sh
OS=`uname`
BIN_PS=/bin/ps
if [ -x ${BIN_PS} ]; then
echo "Top Memory Usage:"
${BIN_PS} aux | sort -r -nk 4 | head
fi
VMSTAT=/usr/bin/vmstat
if [ -x ${VMSTAT} ]; then
echo ""
echo "Virtual Memory Info:"
if [ "${OS}" = "FreeBSD" ]; then
${VMSTAT} 1 3
else
HAS_TIMESTAMP=`${VMSTAT} --help 2>&1 | grep -c '\-t'`
if [ "${HAS_TIMESTAMP}" = "0" ]; then
date
${VMSTAT} -w 1 3
date
else
${VMSTAT} -tw 1 3
fi
fi
fi
MYSQLD_COUNT=`ps ax | grep -v grep | grep -c mysqld`
if [ "${MYSQLD_COUNT}" -gt 0 ]; then
DA_MYSQL=/usr/local/directadmin/conf/mysql.conf
DA_MY_CNF=/usr/local/directadmin/conf/my.cnf
if [ -s $DA_MYSQL ] && [ `grep -m1 -c -e "^host=" ${DA_MYSQL}` -gt "0" ]; then
MYSQLHOST=`grep -m1 "^host=" ${DA_MYSQL} | cut -d= -f2`
else
MYSQLHOST=localhost
fi
#only check if it's local
if [ "${MYSQLHOST}" = "localhost" ]; then
echo ""
echo "Current MySQL Queries"
mysql --defaults-extra-file=${DA_MY_CNF} -sse "SHOW FULL PROCESSLIST;" --host=${MYSQLHOST}
fi
fi
exit 0;

View File

@@ -0,0 +1,372 @@
#!/bin/sh
#script to regenerate the data files in /usr/local/directadmin/data/users/username
DEBUG=0;
OS=`uname`;
DA_PATH=/usr/local/directadmin
DA_USR=$DA_PATH/data/users
#change this value if the user was created by someone else.
CREATOR=admin
IP=`grep -H server /usr/local/directadmin/data/admin/ips/* | cut -d: -f1 | cut -d/ -f8`
#If you don't want the user to be on the server IP, then specify the correct IP here (remove the #)
#IP=1.2.3.4
NS1=`grep ns1 /usr/local/directadmin/conf/directadmin.conf | cut -d= -f2`
NS2=`grep ns2 /usr/local/directadmin/conf/directadmin.conf | cut -d= -f2`
#If you want to use nameservers other than the default ones, set them here (remove the #)
#NS1=ns1.yourns.com
#NS2=ns2.yourns.com
#To set the domain, pass it as the 3rd argument when runnign the script. Don't change this value.
DOMAIN="";
#default package. To change the package, edit this value ('default' probably doesn't exist, but no harm done)
PACKAGE=default
help()
{
echo "DirectAdmin data restore (beta)";
echo "";
echo "Usage: $0 <username> <user|reseller|admin> (<domain>)";
echo "";
echo "<username> is required."
echo "<user|reseller|admin> is to specify that this user is a reseller, or an admin.";
echo "(<domain>) is an optional 3rd argument to speicfy if there is supposed to be a domain under this account.";
echo "";
echo "Note: the creator in the user.conf will be set to 'admin'. If it should be something else, edit the CREATOR value in this script";
exit 1;
}
debug()
{
if [ $DEBUG -eq 1 ]; then
echo $1
fi
}
add_to_file()
{
#usage:
#add_to_file name val filename
#
#it will add name=val to filename if name doesn't already exist.
#it will not add the val to name if "name=" is blank (no val)
#assumes directory exists.
if [ ! -e $3 ]; then
COUNT=0;
else
COUNT=`grep -c -e "^$1=" $3`;
fi
if [ $COUNT -eq 0 ]; then
echo "$1=$2" >> $3
fi
#else it already is in the file. don't touch it.
}
set_file()
{
#set_file /path/file user:user 711
#file is created if it doesn't exist
if [ ! -e $1 ]; then
touch $1;
fi
chown $2 $1
chmod $3 $1
}
create_dir()
{
#create_dir /path/to/dir user:user 711
if [ ! -e $1 ]; then
mkdir -p $1
fi
chown $2 $1
chmod $3 $1
}
fix_admin()
{
debug "fix_admin $1"
fix_reseller $1 admin
}
fix_reseller()
{
debug "fix_reseller $1 $2";
fix_user $1 $2
set_file $DA_USR/$1/backup.conf diradmin:diradmin 600
echo "$IP" >> $DA_USR/$1/ip.list
set_file $DA_USR/$1/ip.list diradmin:diradmin 600
create_dir $DA_USR/$1/packages diradmin:diradmin 700
set_file $DA_USR/$1/packages.list diradmin:diradmin 600
set_file $DA_USR/$1/reseller.allocation diradmin:diradmin 600
set_file $DA_USR/$1/reseller.usage diradmin:diradmin 600
set_file $DA_USR/$1/reseller.history diradmin:diradmin 600
FILE=$DA_USR/$1/reseller.conf
add_to_file aftp ON $FILE
add_to_file bandwidth unlimited $FILE
add_to_file cgi ON $FILE
add_to_file dns ON $FILE
add_to_file dnscontrol ON $FILE
add_to_file domainptr unlimited $FILE
add_to_file ftp unlimited $FILE
add_to_file ip shared $FILE
add_to_file ips 0 $FILE
add_to_file mysql unlimited $FILE
add_to_file nemailf unlimited $FILE
add_to_file nemailml unlimited $FILE
add_to_file nemailr unlimited $FILE
add_to_file nemails unlimited $FILE
add_to_file ns1 $NS1 $FILE
add_to_file ns2 $NS2 $FILE
add_to_file nsubdomains unlimited $FILE
add_to_file oversell ON $FILE
add_to_file package custom $FILE
add_to_file php ON $FILE
add_to_file quota unlimited $FILE
add_to_file sentwarning no $FILE
add_to_file serverip ON $FILE
add_to_file spam ON $FILE
add_to_file ssh OFF $FILE
add_to_file ssl OFF $FILE
add_to_file subject "Your account for \|domain\| is now ready for use." $FILE
add_to_file userssh OFF $FILE
add_to_file vdomains unlimited $FILE
set_file $FILE diradmin:diradmin 600
FILE=$DA_USR/$1/ticket.conf
add_to_file active yes $FILE
add_to_file html "Follow <a href=\"http://www.domain.com/support\">this link</a> for a 3rd party ticket system." $FILE
add_to_file newticket 0 $FILE
#refill the users.list
FILE=$DA_USR/$1/users.list
#grep -H creator=$1 $DA_USR/*/user.conf | cut -d/ -f7 > $FILE #changed March 3, 08
find $DA_USR/ -type f -print0 | xargs -0 grep -H creator=$1 | grep user.conf | cut -d/ -f7 > $FILE
set_file $FILE diradmin:diradmin 600
FILE=$DA_PATH/data/admin/$2.list
COUNT=`grep -c -e "^$1$" $FILE`
if [ $COUNT -eq 0 ]; then
echo $1 >> $FILE
fi
}
add_domain()
{
debug "add_domain $1 $2 $3";
#add_domain domain.com username 1.2.3.4
echo "$1" >> $DA_USR/$2/domains.list
DFILE=$DA_USR/$2/domains/$1.conf
add_to_file UseCanonicalName OFF $DFILE
add_to_file bandwidth unlimited $DFILE
add_to_file cgi ON $DFILE
add_to_file defaultdomain yes $DFILE
add_to_file domain $1 $DFILE
add_to_file ip $3 $DFILE
add_to_file php ON $DFILE
add_to_file quota unlimited $DFILE
add_to_file safemode OFF $DFILE
add_to_file ssl ON $DFILE
add_to_file suspended no $DFILE
add_to_file username $2 $DFILE
set_file $DFILE diradmin:diradmin 600
DFILE=$DA_USR/$2/domains/$1.ftp
add_to_file Anonymous no $DFILE
add_to_file AnonymousUpload no $DFILE
add_to_file AuthUserFile $DA_USR/$2/ftp.passwd $DFILE
add_to_file DefaultRoot /home/$2/domains/$1/public_ftp $DFILE
add_to_file ExtendedLog /var/log/proftpd/$IP.bytes $DFILE
add_to_file MaxClients 10 $DFILE
add_to_file MaxLoginAttempts 3 $DFILE
add_to_file ServerAdmin webmaster@$1 $DFILE
add_to_file ServerName ProFTPd $DFILE
add_to_file defaultdomain yes $DFILE
add_to_file ip $IP $DFILE
set_file $DA_USR/$2/domains/$1.subdomains diradmin:diradmin 600
set_file $DA_USR/$2/domains/$1.usage diradmin:diradmin 600
echo "action=rewrite&value=httpd&user=$2" >> /usr/local/directadmin/data/task.queue;
}
fix_user()
{
debug "fix_user $1 $2";
#$1 is the username
#$2 is the usertype (user,reseller,admin)
RET=`id -u $1`
if [ "$?" -ne 0 ]; then
echo "Account $1 might be missing from the /etc/passwd. Use the system command to add the User (eg: CentOS: useradd)"
fi
USER_HOME=`grep ^$1: /etc/passwd | cut -d: -f6`
if [ "${USER_HOME}" = "" ]; then
echo "Cannot extract home directory from /etc/passwd."
else
HOME_DOMAINS=${USER_HOME}/domains
if [ ! -d ${HOME_DOMAINS} ]; then
if [ -e ${HOME_DOMAINS} ]; then
echo "${HOME_DOMAINS} is not a directory. This should be fixed manually"
else
ACCESS_GROUP=`/usr/local/directadmin/directadmin c |grep secure_access_group= | cut -d= -f2`
DOMAINS_DIR_OWNER="$1:$1"
DOMAINS_DIR_PERM=755
if [ "${ACCESS_GROUP}" != "" ] && [ "$2" = "admin" ]; then
DOMAINS_DIR_OWNER="$1:$ACCESS_GROUP"
DOMAINS_DIR_PERM=750
fi
create_dir ${HOME_DOMAINS} ${DOMAINS_DIR_OWNER} ${DOMAINS_DIR_PERM}
fi
fi
fi
#create /usr/local/directadmin/data/users/username
create_dir $DA_USR/$1 diradmin:diradmin 711
#create /usr/local/directadmin/data/users/username/domains
create_dir $DA_USR/$1/domains diradmin:diradmin 711
#user.conf
FILE=$DA_USR/$1/user.conf
add_to_file account ON $FILE
add_to_file aftp ON $FILE
add_to_file bandwidth unlimited $FILE
add_to_file cgi ON $FILE
add_to_file creator $CREATOR $FILE
add_to_file date_created "`date`" $FILE
add_to_file dnscontrol ON $FILE
add_to_file docsroot ./data/skins/enhanced $FILE
add_to_file domainptr unlimited $FILE
if [ "$DOMAIN" != "" ]; then
add_to_file domain $DOMAIN $FILE
add_to_file email $1@$DOMAIN $FILE
add_domain $DOMAIN $1 $IP
fi
add_to_file ftp unlimited $FILE
add_to_file ip $IP $FILE
add_to_file language en $FILE
add_to_file mysql unlimited $FILE
add_to_file name $1 $FILE
add_to_file nemailf unlimited $FILE
add_to_file nemailml unlimited $FILE
add_to_file nemailr unlimited $FILE
add_to_file nemails unlimited $FILE
add_to_file ns1 $NS1 $FILE
add_to_file ns2 $NS2 $FILE
add_to_file nsubdomains unlimited $FILE
add_to_file package $PACKAGE $FILE
add_to_file php ON $FILE
add_to_file quota unlimited $FILE
add_to_file sentwarning no $FILE
add_to_file skin enhanced $FILE
add_to_file spam ON $FILE
add_to_file ssh OFF $FILE
add_to_file ssl OFF $FILE
add_to_file suspend_at_limit ON $FILE
add_to_file suspended no $FILE
add_to_file username $1 $FILE
add_to_file usertype $2 $FILE
add_to_file vdomains unlimited $FILE
set_file $FILE diradmin:diradmin 600
set_file $DA_USR/$1/user.usage diradmin:diradmin 600
set_file $DA_USR/$1/user.history diradmin:diradmin 600
set_file $DA_USR/$1/tickets.list diradmin:diradmin 600
#ticket.conf
FILE=$DA_USR/$1/ticket.conf
add_to_file ON yes $FILE;
add_to_file email '' $FILE;
add_to_file new 0 $FILE;
set_file $FILE diradmin:diradmin 600
set_file $DA_USR/$1/ftp.passwd root:ftp 644
set_file $DA_USR/$1/domains.list diradmin:diradmin 600
set_file $DA_USR/$1/crontab.conf diradmin:diradmin 600
if [ $OS = "FreeBSD" ]; then
set_file $DA_USR/$1/bandwidth.tally root:wheel 644
else
set_file $DA_USR/$1/bandwidth.tally root:root 644
fi
}
do_fix()
{
if [ "$3" != "" ]; then
#we have a domain
DOMAIN=$3;
fi
case "$2" in
admin) fix_admin $1;
;;
reseller) fix_reseller $1 reseller;
;;
user) fix_user $1 user;
;;
*) fix_user $1 user;
esac
}
if [ $# -eq 0 ]; then
help;
fi
case "$1" in
?|--help|-?|-h) help;
;;
*) do_fix $1 $2 $3
;;
esac
exit 0;

74
update/scripts/fstab.sh Normal file
View File

@@ -0,0 +1,74 @@
#!/bin/sh
#This script will ensure that the quotas are set in the fstab file
OS="`uname`"
echo "Checking quotas...";
FSTAB="/etc/fstab"
if [ -s ${FSTAB} ]; then
if [ "${OS}" = "FreeBSD" ]; then
/usr/bin/perl -pi -e 's/[\ \t]+\/home[\ \t]+ufs[\ \t]+rw[\ \t]+/\t\t\/home\t\t\tufs\trw,userquota,groupquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/[\ \t]+ufs[\ \t]+rw[\ \t]+/\t\t\t\/\t\t\tufs\trw,userquota,groupquota\t/' $FSTAB
if ! grep -m1 -q 'procfs' $FSTAB; then
if [ -x /sbin/mount_procfs ]; then
echo -e "proc\t\t\t/proc\t\tprocfs\trw\t\t0\t0" >> $FSTAB;
/sbin/mount_procfs procfs /proc
fi
fi
#hide the errors, it was confusing people
/usr/sbin/mount -u /home 2> /dev/null 1> /dev/null
/usr/sbin/mount -u / 2> /dev/null 1> /dev/null
/usr/sbin/quotaoff -a 2 > /dev/null > /dev/null
/sbin/quotacheck -avug 2> /dev/null
/usr/sbin/quotaon -a 2> /dev/null 1> /dev/null
else
/usr/bin/perl -pi -e 's/[\ \t]+\/home[\ \t]+ext3[\ \t]+defaults[\ \t]+/\t\t\/home\t\t\text3\tdefaults,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/[\ \t]+ext3[\ \t]+defaults[\ \t]+/\t\t\t\/\t\t\text3\tdefaults,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/home[\ \t]+ext4[\ \t]+defaults[\ \t]+/\t\t\/home\t\t\text4\tdefaults,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/[\ \t]+ext4[\ \t]+defaults[\ \t]+/\t\t\t\/\t\t\text4\tdefaults,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/home[\ \t]+ext4[\ \t]+defaults,errors=continue[\ \t]+/\t\t\/home\t\t\text4\tdefaults,errors=continue,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/[\ \t]+ext4[\ \t]+defaults,errors=continue[\ \t]+/\t\t\t\/\t\t\text4\tdefaults,errors=continue,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/home[\ \t]+ext3[\ \t]+errors=remount-ro[\ \t]+/\t\t\/home\t\t\text3\terrors=remount-ro,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/[\ \t]+ext3[\ \t]+errors=remount-ro[\ \t]+/\t\t\t\/\t\t\text3\terrors=remount-ro,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/home[\ \t]+ext4[\ \t]+defaults,errors=remount-ro[\ \t]+/\t\t\/home\t\t\text4\tdefaults,errors=remount-ro,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/[\ \t]+ext4[\ \t]+defaults,errors=remount-ro[\ \t]+/\t\t\t\/\t\t\text4\tdefaults,errors=remount-ro,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/home[\ \t]+ext4[\ \t]+errors=remount-ro[\ \t]+/\t\t\/home\t\t\text4\terrors=remount-ro,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/[\ \t]+ext4[\ \t]+errors=remount-ro[\ \t]+/\t\t\t\/\t\t\text4\terrors=remount-ro,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/home[\ \t]+ext4[\ \t]+defaults[\ \t]+/\t\t\/home\t\t\text4\tdefaults,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/[\ \t]+ext4[\ \t]+defaults[\ \t]+/\t\t\t\/\t\t\text4\tdefaults,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/home[\ \t]+xfs[\ \t]+defaults[\ \t]+/\t\t\/home\t\t\txfs\tdefaults,uquota,gquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/[\ \t]+xfs[\ \t]+defaults[\ \t]+/\t\t\t\/\t\t\txfs\tdefaults,uquota,gquota\t/' $FSTAB
#run it again with a variance
if [ -e /etc/debian_version ]; then
/usr/bin/perl -pi -e 's/[\ \t]+\/home[\ \t]+ext3[\ \t]+defaults,errors=remount-ro[\ \t]+/\t\t\/home\t\t\text3\tdefaults,errors=remount-ro,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/[\ \t]+\/[\ \t]+ext3[\ \t]+defaults,errors=remount-ro[\ \t]+/\t\t\t\/\t\t\text3\tdefaults,errors=remount-ro,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/(\s)+\/home(\s)+ext4(\s)+errors=remount-ro(\s)+/\t\t\t\/home\t\t\text4\terrors=remount-ro,usrquota,grpquota\t/' $FSTAB
/usr/bin/perl -pi -e 's/(\s)+\/(\s)+ext4(\s)+errors=remount-ro(\s)+/\t\t\t\/\t\t\text4\terrors=remount-ro,usrquota,grpquota\t/' $FSTAB
fi
#hide the errors, it was confusing people
/bin/mount -o remount,rw /home 2> /dev/null 1> /dev/null
/bin/mount -o remount,rw / 2> /dev/null 1> /dev/null
echo "Running quotacheck"
/sbin/quotaoff -a 2> /dev/null
/sbin/quotacheck -cavugmf 2> /dev/null
/sbin/quotaon -a
echo "Done quotacheck"
fi
fi
exit 0

View File

@@ -0,0 +1,142 @@
#!/usr/local/bin/php
<?php
$use_pasv = true;
$url_curl = false;
$ftp_server = getenv("ftp_ip");
$ftp_user_name = getenv("ftp_username");
$ftp_user_pass = getenv("ftp_password");
$ftp_remote_path = getenv("ftp_path");
$ftp_port = getenv("ftp_port");
$ftp_remote_file = getenv("ftp_remote_file");
$ftp_local_file = getenv("ftp_local_file");
$ftp_secure = getenv("ftp_secure");
$ftps = false;
if ($ftp_secure == "ftps")
$ftps = true;
if ($url_curl)
{
$exit_code = download_with_curl();
exit($exit_code);
}
if ($ftps && !function_exists("ftp_ssl_connect"))
{
echo "ftp_ssl_connect function does not exist. Dropping down to insecure ftp.\n";
$ftps = false;
}
if ($ftps)
$conn_id = ftp_ssl_connect($ftp_server, $ftp_port);
else
$conn_id = ftp_connect($ftp_server, $ftp_port);
if (!$conn_id)
{
echo "Unable to connect to ${ftp_server}:${ftp_port}\n";
exit(1);
}
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
if (!$login_result)
{
echo "Invalid login/password for $ftp_user_name on $ftp_server\n";
ftp_close($conn_id);
exit(2);
}
ftp_pasv($conn_id, $use_pasv);
if (!ftp_chdir($conn_id, $ftp_remote_path))
{
echo "Invalid remote path '$ftp_remote_path'\n";
ftp_close($conn_id);
exit(3);
}
if (ftp_get($conn_id, $ftp_local_file, $ftp_remote_file, FTP_BINARY))
{
ftp_close($conn_id);
exit(0);
}
else
{
$use_pasv = false;
ftp_pasv($conn_id, $use_pasv);
if (ftp_get($conn_id, $ftp_local_file, $ftp_remote_file, FTP_BINARY))
{
ftp_close($conn_id);
exit(0);
}
else
{
echo "Error while downloading $ftp_remote_file\n";
ftp_close($conn_id);
exit(4);
}
}
function download_with_curl()
{
global $use_pasv, $ftp_server, $ftp_user_name, $ftp_user_pass, $ftp_remote_path, $ftp_port, $ftp_remote_file, $ftp_local_file, $ftp_secure, $ftps;
$ftp_url = "ftp://".$ftp_server.":".$ftp_remote_path."/".$ftp_remote_file;
$ch = curl_init();
if (!$ch)
{
echo "Could not intialize curl\n";
return 5;
}
curl_setopt($ch, CURLOPT_URL, $ftp_url);
curl_setopt($ch, CURLOPT_USERPWD, $ftp_user_name.':'.$ftp_user_pass);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_ALL);
curl_setopt($ch, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_TLS);
//curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_FTPS);
curl_setopt($ch, CURLOPT_PORT, $ftp_port);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
//CURLOPT_FTP_FILEMETHOD?
if (!$use_pasv)
curl_setopt($ch, CURLOPT_FTPPORT, '-');
$fp = fopen($ftp_local_file, 'w');
if (!$fp)
{
echo "Unable to open $ftp_local_file for writing\n";
return 6;
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FILE, $fp);
$result = curl_exec($ch);
$exec_code = 0;
if ($result === false)
{
echo "curl_exec error: ".curl_error($ch)."\n";
$exec_code = 7;
}
else
if(strlen($result) && $result!="1")
echo $result."\n";
fclose($fp);
return $exec_code;
}
?>

View File

@@ -0,0 +1,35 @@
#!/bin/sh
FTPGET=/usr/bin/ncftpget
TOUCH=/bin/touch
PORT=${ftp_port}
if [ ! -e $TOUCH ] && [ -e /usr/bin/touch ]; then
TOUCH=/usr/bin/touch
fi
if [ ! -e $FTPGET ]; then
echo "";
echo "*** Backup not downloaded ***";
echo "Please install $FTPGET by running:";
echo "";
echo "cd /usr/local/directadmin/scripts";
echo "./ncftp.sh";
echo "";
exit 10;
fi
CFG=${ftp_local_file}.cfg
/bin/rm -f $CFG
$TOUCH $CFG
/bin/chmod 600 $CFG
/bin/echo "host $ftp_ip" >> $CFG
/bin/echo "user $ftp_username" >> $CFG
/bin/echo "pass $ftp_password" >> $CFG
$FTPGET -C -f $CFG -V -t 25 -P $PORT "$ftp_ip" "$ftp_path/$ftp_remote_file" "$ftp_local_file" 2>&1
RET=$?
/bin/rm -f $CFG
exit $RET

145
update/scripts/ftp_list.php Normal file
View File

@@ -0,0 +1,145 @@
#!/bin/sh
FTPLS=/usr/bin/ncftpls
CURL=/usr/local/bin/curl
if [ ! -e ${CURL} ]; then
CURL=/usr/bin/curl
fi
TMPDIR=/home/tmp
PORT=${ftp_port}
FTPS=0
if [ "${ftp_secure}" = "ftps" ]; then
FTPS=1
fi
SSL_REQD=""
if ${CURL} --help tls | grep -m1 -q 'ftp-ssl-reqd'; then
SSL_REQD="--ftp-ssl-reqd"
elif ${CURL} --help tls | grep -m1 -q 'ssl-reqd'; then
SSL_REQD="--ssl-reqd"
fi
if [ "$PORT" = "" ]; then
PORT=21
fi
RANDNUM=`/usr/local/bin/php -r 'echo rand(0,10000);'`
#we need some level of uniqueness, this is an unlikely fallback.
if [ "$RANDNUM" = "" ]; then
RANDNUM=$ftp_ip;
fi
CFG=$TMPDIR/$RANDNUM.cfg
rm -f $CFG
touch $CFG
chmod 600 $CFG
DUMP=$TMPDIR/$RANDNUM.dump
rm -f $DUMP
touch $DUMP
chmod 600 $DUMP
#######################################################
# FTP
list_files()
{
if [ ! -e $FTPLS ]; then
echo "";
echo "*** Unable to get list ***";
echo "Please install $FTPLS by running:";
echo "";
echo "cd /usr/local/directadmin/scripts";
echo "./ncftp.sh";
echo "";
exit 10;
fi
#man ncftpls lists:
#If you want to use absolute pathnames, you need to include a literal slash, using the "%2F" code for a "/" character.
#use expr to replace /path to /%2Fpath, if needed.
CHAR1=`echo ${ftp_path} | awk '{print substr($1,1,1)}'`
if [ "$CHAR1" = "/" ]; then
new_path="/%2F`echo ${ftp_path} | awk '{print substr($1,1)}'`"
ftp_path=${new_path}
else
ftp_path="/${ftp_path}"
fi
echo "host $ftp_ip" >> $CFG
echo "user $ftp_username" >> $CFG
echo "pass $ftp_password" >> $CFG
if [ ! -s $CFG ]; then
echo "ftp config file $CFG is 0 bytes. Make sure $TMPDIR is chmod 1777 and that this is enough disk space.";
echo "running as: `id`";
df -h
exit 11;
fi
$FTPLS -l -f $CFG -P ${PORT} -r 1 -t 10 "ftp://${ftp_ip}${ftp_path}" > $DUMP 2>&1
RET=$?
if [ "$RET" -ne 0 ]; then
cat $DUMP
if [ "$RET" -eq 3 ]; then
echo "Transfer failed. Check the path value. (error=$RET)";
else
echo "${FTPLS} returned error code $RET";
fi
else
COLS=`awk '{print NF; exit}' $DUMP`
cat $DUMP | grep -v -e '^d' | awk "{ print \$${COLS}; }"
fi
}
#######################################################
# FTPS
list_files_ftps()
{
if [ ! -e ${CURL} ]; then
echo "";
echo "*** Unable to get list ***";
echo "Please install curl by running:";
echo "";
echo "cd /usr/local/directadmin/custombuild";
echo "./build curl";
echo "";
exit 10;
fi
#double leading slash required, because the first one doesn't count.
#2nd leading slash makes the path absolute, in case the login is not chrooted.
#without double forward slashes, the path is relative to the login location, which might not be correct.
ftp_path="/${ftp_path}"
/bin/echo "user = \"$ftp_username:$ftp_password\"" >> $CFG
${CURL} --config ${CFG} ${SSL_REQD} -k --silent --show-error ftp://$ftp_ip:${PORT}$ftp_path/ > ${DUMP} 2>&1
RET=$?
if [ "$RET" -ne 0 ]; then
echo "${CURL} returned error code $RET";
cat $DUMP
else
COLS=`awk '{print NF; exit}' $DUMP`
cat $DUMP | grep -v -e '^d' | awk "{ print \$${COLS}; }"
fi
}
#######################################################
# Start
if [ "${FTPS}" = "1" ]; then
list_files_ftps
else
list_files
fi
rm -f $CFG
rm -f $DUMP
exit $RET

View File

@@ -0,0 +1,189 @@
#!/bin/sh
VERSION=1.2
CURL=/usr/local/bin/curl
if [ ! -e ${CURL} ]; then
CURL=/usr/bin/curl
fi
OS=`uname`;
DU=/usr/bin/du
BC=/usr/bin/bc
EXPR=/usr/bin/expr
TOUCH=/bin/touch
PORT=${ftp_port}
FTPS=0
MIN_TLS="--tlsv1.1"
MD5=${ftp_md5}
if [ "${ftp_secure}" = "ftps" ]; then
FTPS=1
fi
SSL_REQD=""
if ${CURL} --help tls | grep -m1 -q 'ftp-ssl-reqd'; then
SSL_REQD="--ftp-ssl-reqd"
elif ${CURL} --help tls | grep -m1 -q 'ssl-reqd'; then
SSL_REQD="--ssl-reqd"
fi
#######################################################
# SETUP
if [ ! -e $TOUCH ] && [ -e /usr/bin/touch ]; then
TOUCH=/usr/bin/touch
fi
if [ ! -x ${EXPR} ] && [ -x /bin/expr ]; then
EXPR=/bin/expr
fi
if [ ! -e "${ftp_local_file}" ]; then
echo "Cannot find backup file ${ftp_local_file} to upload";
/bin/ls -la ${ftp_local_path}
/bin/df -h
exit 11;
fi
get_md5() {
MF=$1
if [ ${OS} = "FreeBSD" ]; then
MD5SUM=/sbin/md5
else
MD5SUM=/usr/bin/md5sum
fi
if [ ! -x ${MD5SUM} ]; then
return
fi
if [ ! -e ${MF} ]; then
return
fi
if [ ${OS} = "FreeBSD" ]; then
FMD5=`$MD5SUM -q $MF`
else
FMD5=`$MD5SUM $MF | cut -d\ -f1`
fi
echo "${FMD5}"
}
#######################################################
CFG=${ftp_local_file}.cfg
/bin/rm -f $CFG
$TOUCH $CFG
/bin/chmod 600 $CFG
RET=0;
#######################################################
# FTP
upload_file_ftp()
{
if [ ! -e ${CURL} ]; then
echo "";
echo "*** Backup not uploaded ***";
echo "Please install curl by running:";
echo "";
echo "cd /usr/local/directadmin/custombuild";
echo "./build curl";
echo "";
exit 10;
fi
/bin/echo "user = \"$ftp_username:$ftp_password\"" >> $CFG
if [ ! -s ${CFG} ]; then
echo "${CFG} is empty. curl is not going to be happy about it.";
ls -la ${CFG}
ls -la ${ftp_local_file}
df -h
fi
#ensure ftp_path ends with /
ENDS_WITH_SLASH=`echo "$ftp_path" | grep -c '/$'`
if [ "${ENDS_WITH_SLASH}" -eq 0 ]; then
ftp_path=${ftp_path}/
fi
${CURL} --config ${CFG} --silent --show-error --ftp-create-dirs --upload-file $ftp_local_file ftp://$ftp_ip:${PORT}/$ftp_path$ftp_remote_file 2>&1
RET=$?
if [ "${RET}" -ne 0 ]; then
echo "curl return code: $RET";
fi
}
#######################################################
# FTPS
upload_file_ftps()
{
if [ ! -e ${CURL} ]; then
echo "";
echo "*** Backup not uploaded ***";
echo "Please install curl by running:";
echo "";
echo "cd /usr/local/directadmin/custombuild";
echo "./build curl";
echo "";
exit 10;
fi
/bin/echo "user = \"$ftp_username:$ftp_password\"" >> $CFG
if [ ! -s ${CFG} ]; then
echo "${CFG} is empty. curl is not going to be happy about it.";
ls -la ${CFG}
ls -la ${ftp_local_file}
df -h
fi
#ensure ftp_path ends with /
ENDS_WITH_SLASH=`echo "$ftp_path" | grep -c '/$'`
if [ "${ENDS_WITH_SLASH}" -eq 0 ]; then
ftp_path=${ftp_path}/
fi
${CURL} --config ${CFG} ${SSL_REQD} -k ${MIN_TLS} --silent --show-error --ftp-create-dirs --upload-file $ftp_local_file ftp://$ftp_ip:${PORT}/$ftp_path$ftp_remote_file 2>&1
RET=$?
if [ "${RET}" -ne 0 ]; then
echo "curl return code: $RET";
fi
}
#######################################################
# Start
if [ "${FTPS}" = "1" ]; then
upload_file_ftps
else
upload_file_ftp
fi
if [ "${RET}" = "0" ] && [ "${MD5}" = "1" ]; then
MD5_FILE=${ftp_local_file}.md5
M=`get_md5 ${ftp_local_file}`
if [ "${M}" != "" ]; then
echo "${M}" > ${MD5_FILE}
ftp_local_file=${MD5_FILE}
ftp_remote_file=${ftp_remote_file}.md5
if [ "${FTPS}" = "1" ]; then
upload_file_ftps
else
upload_file
fi
fi
fi
/bin/rm -f $CFG
exit $RET

169
update/scripts/getDA.sh Normal file
View File

@@ -0,0 +1,169 @@
#!/bin/sh
FILE=/usr/local/directadmin/update.tar.gz
DA_BIN=/usr/local/directadmin/directadmin
LAN=0
LAN_IP=
if [ -s /root/.lan ]; then
LAN=`cat /root/.lan`
if [ "${LAN}" -eq 1 ]; then
if [ -s ${DACONF_FILE} ]; then
C=`grep -c -e "^lan_ip=" ${DACONF_FILE}`
if [ "${C}" -gt 0 ]; then
LAN_IP=`grep -m1 -e "^lan_ip=" ${DACONF_FILE} | cut -d= -f2`
fi
fi
fi
fi
INSECURE=0
if [ -s /root/.insecure_download ]; then
INSECURE=`cat /root/.insecure_download`
fi
AUTO=0
if [ "$#" -gt 0 ] && [ "${1}" = "auto" ]; then
AUTO=1
fi
EXTRA_VALUE=
if [ "$#" -gt 0 ] && [ "${AUTO}" = "1" ] && [ "${2}" = "beta" ]; then
EXTRA_VALUE="&channel=beta"
fi
if [ $# -lt 2 ] && [ "${AUTO}" != "1" ]; then
echo "Usage:";
echo "$0 auto"
echo ""
echo "or:"
echo "$0 auto beta"
echo ""
echo "or:"
echo "$0 <cid> <lid> [<ip>]";
echo "";
echo "definitons:";
echo " cid: Client ID";
echo " lid: License ID";
echo " ip: your server IP (only needed when wrong ip is used to get the update.tar.gz file)";
echo "example: $0 999 9876";
exit 0;
fi
OS=`uname`;
if [ $OS = "FreeBSD" ]; then
WGET_PATH=/usr/local/bin/wget
else
WGET_PATH=/usr/bin/wget
fi
WGET_OPTION="-T 10 --no-dns-cache"
if $WGET_PATH --help | grep -m1 -q connect-timeout; then
WGET_OPTION=" ${WGET_OPTION} --connect-timeout=10";
fi
COUNT=`$WGET_PATH --help | grep -c no-check-certificate`
if [ "$COUNT" -ne 0 ]; then
WGET_OPTION="${WGET_OPTION} --no-check-certificate";
fi
HTTP=https
if [ "${INSECURE}" -eq 1 ]; then
HTTP=http
EXTRA_VALUE="${EXTRA_VALUE}&insecure=yes"
fi
OS_OVERRIDE=`${DA_BIN} c | grep ^os_override= | cut -d= -f2`
if [ "${OS_OVERRIDE}" != "" ]; then
EXTRA_VALUE="${EXTRA_VALUE}&os=${OS_OVERRIDE}"
fi
CID=$1
LID=$2
BIND_ADDRESS=
BIND_IP=
REQUEST_IP=0
if [ $# = 3 ]; then
REQUEST_IP=1
BIND_IP=$3
fi
if [ "${AUTO}" = "1" ]; then
LID_INFO=/root/.lid_info
${WGET_PATH} ${WGET_OPTION} -qO ${LID_INFO} ${HTTP}://da-mirror.wpcloud.vn/install/my_license_info.php
if [ ! -s ${LID_INFO} ]; then
echo "Error getting license info. Empty ${LID_INFO} file. Check for errors, else try the UID/LID method, eg: $0"
exit 70
fi
if grep -m1 -q error=1 ${LID_INFO}; then
#check if other IPs have no license too
if [ -x /sbin/ip ]; then
DEVS=`ip link show | grep -e "^[1-9]" | awk '{print $2}' | cut -d: -f1 | grep -v lo | grep -v sit0 | grep -v ppp0 | grep -v faith0`
fi
for ip in `ip addr show $DEVS | grep 'inet ' | awk '{print $2}' | cut -d/ -f1`; do {
${WGET_PATH} ${WGET_OPTION} -t 3 --bind-address=${ip} -qO ${LID_INFO} ${HTTP}://da-mirror.wpcloud.vn/install/my_license_info.php
if grep -m1 -q error=1 ${LID_INFO}; then
continue
else
REQUEST_IP=1
BIND_IP=${ip}
break
fi
}
done
fi
if grep -m1 -q error=1 ${LID_INFO}; then
echo "An error has occured. Info about the error:"
grep ^text= ${LID_INFO} | cut -d= -f2
exit 71
fi
CID=`grep ^uid= ${LID_INFO} |cut -d= -f2`
LID=`grep ^lid= ${LID_INFO} |cut -d= -f2`
BIND_IP=`grep ^ip= ${LID_INFO} |cut -d= -f2`
fi
if [ "${REQUEST_IP}" = "1" ]; then
if [ "${LAN}" -eq 1 ]; then
if [ "${LAN_IP}" != "" ]; then
echo "LAN is specified. Using bind value ${LAN_IP} instead of ${BIND_IP}";
BIND_ADDRESS="--bind-address=${LAN_IP}"
else
echo "LAN is specified but could not find the lan_ip option in the directadmin.conf. Ignoring the IP bind option.";
fi
else
BIND_ADDRESS="--bind-address=${BIND_IP}"
fi
fi
${WGET_PATH} ${WGET_OPTION} -S -t 1 "${HTTP}://da-mirror.wpcloud.vn/install/update.tar.gz
if [ $? -ne 0 ]
then
echo "Error downloading the update.tar.gz file";
exit 1;
fi
COUNT=`head -n 2 ${FILE}.temp | grep -c "* You are not allowed to run this program *"`;
if [ $COUNT -ne 0 ]
then
echo "You are not authorized to download the update.tar.gz file with that client id and license id (and/or ip). Please email sales@directadmin.com";
exit 1;
fi
mv ${FILE}.temp ${FILE}
cd /usr/local/directadmin
tar xvzf update.tar.gz
if [ $? -ne 0 ]; then
echo "Extraction error."
exit 77
fi
${DA_BIN} p
./scripts/update.sh
echo 'action=directadmin&value=restart' >> /usr/local/directadmin/data/task.queue
echo "Update Successful."
exit 0;

307
update/scripts/getInfo.sh Normal file
View File

@@ -0,0 +1,307 @@
#!/bin/sh
#This script will aquire all information needed to do the install
#and will save it accordingly. You can stop the install at anytime
#and start over.
OS=`uname`
SETUP="./setup.txt"
cd /usr/local/directadmin/scripts
YES="y"
NO="n"
if [ -e ${SETUP} ]
then
while echo -n "Do you want to re-enter the server information? (y, n) :"
if [ "${OS}" = "FreeBSD" ]; then
read CORRECT
else
read -n 1 CORRECT
fi
echo "";
do
{
if [ $CORRECT = $YES ]
then
break;
fi
if [ $CORRECT = $NO ]
then
exit 0;
fi
}
done;
fi
rm -f ${SETUP}
umask 077;
#*****************************************
#STEP 1: gethostname
CORRECT="";
while
echo "Enter the hostname you wish to use.";
echo "This is the server's hostname and is *not* intended as a website for the server.";
echo "*YOU* are responsible for making sure it resolves to the proper ip.";
echo "Do not enter http:// or www.";
echo -n "(eg. server.host.com) : ";
read hostname;
echo "";
echo -n "Is ${hostname} correct? (y, n) : ";
if [ "${OS}" = "FreeBSD" ]; then
read CORRECT
else
read -n 1 CORRECT
fi
echo "";
do
{
if [ $CORRECT = $YES ]
then
break;
fi
}
done
echo "hostname=$hostname" >> ${SETUP}
#*****************************************
#STEP 2: get email
CORRECT="";
while echo -n "E-Mail Address: ";
read email;
echo "";
echo -n "Is ${email} correct? (y, n) : ";
if [ "${OS}" = "FreeBSD" ]; then
read CORRECT
else
read -n 1 CORRECT
fi
echo "";
do
{
if [ $CORRECT = $YES ]
then
break;
fi
}
done
echo "email=$email" >> ${SETUP}
#***********************************************
#STEP 2: get mysql root password
while echo -n "Enter a password for the root MySQL user (no spaces): "
if [ "${OS}" = "FreeBSD" ]; then
read passwd
else
read -s passwd
fi
echo ""
echo -n "Re-Type the password: "
if [ "${OS}" = "FreeBSD" ]; then
read repasswd
else
read -s repasswd
fi
do
{
if [ "$passwd" = "$repasswd" ]; then
#if [ -e /usr/bin/mysql ]
if [ -e /file/that/doesnt/exist ]; then
echo "";
echo "SELECT now();" | /usr/bin/mysql 2> /dev/null;
if [ $? != 0 ]; then
#root password IS set, make sure its right
echo "SELECT now();" | /usr/bin/mysql -uroot -p${passwd}
if [ $? = 0 ]; then
break;
fi
else
#the root password isn't set
break;
fi
else
break;
fi
else
echo "";
echo "Passwords do not match";
fi
}
done
echo "";
echo "mysql=$passwd" >> ${SETUP};
echo "mysqluser=da_admin" >> ${SETUP};
#****************************************************
#STEP 3: generate admin password
ADMINNAME="admin";
ADMINPASS=`perl -le'print map+(A..Z,a..z,0..9)[rand 62],0..7'`;
echo "adminname=admin" >> ${SETUP};
echo "adminpass=$ADMINPASS" >> ${SETUP};
#***************************************************
#STEP 4: set the nameserver
TEST=`echo $hostname | cut -d. -f3`
if [ "$TEST" = "" ]; then
NS1=ns1.`echo $hostname | cut -d. -f1,2`
NS2=ns2.`echo $hostname | cut -d. -f1,2`
else
NS1=ns1.`echo $hostname | cut -d. -f2,3,4,5,6`
NS2=ns2.`echo $hostname | cut -d. -f2,3,4,5,6`
fi
echo -e "ns1=$NS1\nns2=$NS2" >> ${SETUP};
#****************************************************
#STEP 5: get the ip
prefixToNetmask(){
BINARY_IP=""
for i in {1..32}; do {
if [ ${i} -le ${1} ]; then
BINARY_IP="${BINARY_IP}1"
else
BINARY_IP="${BINARY_IP}0"
fi
}
done
B1=`echo ${BINARY_IP} | cut -c1-8`
B2=`echo ${BINARY_IP} | cut -c9-16`
B3=`echo ${BINARY_IP} | cut -c17-24`
B4=`echo ${BINARY_IP} | cut -c25-32`
NM1=`perl -le "print ord(pack('B8', '${B1}'))"`
NM2=`perl -le "print ord(pack('B8', '${B2}'))"`
NM3=`perl -le "print ord(pack('B8', '${B3}'))"`
NM4=`perl -le "print ord(pack('B8', '${B4}'))"`
echo "${NM1}.${NM2}.${NM3}.${NM4}"
}
if [ "${OS}" = "FreeBSD" ]; then
IP=`grep -m1 '^ifconfig_' /etc/rc.conf | cut -d\ -f2`
else
IP=`ip addr show eth0 | grep -m1 'inet ' | awk '{print $2}' | cut -d/ -f1`
PREFIX=`ip addr show eth0 | grep -m1 'inet ' | awk '{print $2}' | cut -d/ -f2`
if echo "${IP}" | grep -m1 -q ':'; then
NM="${PREFIX}"
else
NM=`prefixToNetmask ${PREFIX}`
fi
fi
echo "ip=$IP" >> ${SETUP};
echo "netmask=$NM" >> ${SETUP};
#***************************************************
#STEP 5: user id and license id
userid=0;
liceid=0;
CORRECT="";
while echo -n "Enter Your Client ID: ";
read userid;
echo "";
echo -n "Enter Your License ID: ";
read liceid;
echo "";
echo -n "Is CID: ${userid} and LID: ${liceid} correct? (y, n): ";
read -n 1 CORRECT;
echo "";
do
{
if [ $CORRECT = $YES ]
then
break;
fi
}
done
echo -e "uid=${userid}\nlid=${liceid}" >> ${SETUP}
#**********************************************************
#STEP 6: figure out what os he's using so we can get the correct services file
CORRECT="";
SERVFILE="";
while echo "What Operating system are you running?";
if [ "${OS}" = "FreeBSD" ]; then
echo -e "\t1:FreeBSD 4.8";
read NUM
else
echo -e "\t1:RedHat 7.2";
echo -e "\t2:RedHat 7.3";
echo -e "\t3:RedHat 8.0";
echo -e "\t4:RedHat 9.0";
echo -n "Enter the number from the left: ";
read -n 1 NUM
fi
echo ""
do
{
case $NUM in
1 ) SERVFILE="services72.tar.gz";
;;
2 ) SERVFILE="services73.tar.gz";
;;
3 ) SERVFILE="services80.tar.gz";
;;
4 ) SERVFILE="services90.tar.gz";
;;
esac
if [ "$SERVFILE" = "" ]
then
continue;
else
break;
fi
}
done
echo "services=${SERVFILE}" >> ${SETUP}
echo "**********************************";
echo "All Information has been gathered. Please make *sure* the following data is correct, if not, edit the setup.txt file before going on";
echo "";
/bin/cat ${SETUP};
exit 0;

View File

@@ -0,0 +1,192 @@
#!/bin/sh
LICENSE=/usr/local/directadmin/conf/license.key
DACONF_FILE=/usr/local/directadmin/conf/directadmin.conf
LAN=0
LAN_IP=
if [ -s /root/.lan ]; then
LAN=`cat /root/.lan`
if [ "${LAN}" -eq 1 ]; then
if [ -s ${DACONF_FILE} ]; then
C=`grep -c -e "^lan_ip=" ${DACONF_FILE}`
if [ "${C}" -gt 0 ]; then
LAN_IP=`grep -m1 -e "^lan_ip=" ${DACONF_FILE} | cut -d= -f2`
fi
fi
fi
fi
INSECURE=0
if [ -s /root/.insecure_download ]; then
INSECURE=`cat /root/.insecure_download`
fi
AUTO=0
if [ "$#" -gt 0 ] && [ "${1}" = "auto" ]; then
AUTO=1
fi
if [ $# -lt 2 ] && [ "${AUTO}" != "1" ]; then
echo "Usage:"
echo "$0 auto"
echo ""
echo "or:"
echo "$0 <cid> <lid> [<ip>]"
echo ""
echo "Definitons:"
echo " cid: Client ID"
echo " lid: License ID"
echo " ip: your server IP (only needed when wrong ip is used to get license)"
echo ""
echo "example: $0 999 9876"
exit 0;
fi
OS=`uname`;
if [ $OS = "FreeBSD" ]; then
WGET_PATH=/usr/local/bin/wget
else
WGET_PATH=/usr/bin/wget
fi
if [ -e /etc/redhat-release ]; then
if ! grep -m1 -q '^nameserver' /etc/resolv.conf; then
echo '' >> /etc/resolv.conf
echo 'nameserver 8.8.8.8' >> /etc/resolv.conf
echo 'nameserver 1.1.1.1' >> /etc/resolv.conf
fi
fi
WGET_OPTION="-T 10 --no-dns-cache"
if $WGET_PATH --help | grep -m1 -q connect-timeout; then
WGET_OPTION=" ${WGET_OPTION} --connect-timeout=10";
fi
COUNT=`$WGET_PATH --help | grep -c no-check-certificate`
if [ "$COUNT" -ne 0 ]; then
WGET_OPTION="${WGET_OPTION} --no-check-certificate";
fi
HTTP=https
EXTRA_VALUE=
if [ "${INSECURE}" -eq 1 ]; then
HTTP=http
EXTRA_VALUE="&insecure=yes"
fi
CID=$1
LID=$2
BIND_ADDRESS=
BIND_IP=
REQUEST_IP=0
if [ $# = 3 ]; then
REQUEST_IP=1
BIND_IP=$3
fi
if [ "${AUTO}" = "1" ]; then
LID_INFO=/root/.lid_info
${WGET_PATH} ${WGET_OPTION} -qO ${LID_INFO} ${HTTP}://da-mirror.wpcloud.vn/install/my_license_info.php
if [ ! -s ${LID_INFO} ]; then
echo "Error getting license info. Empty ${LID_INFO} file. Check for errors, else try the UID/LID method, eg: $0"
exit 70
fi
if grep -m1 -q error=1 ${LID_INFO}; then
#check if other IPs have no license too
if [ -x /sbin/ip ]; then
DEVS=`ip link show | grep -e "^[1-9]" | awk '{print $2}' | cut -d: -f1 | grep -v lo | grep -v sit0 | grep -v ppp0 | grep -v faith0`
fi
for ip in `ip addr show $DEVS | grep 'inet ' | awk '{print $2}' | cut -d/ -f1`; do {
${WGET_PATH} ${WGET_OPTION} -t 3 --bind-address=${ip} -qO ${LID_INFO} ${HTTP}://da-mirror.wpcloud.vn/install/my_license_info.php
if grep -m1 -q error=1 ${LID_INFO}; then
continue
else
REQUEST_IP=1
BIND_IP=${ip}
break
fi
}
done
fi
if grep -m1 -q error=1 ${LID_INFO}; then
echo "An error has occured. Info about the error:"
grep ^text= ${LID_INFO} | cut -d= -f2
exit 71
fi
CID=`grep ^uid= ${LID_INFO} |cut -d= -f2`
LID=`grep ^lid= ${LID_INFO} |cut -d= -f2`
BIND_IP=`grep ^ip= ${LID_INFO} |cut -d= -f2`
fi
if [ "${REQUEST_IP}" = "1" ]; then
if [ "${LAN}" -eq 1 ]; then
if [ "${LAN_IP}" != "" ]; then
echo "LAN is specified. Using bind value ${LAN_IP} instead of ${BIND_IP}";
BIND_ADDRESS="--bind-address=${LAN_IP}"
else
echo "LAN is specified but could not find the lan_ip option in the directadmin.conf. Ignoring the IP bind option.";
fi
else
BIND_ADDRESS="--bind-address=${BIND_IP}"
fi
fi
myip()
{
IP=`$WGET_PATH $WGET_OPTION -t 3 ${BIND_ADDRESS} -qO - ${HTTP}://myip.directadmin.com`
if [ "${IP}" = "" ]; then
echo "Error determining IP via myip.directadmin.com";
return;
fi
echo "IP used to connect out: ${IP}";
}
${WGET_PATH} ${WGET_OPTION} -t 1 ${HTTP}://da-mirror.wpcloud.vn/install/license.key -O ${LICENSE}.temp ${BIND_ADDRESS}
if [ $? -ne 0 ]
then
echo "Error downloading the license file";
myip;
echo "Trying license relay server...";
${WGET_PATH} ${WGET_OPTION} -t 2 ${HTTP}://da-mirror.wpcloud.vn/install/license.key -O ${LICENSE}.temp ${BIND_ADDRESS}
if [ $? -ne 0 ]; then
echo "Error downloading the license file from relay server as well.";
myip;
exit 2;
fi
fi
COUNT=`cat ${LICENSE}.temp | grep -c "* You are not allowed to run this program *"`;
if [ $COUNT -ne 0 ]
then
echo "You are not authorized to download the license with that client id and license id (and/or ip). Please email sales@directadmin.com";
echo "";
echo "If you are having connection issues, see this guide:";
echo " http://help.directadmin.com/item.php?id=30";
echo "";
COUNT=`grep -c 'Rate Limited' ${LICENSE}.temp`
if [ "$COUNT" -gt 0 ]; then
echo "The issue appears to be related to rate limiting. Please reduce the number of license updates you make per day."
else
myip;
fi
exit 3;
fi
/bin/mv -f ${LICENSE}.temp ${LICENSE}
chmod 600 ${LICENSE}
chown diradmin:diradmin ${LICENSE}
if [ -s ${LICENSE} ] && [ -s ${DACONF_FILE} ]; then
echo 'action=directadmin&value=restart' >> /usr/local/directadmin/data/task.queue.cb
/usr/local/directadmin/dataskq --custombuild
fi
exit 0;

View File

@@ -0,0 +1,22 @@
#!/bin/sh
#Script to return the main useable device IP address of the box, used for main outbound connections.
#on a LAN, this should match your directadmin.conf lan_ip setting.
#for normal servers, this will likely return your license IP (usually)
#Will also be the default IP that exim sends email through.
OS=`uname`
if [ "${OS}" = "FreeBSD" ]; then
/sbin/ifconfig | grep inet | grep -m1 broadcast | awk '{ print $2; }'
RET=$?
else
IP=`/sbin/ip a | grep inet | grep -m1 brd | awk '{ print $2; };' | cut -d/ -f1`
RET=$?
if [ "${IP}" = "" ]; then
#IP=`/sbin/ip a | grep 'inet ' | grep -v 127.0.0.1 | head -n1 | awk '{ print $2; };' | cut -d/ -f1`
IP=`ip route get 8.8.8.8 | head -1 | grep -o 'src [^ ]*' | awk '{print $2}'`
RET=$?
fi
echo ${IP}
fi
exit $RET

View File

@@ -0,0 +1,13 @@
#!/bin/sh
#similar to get_main_ip.sh, this returns the main IPv6 for the system.
WGET=/usr/bin/wget
if [ ! -x ${WGET} ] && [ -x /usr/local/bin/wget ]; then
WGET=/usr/local/bin/wget
fi
${WGET} -q --tries=4 --timeout=4 --inet6-only https://api64.ipify.org -O -
exit $?
#Connecting to api64.ipify.org (api64.ipify.org)|2607:f2d8:4010:b::2|:443... failed: Network is unreachable.
#4

169
update/scripts/hostname.sh Normal file
View File

@@ -0,0 +1,169 @@
#!/bin/bash
if [ $# -lt "1" ]
then
echo "Usage: $0 <hostname> (<ip>)";
exit 1;
fi
DIRECTADMIN_BIN=/usr/local/directadmin/directadmin
DIRECTADMIN_CONF=/usr/local/directadmin/conf/directadmin.conf
IP=`ip addr show $ETH_DEV | grep -m1 'inet ' | awk '{print $2}' | cut -d/ -f1`
if [ -z "${IP}" ] && [ -x /sbin/ifconfig ]; then
IP=`/sbin/ifconfig $ETH_DEV | grep 'inet ' | awk '{print $2}' | cut -d: -f2`;
fi
SETUP=/usr/local/directadmin/scripts/setup.txt
OS=`uname`
ETH_DEV=eth0
if [ -s $SETUP ]; then
IP=`grep -m1 '^ip=' $SETUP | cut -d= -f2`;
else
if [ "${OS}" = "FreeBSD" ]; then
IP=`/sbin/ifconfig | head -n3 | grep 'inet ' | cut -d\ -f2`;
else
if [ -s $DIRECTADMIN_CONF ] && [ -x $DIRECTADMIN_BIN ]; then
ETH_DEV=`$DIRECTADMIN_BIN c | grep '^ethernet_dev=' | cut -d= -f2`
fi
IP=`ip addr show $ETH_DEV | grep -m1 'inet ' | awk '{print $2}' | cut -d/ -f1`
if [ -z ${IP} ]; then
IP=`/sbin/ifconfig $ETH_DEV | grep 'inet ' | head -n1 | awk '{print $2}' | cut -d: -f2`
fi
if [ "${IP}" = "127.0.0.1" ] || [ "${IP}" = "" ]; then
IP=`ip route get 1 | awk '{print $7}' | head -n1`
fi
fi
fi
if [ $# -gt "1" ]
then
IP=$2;
fi
if [ "${OS}" = "FreeBSD" ]; then
OLDHOST=`hostname -f`
else
OLDHOST=`hostname --fqdn`
fi
/bin/hostname $1
if [ "${OLDHOST}" = "" ]; then
OLDHOST=old.host.com
echo "old hostname was blank. Setting placeholder value ${OLDHOST}"
fi
#remove any previous hostnames.
cat /etc/hosts | grep -Fv $1 | grep -Fv $OLDHOST | grep -v '#' > /etc/hosts.tmp
#start the file over
echo "# Do not remove the following line, or various programs" > /etc/hosts
echo "# that require network functionality will fail." >> /etc/hosts
COUNT=`cat /etc/hosts.tmp | grep -c localhost`
if [ $COUNT -lt "1" ]
then
echo -e "127.0.0.1\t\tlocalhost localhost.localdomain" >> /etc/hosts
fi
cat /etc/hosts.tmp >> /etc/hosts
SHORT_HOSTNAME=${1%%.*}
echo -e "${IP}\t\t${1} ${SHORT_HOSTNAME}" >> /etc/hosts
chmod 644 /etc/hosts
if [ -e /etc/hostname ]; then
echo $1 > /etc/hostname
fi
if [ -x /usr/bin/hostnamectl ]; then
/usr/bin/hostnamectl --static set-hostname ${1}
fi
if [ "${OS}" = "FreeBSD" ]; then
/usr/bin/perl -pi -e 's/hostname=(.*)/hostname=\"${1}\"/' /etc/rc.conf
fi
if [ ! -e /etc/debian_version ] && [ "${OS}" != "FreeBSD" ] && [ -s /etc/sysconfig/network ]; then
/usr/bin/perl -pi -e 's/HOSTNAME=(.*)/HOSTNAME=${1}/' /etc/sysconfig/network
fi
#for exim.
if [ -s /etc/virtual/domains ]; then
perl -pi -e "s/^\Q$OLDHOST\E\$/$1/" /etc/virtual/domains
#backup plan, in case there was no old hostname
if grep -m1 -q "^${1}$" /etc/virtual/domains; then
echo ${1} >> /etc/virtual/domains;
fi
fi
#this is for exim 4 as it wants the dir for the filters
V=/etc/virtual
if [ ! -e ${V} ]; then
/bin/mkdir -p ${V}
/bin/chown -f mail:mail ${V}
/bin/chmod -f 755 ${V}
fi
NEW_DIR=/etc/virtual/${1}
OLD_DIR=/etc/virtual/${OLDHOST}
if [ -d ${OLD_DIR} ] && [ ! -d ${NEW_DIR} ]; then
mv ${OLD_DIR} ${NEW_DIR}
else
if [ ! -d ${NEW_DIR} ]; then
/bin/mkdir -p ${NEW_DIR}
/bin/chown -f mail:mail ${NEW_DIR}
/bin/chmod -f 711 ${NEW_DIR}
fi
fi
#dovecot
LMTP=/etc/dovecot/conf/lmtp.conf
if [ -s ${LMTP} ]; then
perl -pi -e "s/\Q$OLDHOST\E/$1/" ${LMTP}
fi
SETUP=/usr/local/directadmin/scripts/setup.txt
if [ -s ${SETUP} ] && [ -s ${DIRECTADMIN_CONF} ]; then
perl -pi -e "s/\Q$OLDHOST\E\$/$1/" ${SETUP}
fi
if [ -x /usr/local/directadmin/custombuild/build ] && [ -s /usr/local/directadmin/custombuild/options.conf ]; then
/usr/local/directadmin/custombuild/build set redirect_host $1
fi
if grep -m1 -q '^use_hostname_for_alias=yes$' /usr/local/directadmin/custombuild/options.conf; then
/usr/local/directadmin/custombuild/build rewrite_confs
else
echo "action=rewrite&value=httpd" >> /usr/local/directadmin/data/task.queue
fi
#mysql pid file.
PIDF=/var/lib/mysql/${OLDHOST}.pid
if [ -e $PIDF ]; then
mv $PIDF /var/lib/mysql/${1}.pid
fi
PIDF=/home/mysql/${OLDHOST}.pid
if [ -e $PIDF ]; then
mv $PIDF /home/mysql/${1}.pid
fi
#LetsEncrypt
SAN_CONFIG=/usr/local/directadmin/conf/ca.san_config
if [ -s ${SAN_CONFIG} ]; then
perl -pi -e "s/\Q$OLDHOST\E\$/$1/" ${SAN_CONFIG}
fi
#directadmin.conf
if [ -e ${DIRECTADMIN_CONF} ] && [ -e ${DIRECTADMIN_BIN} ]; then
${DIRECTADMIN_BIN} set servername $1
if grep -m1 -q "^force_hostname=${OLDHOST}$" ${DIRECTADMIN_CONF}; then
${DIRECTADMIN_BIN} set force_hostname $1
fi
echo 'action=httpd&value=restart' >> /usr/local/directadmin/data/task.queue
fi
exit 0

678
update/scripts/install.sh Normal file
View File

@@ -0,0 +1,678 @@
#!/bin/sh
#This is the installer script. Run this and follow the directions
DA_PATH="/usr/local/directadmin"
DA_BIN="${DA_PATH}/directadmin"
DA_TQ="${DA_PATH}/data/task.queue"
DA_SCRIPTS="${DA_PATH}/scripts"
CB_OPTIONS=${DA_PATH}/custombuild/options.conf
DA_CRON="${DA_SCRIPTS}/directadmin_cron"
VIRTUAL="/etc/virtual"
OS=`uname`
CBVERSION="2.0"
DL_SERVER=da-mirror.wpcloud.vn
BACKUP_DL_SERVER=da-mirror.wpcloud.vn
if [ -s $CB_OPTIONS ]; then
DLS=`grep -m1 ^downloadserver $CB_OPTIONS | cut -d= -f2`;
if [ "${DLS}" != "" ]; then
DL_SERVER=${DLS}
fi
fi
CMD_LINE=$1
cd ${DA_SCRIPTS}
SYSTEMD=no
SYSTEMDDIR=/etc/systemd/system
if [ -d ${SYSTEMDDIR} ]; then
if [ -e /bin/systemctl ] || [ -e /usr/bin/systemctl ]; then
SYSTEMD=yes
fi
fi
if [ "$OS" = "FreeBSD" ]; then
WGET_PATH=/usr/local/bin/wget
else
WGET_PATH=/usr/bin/wget
fi
WGET_OPTION="--no-dns-cache";
COUNT=`$WGET_PATH --help | grep -c no-check-certificate`
if [ "$COUNT" -ne 0 ]; then
WGET_OPTION="--no-check-certificate ${WGET_OPTION}";
fi
#Create the diradmin user
createDAbase() {
mkdir -p ${DA_PATH}
if [ "${OS}" = "FreeBSD" ]; then
/usr/sbin/pw groupadd diradmin 2> /dev/null
/usr/sbin/pw useradd -g diradmin -n diradmin -b ${DA_PATH} -s /sbin/nologin 2> /dev/null
id diradmin
if [ $? -ne 0 ]; then
echo "we've just added the diradmin user.. but id can't seem to find it. Trying pwd_mkdb...";
pwd_mkdb -p /etc/master.passwd
id diradmin
if [ $? -ne 0 ]; then
echo "After trying the command:"
echo " pwd_mkdb -p /etc/master.passwd"
echo ""
echo "we still cannot find the diradmin user. Aborting."
exit 1
fi
fi
elif [ -e /etc/debian_version ]; then
/usr/sbin/adduser --system --group --firstuid 100 --home ${DA_PATH} --no-create-home --disabled-login --force-badname diradmin
else
/usr/sbin/useradd -d ${DA_PATH} -r -s /bin/false diradmin 2> /dev/null
fi
chmod -f 755 ${DA_PATH}
chown -f diradmin:diradmin ${DA_PATH}
mkdir -p /var/log/directadmin
mkdir -p ${DA_PATH}/conf
chown -f diradmin:diradmin ${DA_PATH}/*
chown -f diradmin:diradmin /var/log/directadmin
chmod -f 700 ${DA_PATH}/conf
chmod -f 700 /var/log/directadmin
if [ -e /etc/logrotate.d ]; then
cp $DA_SCRIPTS/directadmin.rotate /etc/logrotate.d/directadmin
chmod 644 /etc/logrotate.d/directadmin
fi
chown -f diradmin:diradmin ${DA_PATH}/conf/* 2> /dev/null
chmod -f 600 ${DA_PATH}/conf/* 2> /dev/null
mkdir -p /var/log/httpd/domains
chmod 710 /var/log/httpd/domains
chmod 710 /var/log/httpd
mkdir -p /home/tmp
chmod -f 1777 /home/tmp
/bin/chmod 711 /home
ULTMP_HC=/usr/lib/tmpfiles.d/home.conf
if [ -s ${ULTMP_HC} ]; then
#Q /home 0755 - - -
if grep -m1 -q '^Q /home 0755 ' ${ULTMP_HC}; then
perl -pi -e 's#^Q /home 0755 #Q /home 0711 #' ${ULTMP_HC};
fi
fi
mkdir -p /var/www/html
chmod 755 /var/www/html
SSHROOT=`cat /etc/ssh/sshd_config | grep -c '^AllowUsers '`;
if [ $SSHROOT -gt 0 ]
then
echo "" >> /etc/ssh/sshd_config
echo "AllowUsers root" >> /etc/ssh/sshd_config
chmod 710 /etc/ssh
fi
}
#After everything else copy the directadmin_cron to /etc/cron.d
copyCronFile() {
if [ "$OS" = "FreeBSD" ]; then
if ! grep -m1 -q 'dataskq' /etc/crontab && [ -s ${DA_CRON} ]; then
cat ${DA_CRON} | grep -v 'quotaoff' >> /etc/crontab;
else
echo "Could not find ${DA_CRON} or it is empty";
fi
else
if [ -s ${DA_CRON} ]; then
mkdir -p /etc/cron.d
cp ${DA_CRON} /etc/cron.d/;
chmod 600 /etc/cron.d/directadmin_cron
chown root /etc/cron.d/directadmin_cron
else
echo "Could not find ${DA_CRON} or it is empty";
fi
#CentOS/RHEL bits
if [ ! -s /etc/debian_version ]; then
CRON_BOOT=/etc/init.d/crond
if [ -d /etc/systemd/system ]; then
CRON_BOOT=/usr/lib/systemd/system/crond.service
fi
if [ ! -s ${CRON_BOOT} ]; then
echo ""
echo "****************************************************************************"
echo "* Cannot find ${CRON_BOOT}. Ensure you have cronie installed"
echo " yum install cronie"
echo "****************************************************************************"
echo ""
else
if [ -d /etc/systemd/system ]; then
systemctl daemon-reload
systemctl enable crond.service
systemctl restart crond.service
else
${CRON_BOOT} restart
/sbin/chkconfig crond on
fi
fi
fi
fi
}
#Copies the startup scripts over to the /etc/rc.d/init.d/ folder
#and chkconfig's them to enable them on bootup
copyStartupScripts() {
if [ "${SYSTEMD}" = "yes" ]; then
cp -f directadmin.service ${SYSTEMDDIR}/
cp -f startips.service ${SYSTEMDDIR}/
chmod 644 ${SYSTEMDDIR}/startips.service
systemctl daemon-reload
systemctl enable directadmin.service
systemctl enable startips.service
else
if [ "${OS}" = "FreeBSD" ]; then
BOOT_DIR=/usr/local/etc/rc.d/
#removed boot.sh, sshd and named from the list, as boot.sh is unused and the other 2 come pre-installed with the system
if [ ! -s ${BOOT_DIR}/startips ]; then
cp -f startips ${BOOT_DIR}/startips
chmod 755 ${BOOT_DIR}/startips
fi
if [ ! -s ${BOOT_DIR}/da-popb4smtp ]; then
echo '#!/bin/sh' > ${BOOT_DIR}/da-popb4smtp
echo '' >> ${BOOT_DIR}/da-popb4smtp
echo '. /etc/rc.subr' >> ${BOOT_DIR}/da-popb4smtp
echo '' >> ${BOOT_DIR}/da-popb4smtp
echo 'name="da_popb4smtp"' >> ${BOOT_DIR}/da-popb4smtp
echo 'rcvar="da_popb4smtp_enable"' >> ${BOOT_DIR}/da-popb4smtp
echo 'command="/usr/local/directadmin/da-popb4smtp"' >> ${BOOT_DIR}/da-popb4smtp
echo '' >> ${BOOT_DIR}/da-popb4smtp
echo 'load_rc_config $name' >> ${BOOT_DIR}/da-popb4smtp
echo ': ${da_popb4smtp_enable:=yes}' >> ${BOOT_DIR}/da-popb4smtp
echo '' >> ${BOOT_DIR}/da-popb4smtp
echo 'run_rc_command "$1"' >> ${BOOT_DIR}/da-popb4smtp
chmod 755 ${BOOT_DIR}/da-popb4smtp
fi
if [ ! -s ${BOOT_DIR}/directadmin ]; then
echo '#!/bin/sh' > ${BOOT_DIR}/directadmin
echo '' >> ${BOOT_DIR}/directadmin
echo '. /etc/rc.subr' >> ${BOOT_DIR}/directadmin
echo '' >> ${BOOT_DIR}/directadmin
echo 'name="directadmin"' >> ${BOOT_DIR}/directadmin
echo 'rcvar="directadmin_enable"' >> ${BOOT_DIR}/directadmin
echo 'pidfile="/var/run/${name}.pid"' >> ${BOOT_DIR}/directadmin
echo 'command="/usr/local/directadmin/directadmin"' >> ${BOOT_DIR}/directadmin
echo 'command_args="d"' >> ${BOOT_DIR}/directadmin
echo '' >> ${BOOT_DIR}/directadmin
echo 'load_rc_config $name' >> ${BOOT_DIR}/directadmin
echo ': ${directadmin_enable:=yes}' >> ${BOOT_DIR}/directadmin
echo '' >> ${BOOT_DIR}/directadmin
echo 'run_rc_command "$1"' >> ${BOOT_DIR}/directadmin
chmod 755 ${BOOT_DIR}/directadmin
fi
ERC=/etc/rc.conf
if [ -e ${ERC} ]; then
if ! /usr/bin/grep -m1 -q "^named_enable=" ${ERC}; then
echo 'named_enable="YES"' >> ${ERC}
else
perl -pi -e 's/^named_enable=.*/named_enable="YES"/' ${ERC}
fi
fi
else
cp -f directadmin /etc/init.d/directadmin
cp -f startips /etc/init.d/startips
# nothing for debian as non-systemd debian versions are EOL
if [ ! -s /etc/debian_version ]; then
/sbin/chkconfig directadmin reset
/sbin/chkconfig startips reset
fi
fi
fi
}
addUserGroup() {
if [ ${OS} = "FreeBSD" ]; then
PW=/usr/sbin/pw
ADD_UID=
ADD_GID=
if [ "${3}" != "" ]; then
ADD_UID="-u ${3}"
fi
if [ "${4}" != "" ]; then
ADD_GID="-g ${4}"
fi
if ! /usr/bin/grep -q "^${2}:" < /etc/group; then
${PW} groupadd ${2} ${ADD_GID}
fi
if ! /usr/bin/id ${1} > /dev/null; then
${PW} useradd -g ${2} -n ${1} -s /sbin/nologin ${ADD_UID}
fi
elif [ -e /etc/debian_version ]; then
if ! /usr/bin/id ${1} > /dev/null; then
adduser --system --group --no-create-home \
--disabled-login --force-badname ${1} > /dev/null
fi
else
if ! /usr/bin/id ${1} > /dev/null; then
/usr/sbin/useradd -r -s /bin/false ${1}
fi
fi
}
#touch exim's file inside /etc/virtual
touchExim() {
mkdir -p ${VIRTUAL};
chown -f mail ${VIRTUAL};
chgrp -f mail ${VIRTUAL};
chmod 755 ${VIRTUAL};
echo "`hostname -f`" >> ${VIRTUAL}/domains;
if [ ! -s ${VIRTUAL}/limit ]; then
echo "1000" > ${VIRTUAL}/limit
fi
if [ ! -s ${VIRTUAL}/limit_unknown ]; then
echo "0" > ${VIRTUAL}/limit_unknown
fi
if [ ! -s ${VIRTUAL}/user_limit ]; then
echo "200" > ${VIRTUAL}/user_limit
fi
chmod 755 ${VIRTUAL}/*
mkdir -p ${VIRTUAL}/usage
chmod 750 ${VIRTUAL}/usage
for i in domains domainowners pophosts blacklist_domains whitelist_from use_rbl_domains bad_sender_hosts bad_sender_hosts_ip blacklist_senders whitelist_domains whitelist_hosts whitelist_hosts_ip whitelist_senders skip_av_domains skip_rbl_domains; do
touch ${VIRTUAL}/$i;
chmod 600 ${VIRTUAL}/$i;
done
addUserGroup mail mail 12 12
chown -f mail:mail ${VIRTUAL}/*;
}
#get setup data
doGetInfo() {
if [ ! -e ./setup.txt ]; then
./getInfo.sh
fi
}
getLicense() {
if [ "${OS}" = "FreeBSD" ] && [ ! -e /usr/local/bin/wget ]; then
echo "wget not installed, installing it...";
if [ ! -x /usr/sbin/pkg ]; then
pkg_add -f ${DA_SCRIPTS}/packages/wget.tgz
if [ ! -e /usr/local/bin/wget ]; then
pkg_add -r wget
fi
else
pkg install -y wget
fi
fi
if [ -e /root/.skip_get_license ]; then
echo "/root/.skip_get_license exists. Not downloading license"
return;
fi
userid=`cat ./setup.txt | grep uid= | cut -d= -f2`;
liceid=`cat ./setup.txt | grep lid= | cut -d= -f2`;
ip=`cat ./setup.txt | grep ip= | cut -d= -f2`;
LAN=0
if [ -s /root/.lan ]; then
LAN=`cat /root/.lan`
fi
$DA_SCRIPTS/getLicense.sh auto
if [ $? -ne 0 ]; then
exit 1;
fi
}
doSetHostname() {
HN=`cat ./setup.txt | grep hostname= | cut -d= -f2`;
${DA_PATH}/scripts/hostname.sh ${HN}
#/sbin/service network restart
}
checkMD5()
{
if [ ${OS} = "FreeBSD" ]; then
MD5SUM=/sbin/md5
else
MD5SUM=/usr/bin/md5sum
fi
MD5_FILE=$1
MD5_CHECK=${MD5_FILE}.md5
if [ ! -s "${MD5SUM}" ]; then
echo "Cannot find $MD5SUM to check $MD5_FILE";
return;
fi
if [ ! -s "${MD5_FILE}" ]; then
echo "Cannot find ${MD5_FILE} or it is empty";
return;
fi
if [ ! -s "${MD5_CHECK}" ]; then
echo "Cannot find ${MD5_CHECK} or it is empty";
return;
fi
echo "";
echo -n "Checking MD5sum on $MD5_FILE ... ";
LOCAL_MD5=`${MD5SUM} ${MD5_FILE} | cut -d\ -f1`
CHECK_MD5=`cat ${MD5_CHECK} | cut -d\ -f1`
if [ "${LOCAL_MD5}" = "${CHECK_MD5}" ]; then
echo "Pass";
else
echo "Failed. Consider deleting $MD5_FILE and $MD5_CHECK then try again";
echo "";
echo "";
sleep 5;
fi
}
getServices() {
SERVICES_FILE=${DA_SCRIPTS}/packages/services.tar.gz
if [ -s "{$SERVICES_FILE}" ]; then
if [ -s "${SERVICES_FILE}.md5" ]; then
checkMD5 ${SERVICES_FILE}
fi
echo "Services file already exists. Assuming its been extracted, skipping...";
return;
fi
servfile=`cat ./setup.txt | grep services= | cut -d= -f2`;
#get the md5sum
${WGET_PATH} ${WGET_OPTION} http://${DL_SERVER}/services/${servfile}.md5 -O ${SERVICES_FILE}.md5
if [ ! -s ${SERVICES_FILE}.md5 ]; then
${WGET_PATH} ${WGET_OPTION} http://${BACKUP_DL_SERVER}/services/${servfile}.md5 -O ${SERVICES_FILE}.md5
if [ -s ${SERVICES_FILE}.md5 ]; then
echo "************************"
echo "Downloading from ${DL_SERVER} failed. Switching to the functional ${BACKUP_DL_SERVER}"
echo "************************"
DL_SERVER=${BACKUP_DL_SERVER}
else
${WGET_PATH} ${WGET_OPTION} http://da-mirror.wpcloud.vn/services/${servfile}.md5 -O ${SERVICES_FILE}.md5
if [ -s ${SERVICES_FILE}.md5 ]; then
echo "************************"
echo "Downloading from ${DL_SERVER} and ${BACKUP_DL_SERVER} failed. Switching to the functional da-mirror.wpcloud.vn"
echo "************************"
DL_SERVER=da-mirror.wpcloud.vn
fi
fi
fi
if [ ! -s ${SERVICES_FILE}.md5 ];
then
echo "";
echo "failed to get md5 file: ${SERVICES_FILE}.md5";
echo "";
sleep 4;
fi
${WGET_PATH} ${WGET_OPTION} http://${DL_SERVER}/services/${servfile} -O $SERVICES_FILE
if [ $? -ne 0 ]
then
echo "Error downloading the services file";
exit 1;
fi
#we have md5, lets use it.
if [ -s ${SERVICES_FILE}.md5 ]; then
checkMD5 ${SERVICES_FILE}
fi
echo "Extracting services file...";
tar xzf $SERVICES_FILE -C ${DA_SCRIPTS}/packages
if [ $? -ne 0 ]
then
echo "Error extracting services file";
exit 1;
fi
}
./doChecks.sh
if [ $? -ne 0 ]; then
exit 1
fi
doGetInfo
doSetHostname
createDAbase
copyStartupScripts
#copyCronFile #moved lower, after custombuild, march 7, 2011
touchExim
./fstab.sh
${DA_SCRIPTS}/cron_deny.sh
getLicense
getServices
if [ ! -e ${DA_PATH}/custombuild/options.conf ] && [ -e /etc/redhat-release ] && [ ! -e /etc/init.d/xinetd ] && [ -e /usr/bin/yum ]; then
yum -y install xinetd
/sbin/chkconfig xinetd on
/sbin/service xinetd start
fi
cd ${DA_SCRIPTS}
cp -f ${DA_SCRIPTS}/redirect.php /var/www/html/redirect.php
#CB should install pure-ftpd without issues
#if [ -s ${DA_SCRIPTS}/proftpd.sh ]; then
# ${DA_SCRIPTS}/proftpd.sh
#fi
#Clean up FTP env
#Get out of here! We don't want any of this (wu-ftpd)!
if [ "${OS}" = "FreeBSD" ]; then
perl -pi -e 's/^ftp/#ftp/' /etc/inetd.conf
killall -HUP inetd
elif [ -s /etc/debian_version ]; then
dpkg -r --force-all gadmin-proftpd gforge-ftp-proftpd gproftpd proftpd-basic proftpd-doc proftpd-mod-ldap proftpd-mod-mysql proftpd-mod-pgsql pure-ftpd pure-ftpd-common 2> /dev/null
dpkg -P gadmin-proftpd gforge-ftp-proftpd gproftpd proftpd-basic proftpd-doc proftpd-mod-ldap proftpd-mod-mysql proftpd-mod-pgsql pure-ftpd pure-ftpd-common 2> /dev/null
else
rpm -e --nodeps wu-ftp 2> /dev/null
rpm -e --nodeps wu-ftpd 2> /dev/null
rpm -e --nodeps anonftp 2> /dev/null
rpm -e --nodeps pure-ftpd 2> /dev/null
rpm -e --nodeps vsftpd 2> /dev/null
rpm -e --nodeps psa-proftpd 2> /dev/null
rpm -e --nodeps psa-proftpd-xinetd 2> /dev/null
rpm -e --nodeps psa-proftpd-start 2> /dev/null
rm -f /etc/xinetd.d/proftpd
rm -f /etc/xinetd.d/wu-ftpd.rpmsave
rm -f /etc/xinetd.d/wu-ftpd
rm -f /etc/xinetd.d/ftp_psa
rm -f /etc/xinetd.d/gssftp
rm -f /etc/xinetd.d/xproftpd
fi
killall -9 pure-ftpd 2> /dev/null > /dev/null
rm -f /usr/local/sbin/pure-ftpd 2> /dev/null > /dev/null
#while we're doing it, lets get rid of pop stuff too
rm -f /etc/xinetd.d/pop*
#in case they it still holds port 21
if [ -s /etc/init.d/xinetd ] && [ "${SYSTEMD}" = "no" ]; then
/sbin/service xinetd restart
fi
if [ -s /usr/lib/systemd/system/xinetd.service ] && [ "${SYSTEMD}" = "yes" ]; then
systemctl restart xinetd.service
fi
if [ -s ${DA_SCRIPTS}/majordomo.sh ]; then
cd packages
tar xzf majordomo-*.tar.gz
cd ..
${DA_SCRIPTS}/majordomo.sh
fi
${DA_SCRIPTS}/sysbk.sh
#ncftp not needed anymore by default: https://www.directadmin.com/features.php?id=2488
#if [ ! -e "/usr/bin/ncftpput" ]; then
# ${DA_SCRIPTS}/ncftp.sh
#fi
if [ "${OS}" != "FreeBSD" ]; then
if grep -m1 -q '^adminname=' ./setup.txt; then
ADMINNAME=`grep -m1 '^adminname=' ./setup.txt | cut -d= -f2`
/usr/sbin/userdel -r ${ADMINNAME}
rm -rf ${DA_PATH}/data/users/${ADMINNAME}
fi
fi
# Install CustomBuild
cd ${DA_PATH}
${WGET_PATH} ${WGET_OPTION} -O custombuild.tar.gz http://${DL_SERVER}/services/custombuild/${CBVERSION}/custombuild.tar.gz
if [ $? -ne 0 ]; then
${WGET_PATH} ${WGET_OPTION} -O custombuild.tar.gz http://${BACKUP_DL_SERVER}/services/custombuild/${CBVERSION}/custombuild.tar.gz
if [ $? -ne 0 ]; then
echo "*** There was an error downloading the custombuild script. ***";
exit 1;
fi
fi
tar xzf custombuild.tar.gz
cd custombuild
chmod 755 build
./build update
./build all d
if [ $? -ne 0 ]; then
copyCronFile
exit 1
fi
#moved here march 7, 2011
copyCronFile
if [ -s /var/www/html/redirect.php ]; then
chown webapps:webapps /var/www/html/redirect.php
fi
if [ ! -e /usr/local/bin/php ]; then
echo "*******************************************"
echo "*******************************************"
echo ""
echo "Cannot find /usr/local/bin/php"
echo "Please recompile php with custombuild, eg:"
echo "cd ${DA_PATH}/custombuild"
echo "./build all d"
echo ""
echo "*******************************************"
echo "*******************************************"
exit 1
fi
cd ${DA_PATH}
./directadmin i
RET=$?
cd ${DA_PATH}
./directadmin p
perl -pi -e 's/directadmin=OFF/directadmin=ON/' ${DA_PATH}/data/admin/services.status
echo "";
echo "System Security Tips:";
echo " http://help.directadmin.com/item.php?id=247";
echo "";
DACONF=${DA_PATH}/conf/directadmin.conf
if [ ! -s $DACONF ]; then
echo "";
echo "*********************************";
echo "*";
echo "* Cannot find $DACONF";
echo "* Please see this guide:";
echo "* http://help.directadmin.com/item.php?id=267";
echo "*";
echo "*********************************";
exit 1;
fi
if [ "${LAN}" = "1" ]; then
#link things up for the lan.
cd ${DA_PATH}
#get the server IP
IP=`grep -m1 ^ip= ./scripts/setup.txt | cut -d= -f2`;
LAN_IP=`./scripts/get_main_ip.sh`
if [ "${IP}" != "" ] && [ "${LAN_IP}" != "" ]; then
if [ "${IP}" = "${LAN_IP}" ]; then
echo "*** scripts/install.sh: Are you sure this is a LAN? The server IP matches the main system IP:${IP}"
sleep 2;
else
#Let us confirm that the LAN IP actually gives us the correct server IP.
echo "Confirming that '${WGET_PATH} ${WGET_OPTION} --bind-address=${LAN_IP} http://myip.directadmin.com' returns ${IP} ..."
EXTERNAL_IP=`${WGET_PATH} ${WGET_OPTION} --tries=3 --connect-timeout=6 --timeout=6 --bind-address=${LAN_IP} -q -O - http://myip.directadmin.com 2>&1`
BIND_RET=$?
if [ "${BIND_RET}" = "0" ]; then
#we got the IP WITH the bind
if [ "${EXTERNAL_IP}" = "${IP}" ]; then
echo "LAN IP SETUP: Binding to ${LAN_IP} did return the correct IP address. Completing last steps of Auto-LAN setup ..."
echo "Adding lan_ip=${LAN_IP} to directadmin.conf ..."
${DA_BIN} set lan_ip ${LAN_IP}
echo 'action=directadmin&value=restart' >> ${DA_TQ}
echo "Linking ${LAN_IP} to ${IP}"
NETMASK=`grep -m1 ^netmask= ./scripts/setup.txt | cut -d= -f2`;
echo "action=linked_ips&ip_action=add&ip=${IP}&ip_to_link=${LAN_IP}&apache=yes&dns=no&apply=yes&add_to_ips_list=yes&netmask=${NETMASK}" >> ${DA_TQ}.cb
${DA_PATH}/dataskq --custombuild
echo "Issuing custombuild rewrite_conf to insert ${LAN_IP} into main server VirtualHosts..."
${DA_PATH}/custombuild/build rewrite_confs
echo "LAN IP SETUP: Done."
else
echo "*** scripts/install.sh: LAN: when binding to ${LAN_IP}, wget returned external IP ${EXTERNAL_IP}, which is odd."
echo "Not automatically setting up the directadmin.conf:lan_ip=${LAN_IP}, and not automatically linking ${LAN_IP} to ${IP}"
sleep 2
fi
else
echo "*** scripts/install.sh: LAN: failed to double check if LAN IP ${LAN_IP} can be used bind for outbond connections"
if [ "${BIND_RET}" = "4" ]; then
echo "wget exited with code 4, implying a 'Network Failure', often meaning the --bind-address=${LAN_IP} does not work."
else
echo "wget exited with code ${BIND_RET}: please manually try the above wget call or check 'main wget' for info on this EXIT STATUS"
fi
echo "Not automatically setting up the directadmin.conf:lan_ip=${LAN_IP}, and not automatically linking ${LAN_IP} to ${IP}"
sleep 2
fi
fi
else
if [ "${IP}" = "" ]; then
echo "The ip= value in the scripts/setup.txt is blank"
fi
if [ "${LAN_IP}" = "" ]; then
echo "The ip returned from scripts/get_main_ip.sh is blank"
fi
fi
fi
exit ${RET}

23
update/scripts/ip_info.sh Normal file
View File

@@ -0,0 +1,23 @@
#!/bin/sh
DIG=/usr/bin/dig
WHOIS=/usr/bin/whois
if [ $# -ne 1 ]; then
echo "Usage:";
echo " $0 ip";
exit 1;
fi
if [ ! -x "$DIG" ]; then
echo "Cannot find $DIG or it's not executable.";
exit 2;
else
$DIG -x "$1" +noshort 2>&1
fi
if [ -x "$WHOIS" ]; then
$WHOIS "$1" 2>&1
fi
exit 0;

237
update/scripts/ipswap.sh Normal file
View File

@@ -0,0 +1,237 @@
#!/bin/sh
#script to change ips on a DA server.
#usage:
# $0 <oldip> <newip>
LOG=/var/log/directadmin/ipswap.log
MYUID=`/usr/bin/id -u`
if [ "$MYUID" != 0 ]; then
echo "You require Root Access to run this script";
exit 0;
fi
if [ $# != 2 ] && [ $# != 3 ]; then
echo "Usage:";
echo "$0 <oldip> <newip> [<file>]";
echo "you gave #$#: $0 $1 $2 $3";
exit 0;
fi
OLD_IP=$1
NEW_IP=$2
DIRECTADMIN=/usr/local/directadmin/directadmin
HAVE_HTTPD=1
HAVE_NGINX=0
HAVE_DOVECOT_PROXY=0
if [ -s ${DIRECTADMIN} ]; then
if [ "`${DIRECTADMIN} c | grep ^nginx= | cut -d= -f2`" -eq 1 ]; then
HAVE_OPENLITESPEED=0
HAVE_HTTPD=0
HAVE_NGINX=1
fi
if [ "`${DIRECTADMIN} c | grep ^openlitespeed= | cut -d= -f2`" -eq 1 ]; then
HAVE_OPENLITESPEED=1
HAVE_HTTPD=0
HAVE_NGINX=0
fi
if [ "`${DIRECTADMIN} c | grep ^nginx_proxy= | cut -d= -f2`" -eq 1 ]; then
HAVE_OPENLITESPEED=0
HAVE_HTTPD=1
HAVE_NGINX=1
fi
if [ "`${DIRECTADMIN} c | grep ^dovecot_proxy= | cut -d= -f2`" -eq 1 ]; then
HAVE_DOVECOT_PROXY=1
fi
fi
valid_ip()
{
#very very.. very basic validation. very basic.
VIP=$1
if [ "$VIP" = "" ]; then
echo 0;
return;
fi
#do not allow short-form IPv6 addresses.
IPV6_SHORT=`echo "$VIP" | grep -c ::`
if [ "${IPV6_SHORT}" -gt 0 ]; then
echo 0
else
echo 1
fi
}
die_if_bad_ip()
{
IP=$1
V=`valid_ip "$IP"`
if [ "$V" = "0" ]; then
echo "IP '$IP' is not valid.";
exit 1;
fi
}
die_if_bad_ip "${OLD_IP}"
die_if_bad_ip "${NEW_IP}"
log()
{
echo -e "$1";
echo -e "$1" >> $LOG;
}
swapfile()
{
if [ ! -e $1 ]; then
log "Cannot Find $1 to change the IPs. Skipping...";
return;
fi
TEMP="perl -pi -e 's/(^|[\s.=\/:])${OLD_IP}([\s.>:;])/\${1}${NEW_IP}\${2}/g' $1"
eval $TEMP;
log "$1\t: $OLD_IP -> $NEW_IP";
}
if [ $# = 3 ]; then
swapfile $3;
exit 0;
fi
IPFILE_OLD=/usr/local/directadmin/data/admin/ips/$OLD_IP
IPFILE_NEW=/usr/local/directadmin/data/admin/ips/$NEW_IP
NEW_IS_ALREADY_SERVER=0
if [ -s ${IPFILE_NEW} ]; then
echo "${IPFILE_NEW} already exists.";
NEW_IS_ALREADY_SERVER=`grep -c status=server ${IPFILE_NEW}`
if [ "${NEW_IS_ALREADY_SERVER}" -gt 0 ]; then
echo "it's also the server IP, so we're not going to overwrite it if we continue.";
echo -n "Do you want to continue swapping all instances of $OLD_IP with $NEW_IP, knowing we're not going to swap the actual IP file? (y/n) : ";
read YESNO;
if [ "$YESNO" != "y" ]; then
exit 0;
fi
fi
fi
if [ ! -e $IPFILE_OLD ]; then
echo -n "$IPFILE_OLD does not exist. Do you want to continue anyway? (y/n) : ";
read YESNO;
if [ "$YESNO" != "y" ]; then
exit 0;
fi
else
if [ "${NEW_IS_ALREADY_SERVER}" -gt 0 ]; then
#do not touch the new file, but get rid of the old one.
rm -f $IPFILE_OLD
else
mv -f $IPFILE_OLD $IPFILE_NEW
fi
fi
if [ "${HAVE_HTTPD}" -eq 1 ]; then
swapfile /etc/httpd/conf/httpd.conf
swapfile /etc/httpd/conf/extra/httpd-vhosts.conf
swapfile /etc/httpd/conf/ips.conf
fi
if [ "${HAVE_NGINX}" -eq 1 ]; then
swapfile /etc/nginx/nginx.conf
swapfile /etc/nginx/nginx-vhosts.conf
swapfile /etc/nginx/nginx-userdir.conf
swapfile /etc/nginx/directadmin-ips.conf
swapfile /etc/nginx/webapps.conf
swapfile /etc/nginx/webapps.ssl.conf
fi
if [ "${HAVE_OPENLITESPEED}" -eq 1 ]; then
swapfile /usr/local/lsws/conf/ips.conf
swapfile /usr/local/lsws/conf/listeners.conf
fi
swapfile /etc/proftpd.conf
swapfile /etc/proftpd.vhosts.conf
swapfile /etc/hosts
swapfile /usr/local/directadmin/scripts/setup.txt
swapfile /usr/local/directadmin/data/admin/ip.list
swapfile /usr/local/directadmin/data/admin/show_all_users.cache
swapfile /etc/virtual/domainips
swapfile /etc/virtual/helo_data
ULDDU=/usr/local/directadmin/data/users
for i in `ls $ULDDU`; do
{
if [ ! -d $ULDDU/$i ]; then
continue;
fi
swapfile $ULDDU/$i/user.conf
if [ "${HAVE_HTTPD}" -eq 1 ]; then
swapfile $ULDDU/$i/httpd.conf
fi
if [ "${HAVE_NGINX}" -eq 1 ]; then
swapfile $ULDDU/$i/nginx.conf
fi
if [ -e $ULDDU/$i/ip.list ]; then
swapfile $ULDDU/$i/ip.list
fi
swapfile $ULDDU/$i/user_ip.list
for j in `ls $ULDDU/$i/domains/*.conf; ls $ULDDU/$i/domains/*.ftp; ls $ULDDU/$i/domains/*.ip_list`; do
{
swapfile $j
};
done;
};
done;
OS=`uname`
if [ $OS = "FreeBSD" ]; then
DB_PATH=/etc/namedb
else
if [ -e /etc/debian_version ]; then
DB_PATH=/etc/bind
else
DB_PATH=/var/named
fi
fi
for i in `ls $DB_PATH/*.db`; do
{
swapfile $i
};
done;
if [ "${HAVE_DOVECOT_PROXY}" = "1" ]; then
#swap all /etc/virtual/*/passwd files proxy_maybe=y host=1.2.3.4
echo "action=rewrite&value=email_passwd" >> /usr/local/directadmin/data/task.queue
fi
echo "Updating Linked IPs"
echo "action=ipswap&value=linked_ips&old=$OLD_IP&new=$NEW_IP" >> /usr/local/directadmin/data/task.queue.cb
/usr/local/directadmin/dataskq d100 --custombuild
#this is needed to update the serial in the db files.
echo "action=rewrite&value=named" >> /usr/local/directadmin/data/task.queue
echo "action=cache&value=showallusers" >> /usr/local/directadmin/data/task.queue
if [ "${HAVE_HTTPD}" -eq 1 ]; then
echo "action=httpd&value=restart" >> /usr/local/directadmin/data/task.queue
fi
if [ "${HAVE_NGINX}" -eq 1 ]; then
echo "action=nginx&value=restart" >> /usr/local/directadmin/data/task.queue
fi
if [ "${HAVE_OPENLITESPEED}" -eq 1 ]; then
echo "action=litespeed&value=restart" >> /usr/local/directadmin/data/task.queue
fi
log "\n*** Done swapping $OLD_IP to $NEW_IP ***\n";

View File

@@ -0,0 +1,147 @@
#!/bin/sh
#Version: 0.1 ALPHA (use at your own risk!)
#Script is used to change the IP of all Users owned by Reseller on a DA server (including the Reseller himself).
#Written by DirectAdmin and Martynas Bendorius (smtalk)
#Usage: $0 <oldip> <newip> <reseller>
LOG=/var/log/directadmin/ipswap_reseller.log
MYUID=`/usr/bin/id -u`
if [ "$MYUID" != 0 ]; then
echo "You require Root Access to run this script";
exit 1;
fi
if [ $# != 2 ] && [ $# != 3 ] && [ $# != 4 ]; then
echo "Usage:";
echo "$0 <oldip> <newip> <reseller>";
echo "you gave #$#: $0 $1 $2 $3";
echo "";
echo "New IP must exist and be set as shared.";
exit 2;
fi
OLD_IP=$1
NEW_IP=$2
RESELLER=$3
HAVE_HTTPD=1
HAVE_NGINX=0
if [ -s ${DIRECTADMIN} ]; then
if [ "`${DIRECTADMIN} c | grep ^nginx= | cut -d= -f2`" -eq 1 ]; then
HAVE_HTTPD=0
HAVE_NGINX=1
fi
if [ "`${DIRECTADMIN} c | grep ^nginx_proxy= | cut -d= -f2`" -eq 1 ]; then
HAVE_HTTPD=1
HAVE_NGINX=1
fi
fi
log()
{
echo -e "$1";
echo -e "$1" >> $LOG;
}
swapfile()
{
if [ ! -e $1 ]; then
log "Cannot Find $1 to change the IPs. Skipping...";
return;
fi
TEMP="perl -pi -e 's/(^|[\s.=\/:])${OLD_IP}([\s.>:])/\${1}${NEW_IP}\${2}/g' $1"
eval $TEMP;
log "$1\t: $OLD_IP -> $NEW_IP";
}
IPFILE_OLD=/usr/local/directadmin/data/admin/ips/$OLD_IP
IPFILE_NEW=/usr/local/directadmin/data/admin/ips/$NEW_IP
if [ ! -e $IPFILE_NEW ]; then
echo -n "$IPFILE_NEW does not exist. Exiting... ";
exit 3;
fi
IP_STATUS=`grep status ${IPFILE_NEW} | cut -d= -f2`
if [ "${IP_STATUS}" != "shared" ]; then
echo "Please make the IP (${NEW_IP}) shared on reseller level."
exit 4;
fi
ULDDU=/usr/local/directadmin/data/users
if [ ! -e ${ULDDU}/${RESELLER}/users.list ]; then
echo "Reseller ${RESELLER} does not exist. Exiting... ";
exit 5;
fi
IP_LIST=${ULDDU}/${RESELLER}/ip.list
COUNT_IP=`grep -c ${NEW_IP} ${IP_LIST}`
if [ ${COUNT_IP} -eq 0 ]; then
echo "${NEW_IP} does not belong to ${RESELLER}. Please assign it to reseller and start the script again. Exiting."
exit 6;
fi
OS=`uname`
if [ $OS = "FreeBSD" ]; then
DB_PATH=/etc/namedb
else
if [ -e /etc/debian_version ]; then
DB_PATH=/etc/bind
else
DB_PATH=/var/named
fi
fi
for i in `cat ${ULDDU}/${RESELLER}/users.list && echo "${RESELLER}"`; do
{
if [ ! -d $ULDDU/$i ]; then
continue;
fi
swapfile $ULDDU/$i/user.conf
if [ "${HAVE_HTTPD}" -eq 1 ]; then
swapfile $ULDDU/$i/httpd.conf
fi
if [ "${HAVE_NGINX}" -eq 1 ]; then
swapfile $ULDDU/$i/nginx.conf
fi
if [ -e $ULDDU/$i/ip.list ]; then
swapfile $ULDDU/$i/ip.list
fi
swapfile $ULDDU/$i/user_ip.list
for j in `ls $ULDDU/$i/domains/*.conf; ls $ULDDU/$i/domains/*.ftp; ls $ULDDU/$i/domains/*.ip_list`; do
{
swapfile $j
};
done;
for d in `cat ${ULDDU}/$i/domains.list`; do
{
swapfile ${DB_PATH}/$d.db
echo "action=rewrite&value=named&domain=$d" >> /usr/local/directadmin/data/task.queue
for p in `cat ${ULDDU}/$i/domains/$d.pointers | cut -d= -f1 2>/dev/null`; do
{
swapfile ${DB_PATH}/$p.db
echo "action=rewrite&value=named&domain=$p" >> /usr/local/directadmin/data/task.queue
}
done;
};
done;
};
done;
echo "action=rewrite&value=ipcount" >> /usr/local/directadmin/data/task.queue
echo "action=rewrite&value=ips" >> /usr/local/directadmin/data/task.queue
echo "action=cache&value=showallusers" >> /usr/local/directadmin/data/task.queue
echo "action=rewrite&value=httpd" >> /usr/local/directadmin/data/task.queue
echo "Runing dataskq..."
/usr/local/directadmin/dataskq d
log "\n*** Done swapping $OLD_IP to $NEW_IP ***\n";
exit 0;

View File

@@ -0,0 +1,8 @@
#!/bin/sh
SYSTEMDDIR=/etc/systemd/system
if [ -d ${SYSTEMDDIR} ] && [ -e /usr/bin/systemctl ]; then
echo "yes";
exit 0;
fi
echo "no";
exit 1;

View File

@@ -0,0 +1,83 @@
#!/bin/sh
#Script to install majordomo
OS=`uname`
SERVER=http://files.directadmin.com/services/all/majordomo
ADDPATCHES=1
SOURCEPATH="/usr/local/directadmin/scripts/packages/majordomo-1.94.5"
if [ ! -e ${SOURCEPATH}/Makefile ]
then
echo "The source path for majordomo does not exist. Make sure the correct path is set in majordomo.sh";
exit 0;
fi
/bin/mkdir -p /etc/virtual/majordomo
MDGID=`id -g daemon`
if [ -e /etc/debian_version ]; then
/usr/sbin/groupadd nobody 2>/dev/null
/usr/sbin/useradd -d /etc/virtual/majordomo -g $MDGID -s /bin/false majordomo 2> /dev/null
elif [ "$OS" = "FreeBSD" ]; then
/usr/sbin/pw useradd majordomo -b /etc/virtual/majordomo -g daemon -s /sbin/nologin 2> /dev/null
else
/usr/sbin/useradd -d /etc/virtual/majordomo -g $MDGID majordomo -s /bin/false -n -r 2> /dev/null
fi
MDUID=`id -u majordomo`
/usr/bin/perl -pi -e 's/PERL = .*/PERL = \/usr\/bin\/perl/' ${SOURCEPATH}/Makefile;
/usr/bin/perl -pi -e 's/W_HOME = .*/W_HOME = \/etc\/virtual\/majordomo/' ${SOURCEPATH}/Makefile;
#Perl and Bash weren't getting along. MDUID wasn't showing up so I did it this way.
STR="/usr/bin/perl -pi -e 's/W_USER = .*/W_USER = ${MDUID}/' ${SOURCEPATH}/Makefile";
eval $STR;
STR="/usr/bin/perl -pi -e 's/W_GROUP = .*/W_GROUP = ${MDGID}/' ${SOURCEPATH}/Makefile";
eval $STR;
STR="/usr/bin/perl -pi -e 's/TMPDIR = .*/TMPDIR = \/tmp/' ${SOURCEPATH}/Makefile";
eval $STR;
#fix REALLY-TO value in digests file
STR="/usr/bin/perl -pi -e 's/\$ARGV\[0\];/\$ARGV\[0\].\${whereami};/' ${SOURCEPATH}/digest";
eval $STR;
STR="/usr/bin/perl -pi -e 's#/usr/test/majordomo#/etc/virtual/majordomo#' ${SOURCEPATH}/sample.cf";
eval $STR;
cd ${SOURCEPATH};
make wrapper
make install
make install-wrapper
/usr/bin/perl -pi -e 's#/usr/test/majordomo#/etc/virtual/majordomo#' /etc/virtual/majordomo/majordomo.cf
if [ $ADDPATCHES -eq 0 ]; then
exit 0;
fi
PATCH1=majordomo.patch
PATCH1_PATH=/etc/virtual/majordomo/${PATCH1}
if [ ! -s "${PATCH1_PATH}" ]; then
wget -O ${PATCH1_PATH} ${SERVER}/${PATCH1}
fi
if [ -s "${PATCH1_PATH}" ]; then
cd /etc/virtual/majordomo
patch -p0 < majordomo.patch
else
echo "Cannot find ${PATCH1_PATH} to patch majordomo.";
fi
#just to put up back where we were.. likely not needed.
cd ${SOURCEPATH};
chmod 750 /etc/virtual/majordomo
exit 0

View File

@@ -0,0 +1,433 @@
#!/bin/sh
# This script is written by Martynas Bendorius and DirectAdmin
# It is used to move domain from one user to another
# Official DirectAdmin webpage: http://www.directadmin.com
# Usage:
# ./move_domain.sh <domain> <olduser> <newuser>
VERSION=0.3
OS=`uname`
MYUID=`/usr/bin/id -u`
if [ "$MYUID" != 0 ]; then
echo "You require Root Access to run this script.";
exit 0;
fi
if [ $# != 3 ]; then
echo "Move Domain to User - v. $VERSION";
echo "";
echo "Usage:";
echo "$0 <domain> <olduser> <newuser>";
echo "you gave #$#: $0 $1 $2 $3";
exit 0;
fi
DOMAIN=$1
OLD_USER=$2
NEW_USER=$3
TEMP="grep -e '^$OLD_USER:' /etc/passwd | cut -d: -f6"
OLD_HOME=`eval $TEMP`
TEMP="grep -e '^$NEW_USER:' /etc/passwd | cut -d: -f6"
NEW_HOME=`eval $TEMP`
OLD_DOMAIN_DIR=${OLD_HOME}/domains/${DOMAIN}
NEW_DOMAIN_DIR=${NEW_HOME}/domains/${DOMAIN}
DATA_USER_OLD=/usr/local/directadmin/data/users/${OLD_USER}/
DATA_USER_NEW=/usr/local/directadmin/data/users/${NEW_USER}/
USER_OLD=${DATA_USER_OLD}domains.list
USER_NEW=${DATA_USER_NEW}domains.list
APACHE_PUBLIC_HTML=`/usr/local/directadmin/directadmin c | grep apache_public_html | cut -d= -f2`
PERL=/usr/bin/perl
IP_SWAP=/usr/local/directadmin/scripts/ipswap.sh
ROOT_GROUP=root
if [ "${OS}" = "FreeBSD" ]; then
ROOT_GROUP=wheel
fi
update_email_domain_dir()
{
#/etc/virtual/domain.com
DMNDIR=/etc/virtual/${DOMAIN}
if [ ! -e ${DMNDIR} ] && [ -e ${DMNDIR}_off ]; then
DMNDIR=${DMNDIR}_off
echo "domain ${DOMAIN} is suspended using ${DMNDIR}";
fi
if [ ! -e ${DMNDIR} ]; then
echo "Cannot find ${DMNDIR}, aborting swap of ${DMNDIR}."
return;
fi
#passwd (doveoct)
#aliases
#filter (home path)
#usage.cache
#majordomo/list.aliases: $OLD_USER@$DOMAIN
#majordomo/lists/*: $OLD_USER@$DOMAIN
#TEMP="$PERL -pi -e 's#${OLD_HOME}#${NEW_HOME}#' ${DMNDIR}/passwd"
#eval $TEMP;
OLD_GID=`/usr/bin/id -g mail`
OLD_UID=`/usr/bin/id -u $OLD_USER`
NEW_GID=`/usr/bin/id -g mail`
NEW_UID=`/usr/bin/id -u $NEW_USER`
#Firt find the uid/gid swap them.
TEMP="perl -pi -e 's#:${OLD_UID}:${OLD_GID}::${OLD_HOME}/#:${NEW_UID}:${NEW_GID}::${NEW_HOME}/#' ${DMNDIR}/passwd"
eval $TEMP;
#/etc/virtual/domain.com/aliases
TEMP="$PERL -pi -e 's/(^|\s|:)${OLD_USER}(:|\$|,)/\${1}${NEW_USER}\${2}/g' ${DMNDIR}/aliases"
eval $TEMP;
eval $TEMP; #for the case of admin:admin where there is no white space. Needs to be run twice.
TEMP="$PERL -pi -e 's#${OLD_HOME}#${NEW_HOME}#' ${DMNDIR}/filter"
eval $TEMP;
if [ -e ${DMNDIR}/usage.cache ]; then
TEMP="$PERL -pi -e 's/^${OLD_USER}:/${NEW_USER}/' ${DMNDIR}/usage.cache"
eval $TEMP;
fi
OLD_EMAIL=${OLD_USER}@${DOMAIN}
NEW_EMAIL=${NEW_USER}@${DOMAIN}
if [ -e ${DMNDIR}/majordomo ]; then
TEMP="$PERL -pi -e 's/${OLD_EMAIL}/${NEW_EMAIL}/' ${DMNDIR}/majordomo/list.aliases";
eval $TEMP
TEMP="$PERL -pi -e 's/${OLD_EMAIL}/${NEW_EMAIL}/' ${DMNDIR}/majordomo/lists/*";
eval $TEMP
fi
}
update_email_settings()
{
echo "Updating email settings."
#/etc/virtual/domainowners
#/etc/virtual/snidomains
#/etc/virtual/domain.com(_off) (this will be large)
#/home/username/.spamassassin/user_spam/user@domain.com
#/home/username/imap/domain.com
#/var/spool/virtual/domain.com (permissions only)
#/etc/dovecot/conf/sni/domain.com.conf
#domainowners
TEMP="$PERL -pi -e 's/^${DOMAIN}: ${OLD_USER}\$/${DOMAIN}: ${NEW_USER}/' /etc/virtual/domainowners"
eval $TEMP
#snidomains
if [ -s /etc/virtual/snidomains ]; then
TEMP="$PERL -pi -e 's/:${OLD_USER}:${DOMAIN}\$/:${NEW_USER}:${DOMAIN}/' /etc/virtual/snidomains"
eval $TEMP
fi
#repeat for domain pointers too.
#at this stage, the domain.com.pointers file has already been moved.
for p in `cat /usr/local/directadmin/data/users/${NEW_USER}/domains/${DOMAIN}.pointers | cut -d= -f1`; do
{
TEMP="$PERL -pi -e 's/^${p}: ${OLD_USER}\$/${p}: ${NEW_USER}/' /etc/virtual/domainowners"
eval $TEMP
};
done;
#/etc/virtual/domain.com
update_email_domain_dir
#/home/username/.spamassassin/user_spam/user@domain.com
OLD_SADIR=${OLD_HOME}/.spamassassin/user_spam
NEW_SADIR=${NEW_HOME}/.spamassassin/user_spam
#if it doesnt exist, dont bother
if [ -e ${OLD_SADIR} ]; then
mkdir -p $NEW_SADIR
mv ${OLD_SADIR}/*@${DOMAIN} ${NEW_SADIR}/
chown -R ${NEW_USER}:mail ${NEW_SADIR}
chmod 771 ${NEW_SADIR}
chmod 660 ${NEW_SADIR}/*
fi
#/home/username/imap/domain.com
OLD_IMAP=${OLD_HOME}/imap/${DOMAIN}
NEW_IMAP=${NEW_HOME}/imap/${DOMAIN}
if [ -e ${OLD_IMAP} ]; then
if [ -e ${NEW_IMAP} ]; then
echo "$NEW_IMAP already exists.. merging as best we can.";
mv -f ${OLD_IMAP}/* ${NEW_IMAP}/
else
if [ ! -e "${NEW_HOME}/imap" ]; then
mkdir -p ${NEW_HOME}/imap
chown ${NEW_USER}:mail ${NEW_HOME}/imap
chmod 770 ${NEW_HOME}/imap
fi
mv -f ${OLD_IMAP} ${NEW_IMAP}
fi
chown -R ${NEW_USER}:mail ${NEW_IMAP}
chmod -R 770 ${NEW_IMAP}
fi
#symlinks for domain pointers
for p in `cat /usr/local/directadmin/data/users/${NEW_USER}/domains/${DOMAIN}.pointers | cut -d= -f1`; do
{
ALIAS=${NEW_HOME}/imap/$p
ln -s ${DOMAIN} ${ALIAS}
chown -h ${NEW_USER}:mail ${ALIAS}
};
done;
#/var/spool/virtual/domain.com (permissions only)
VPV=/var/spool/virtual/${DOMAIN}
if [ -e ${VPV} ]; then
chown -R ${NEW_USER}:mail $VPV
fi
#/etc/dovecot/conf/sni/domain.com.conf
SNI_CONF=/etc/dovecot/conf/sni/${DOMAIN}.conf
if [ -s ${SNI_CONF} ]; then
TEMP="/usr/bin/perl -pi -e 's#${DATA_USER_OLD}#${DATA_USER_NEW}#g' ${SNI_CONF}"
eval $TEMP;
fi
}
update_ftp_settings()
{
echo "Updating ftp settings."
#/etc/proftpd.passwd
#/usr/local/directadmin/data/users/user/ftp.passwd
#/etc/proftpd.vhosts.conf
#for the password files, we only chagne the user@domain.com accounts.
#the system account isn't touched.
OLD_GID=`/usr/bin/id -g $OLD_USER`
OLD_UID=`/usr/bin/id -u $OLD_USER`
NEW_GID=`/usr/bin/id -g $NEW_USER`
NEW_UID=`/usr/bin/id -u $NEW_USER`
#proftpd.passwd. Firt find the uid/gid and homedir matchup and swap them.
TEMP="perl -pi -e 's#:${OLD_UID}:${OLD_GID}:(domain|user|custom):${OLD_DOMAIN_DIR}#:${NEW_UID}:${NEW_GID}:\${1}:${NEW_DOMAIN_DIR}#' /etc/proftpd.passwd"
eval $TEMP;
#proftpd.passwd ... then whatever is leftover (eg, anonymous)
TEMP="$PERL -pi -e 's#:${OLD_DOMAIN_DIR}#:${NEW_DOMAIN_DIR}#' /etc/proftpd.passwd"
eval $TEMP
#ftp.passwd ... this one is messier..
#take all accounts with /home/user/domain/domain.com in them, and move them to the new ftp.passwd, with the new home.
OLD_FTP=/usr/local/directadmin/data/users/${OLD_USER}/ftp.passwd
NEW_FTP=/usr/local/directadmin/data/users/${NEW_USER}/ftp.passwd
TEMP_FTP=/usr/local/directadmin/data/users/${OLD_USER}/ftp.passwd.temp
grep ":$OLD_DOMAIN_DIR" $OLD_FTP > $TEMP_FTP
TEMP="$PERL -pi -e 's#:${OLD_DOMAIN_DIR}#:${NEW_DOMAIN_DIR}#' $TEMP_FTP"
eval $TEMP
cat $TEMP_FTP >> $NEW_FTP
#now, take out the old paths
grep -v ":$OLD_DOMAIN_DIR" $OLD_FTP > $TEMP_FTP
mv -f $TEMP_FTP $OLD_FTP
chown root:ftp $OLD_FTP
}
update_da_settings()
{
echo "Moving domain data to the ${NEW_USER} user."
mv -f ${OLD_DOMAIN_DIR} ${NEW_DOMAIN_DIR}
mv -f /usr/local/directadmin/data/users/${OLD_USER}/domains/${DOMAIN}.* /usr/local/directadmin/data/users/${NEW_USER}/domains/
echo "Setting ownership for ${DOMAIN} domain."
chown -R ${NEW_USER}:${NEW_USER} ${NEW_DOMAIN_DIR}
if [ "$APACHE_PUBLIC_HTML" -eq 1 ]; then
echo "apache_public_html=1 is set, updating public_html and private_html in ${NEW_DOMAIN_DIR}";
chmod 750 ${NEW_DOMAIN_DIR}/public_html ${NEW_DOMAIN_DIR}/private_html
chgrp apache ${NEW_DOMAIN_DIR}/public_html ${NEW_DOMAIN_DIR}/private_html
fi
if [ -e ${NEW_DOMAIN_DIR}/stats ]; then
echo "Setting stats directory ownership for ${DOMAIN} domain.";
chown -R root:${ROOT_GROUP} ${NEW_DOMAIN_DIR}/stats
fi
echo "Removing domain from ${OLD_USER} user."
$PERL -pi -e "s#^${DOMAIN}\n##g" ${USER_OLD}
echo "Adding domain to ${NEW_USER} user."
echo "${DOMAIN}" >> ${USER_NEW}
$PERL -pi -e "s#/usr/local/directadmin/data/users/${OLD_USER}/#/usr/local/directadmin/data/users/${NEW_USER}/#g" /usr/local/directadmin/data/users/${NEW_USER}/domains/${DOMAIN}.*
$PERL -pi -e "s#${OLD_HOME}/#${NEW_HOME}/#g" /usr/local/directadmin/data/users/${NEW_USER}/domains/${DOMAIN}.*
#ensure the user.conf doesn't have the old domain. No need for new User, as they'd already have a default.
USER_CONF=${DATA_USER_OLD}/user.conf
C=`grep -c "^domain=${DOMAIN}\$" $USER_CONF`
if [ "${C}" -gt 0 ]; then
#figure out a new default domain..
DEFAULT_DOMAIN=`cat ${USER_OLD} | head -n1`
#may be filled.. may be empty.
perl -pi -e "s/^domain=${DOMAIN}\$/domain=${DEFAULT_DOMAIN}/" ${USER_CONF}
#if the new default domain exists, reset the ~/public_html link.
PUB_LINK=${OLD_HOME}/public_html
NEW_DEF_DOMAIN_DIR=${OLD_HOME}/domains/${DEFAULT_DOMAIN}/public_html
NEW_DEF_DOMAIN_DIR_RELATIVE=./domains/${DEFAULT_DOMAIN}/public_html
if [ -h "${PUB_LINK}" ] && [ "${DEFAULT_DOMAIN}" != "" ] && [ -d "${NEW_DEF_DOMAIN_DIR}" ]; then
rm -f ${PUB_LINK}
ln -s ${NEW_DEF_DOMAIN_DIR_RELATIVE} ${PUB_LINK}
chown -h ${OLD_USER}:${OLD_USER} ${PUB_LINK}
fi
fi
echo "Changing domain owner."
for i in `ls /usr/local/directadmin/data/users/${NEW_USER}/domains/${DOMAIN}.conf`; do { $PERL -pi -e "s/username=${OLD_USER}/username=${NEW_USER}/g" $i; }; done;
#ip swapping, if needed.
#empty the domain.ip_list, except 1 IP.
USER_PATH=/usr/local/directadmin/data/users/${NEW_USER}
OLD_IP=`grep "^ip=" ${USER_PATH}/domains/${DOMAIN}.conf | cut -d= -f2`
NEW_IP=`grep "^ip=" ${USER_PATH}/user.conf | cut -d= -f2`
if [ "${OLD_IP}" != "${NEW_IP}" ]; then
echo "The old IP (${OLD_IP}) does not match the new IP (${NEW_IP}). Swapping...";
#./ipswap.sh <oldip> <newip> [<file>]
$IP_SWAP $OLD_IP $NEW_IP ${USER_PATH}/domains/${DOMAIN}.conf
$IP_SWAP $OLD_IP $NEW_IP ${USER_PATH}/domains/${DOMAIN}.ftp
if [ "${OS}" = "FreeBSD" ]; then
$IP_SWAP $OLD_IP $NEW_IP /etc/namedb/${DOMAIN}.db
else
if [ -e /etc/debian_version ]; then
$IP_SWAP $OLD_IP $NEW_IP /etc/bind/${DOMAIN}.db
else
$IP_SWAP $OLD_IP $NEW_IP /var/named/${DOMAIN}.db
fi
fi
echo "${NEW_IP}" > ${USER_PATH}/domains/${DOMAIN}.ip_list
#update the serial:
echo "action=rewrite&value=named&domain=${DOMAIN}" >> /usr/local/directadmin/data/task.queue
fi
#Update .htaccess files in case there is a protected password directory.
PROTECTED_LIST=${NEW_DOMAIN_DIR}/.htpasswd/.protected.list
if [ -s "${PROTECTED_LIST}" ]; then
echo "Updating protected directories via ${PROTECTED_LIST}";
for i in `cat ${PROTECTED_LIST}`; do
{
D=$NEW_HOME/$i
if [ ! -d ${D} ]; then
echo "Cannot find a directory at ${D}";
continue;
fi
HTA=${D}/.htaccess
if [ ! -s ${HTA} ]; then
echo "${HTA} appears to be empty.";
continue;
fi
$PERL -pi -e "s#AuthUserFile ${OLD_HOME}/#AuthUserFile ${NEW_HOME}/#" ${HTA}
};
done;
fi
#complex bug: if multi-ip was used, should go into the zone and surgically remove the old ips from the zone, leaving only the NEW_IP.
#this is needed to update "show all users" cache.
echo "action=cache&value=showallusers" >> /usr/local/directadmin/data/task.queue
#this is needed to rewrite /usr/local/directadmin/data/users/USERS/httpd.conf
echo "action=rewrite&value=httpd" >> /usr/local/directadmin/data/task.queue
/usr/local/directadmin/dataskq d
}
update_awstats()
{
TEMP="/usr/bin/perl -pi -e 's#/home/${OLD_USER}/#/home/${NEW_USER}/#g' /home/${NEW_USER}/domains/${DOMAIN}/awstats/.data/*.conf"
eval $TEMP;
TEMP="/usr/bin/perl -pi -e 's#/home/${OLD_USER}/#/home/${NEW_USER}/#g' /home/${NEW_USER}/domains/${DOMAIN}/awstats/awstats.pl"
eval $TEMP;
#And for subdomains:
TEMP="/usr/bin/perl -pi -e 's#/home/${OLD_USER}/#/home/${NEW_USER}/#g' /home/${NEW_USER}/domains/${DOMAIN}/awstats/*/.data/*.conf"
eval $TEMP;
TEMP="/usr/bin/perl -pi -e 's#/home/${OLD_USER}/#/home/${NEW_USER}/#g' /home/${NEW_USER}/domains/${DOMAIN}/awstats/*/awstats.pl"
eval $TEMP;
}
doChecks()
{
if [ ! -e ${USER_OLD} ]; then
echo "File ${USER_OLD} does not exist. Can not continue."
exit 1;
fi
if [ "${DOMAIN}" = "" ]; then
echo "The domain is blank";
exit 1;
fi
if [ "${OLD_HOME}" = "" ]; then
echo "the old home is blank";
exit 1;
fi
if [ "${NEW_HOME}" = "" ]; then
echo "the new home is blank";
exit 1;
fi
if [ ! -e ${USER_NEW} ]; then
echo "File ${USER_NEW} does not exist. Can not continue."
exit 1;
fi
if [ "`grep -wc ${DOMAIN} $USER_OLD`" = "0" ]; then
echo "Domain ${DOMAIN} is not owned by ${OLD_USER} user."
exit 1;
fi
if [ ! -d ${OLD_DOMAIN_DIR} ]; then
echo "Direcory ${OLD_DOMAIN_DIR} does not exist. Can not continue."
exit 1;
fi
if [ -d ${NEW_DOMAIN_DIR} ]; then
echo "Direcory ${NEW_DOMAIN_DIR} exists. Can not continue."
exit 1;
fi
if [ ! -e $PERL ]; then
echo "$PERL does not exist.";
exit 1;
fi
}
doChecks
update_da_settings
update_email_settings
update_ftp_settings
update_awstats
echo "Domain has been moved to ${NEW_USER} user."
exit 0;

View File

@@ -0,0 +1,105 @@
#!/bin/sh
# This script is written by Martynas Bendorius and DirectAdmin
# It is used to move user from one reseller to another
# Official DirectAdmin webpage: http://www.directadmin.com
# Usage:
# ./move_user_to_reseller.sh <user> <oldreseller> <newreseller>
MYUID=`/usr/bin/id -u`
if [ "$MYUID" != 0 ]; then
echo "You require Root Access to run this script";
exit 0;
fi
if [ $# != 3 ]; then
echo "Usage:";
echo "$0 <user> <oldreseller> <newreseller>";
echo "you gave #$#: $0 $1 $2 $3";
exit 0;
fi
OLD_RESELLER=$2
NEW_RESELLER=$3
RESELLER_OLD=/usr/local/directadmin/data/users/$2/users.list
RESELLER_NEW=/usr/local/directadmin/data/users/$3/users.list
USERN=$1
if [ ! -e ${RESELLER_OLD} ]; then
echo "File ${RESELLER_OLD} does not exist. Can not continue."
exit 1;
fi
if [ ! -e ${RESELLER_NEW} ]; then
echo "File ${RESELLER_NEW} does not exist. Can not continue."
exit 1;
fi
if [ "`grep -wc $USERN $RESELLER_OLD`" = "0" ]; then
echo "User $USERN is not owned by $2 reseller"
exit 1;
fi
if [ ! -e /usr/bin/perl ]; then
echo "/usr/bin/perl does not exist";
exit 1;
fi
isOwned()
{
IP=$1
IPF=/usr/local/directadmin/data/admin/ips/$IP
if [ ! -s $IPF ]; then
#good spot for an error message, but can't echo anything
echo "0";
return;
fi
IPSTATUS=`grep status= $IPF | cut -d= -f2`;
if [ "$IPSTATUS" = "owned" ]; then
echo "1";
else
echo "0";
fi
}
#ensure IPs are brought forward
for i in `cat /usr/local/directadmin/data/users/$USERN/user_ip.list`; do
{
if [ "`isOwned $i`" = "1" ]; then
echo "$i is owned. Moving the IP to the new Reseller";
perl -pi -e "s#$i\n##g" /usr/local/directadmin/data/users/$OLD_RESELLER/ip.list
echo "$i" >> /usr/local/directadmin/data/users/$NEW_RESELLER/ip.list
perl -pi -e "s#reseller=$OLD_RESELLER#reseller=$NEW_RESELLER#g" /usr/local/directadmin/data/admin/ips/$i
else
echo "$i is shared. Leaving the IP with the old Reseller";
fi
};
done;
echo "Removing user from $2 reseller"
perl -pi -e "s#$USERN\n##g" /usr/local/directadmin/data/users/$2/users.list
echo "Adding user to $3 reseller"
echo "$USERN" >> /usr/local/directadmin/data/users/$3/users.list
echo "Changing user owner"
for i in `ls /usr/local/directadmin/data/users/$USERN/domains/*.conf`; do { perl -pi -e "s/creator=$2/creator=$3/g" $i; }; done;
#change the user.conf
perl -pi -e "s/creator=$2/creator=$3/" /usr/local/directadmin/data/users/$USERN/user.conf
#this is needed to update "show all users" cache.
echo "action=cache&value=showallusers" >> /usr/local/directadmin/data/task.queue
echo "action=rewrite&value=httpd&user=$USERN" >> /usr/local/directadmin/data/task.queue
#messy bit that removes the user from the backup_crons.list, but only for type=reseller backups.
#the user is left in the admin backups still in the type=admin backups.
perl -pi -e "s/select[0-9]+=$USERN&(.*)(type=reseller)/\$1\$2/" /usr/local/directadmin/data/admin/backup_crons.list
echo "User has been moved to $3"
exit 0;

126
update/scripts/named Normal file
View File

@@ -0,0 +1,126 @@
#!/bin/bash
#
# named This shell script takes care of starting and stopping
# named (BIND DNS server).
#
# chkconfig: - 55 45
# description: named (BIND) is a Domain Name Server (DNS) \
# that is used to resolve host names to IP addresses.
# probe: true
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "${NETWORKING}" = "no" ] && exit 0
[ -f /etc/sysconfig/named ] && . /etc/sysconfig/named
[ -f /usr/sbin/named ] || exit 0
[ -f ${ROOTDIR}/etc/named.conf ] || exit 0
RETVAL=0
prog="named"
start() {
# Start daemons.
if [ -n "`/sbin/pidof named`" ]; then
echo -n $"$prog: already running"
return 1
fi
echo -n $"Starting $prog: "
if [ -n "${ROOTDIR}" -a "x${ROOTDIR}" != "x/" ]; then
OPTIONS="${OPTIONS} -t ${ROOTDIR}"
fi
# Since named doesn't return proper exit codes at the moment
# (won't be fixed before 9.2), we can't use daemon here - emulate
# its functionality
base=$prog
named -u named ${OPTIONS}
RETVAL=$?
usleep 100000
if [ -z "`/sbin/pidof named`" ]; then
# The child processes have died after fork()ing, e.g.
# because of a broken config file
RETVAL=1
fi
[ $RETVAL -ne 0 ] && failure $"$base startup"
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/named && success $"$base startup"
echo
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Stopping $prog: "
killproc named
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/named
echo
return $RETVAL
}
rhstatus() {
status named
return $?
}
restart() {
stop
start
}
reload() {
#/usr/sbin/rndc reload >/dev/null 2>&1 || /usr/bin/killall -HUP named
PID=/var/run/named/named.pid
if [ ! -e $PID ]; then
PID=/var/run/named.pid
fi
RET=0;
if [ ! -e $PID ]; then
killall -HUP named
RET=$?
else
kill -HUP `cat $PID`
RET=$?
fi
return $RET
}
probe() {
# named knows how to reload intelligently; we don't want linuxconf
# to offer to restart every time
/usr/sbin/rndc reload >/dev/null 2>&1 || echo start
return $?
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
rhstatus
;;
restart)
restart
;;
condrestart)
[ -f /var/lock/subsys/named ] && restart
;;
reload)
reload
;;
probe)
probe
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload|probe}"
exit 1
esac
exit $?

48
update/scripts/ncftp.sh Normal file
View File

@@ -0,0 +1,48 @@
#!/bin/sh
CWD=`pwd`
NAME=ncftp
VERSION=3.2.6
PRIMARY=http://files.directadmin.com/services
SECONDARY=http://files3.directadmin.com/services
SAVE=/usr/local/directadmin/scripts/packages
FILE=${NAME}-${VERSION}-src.tar.gz
DIR=${NAME}-${VERSION}
OS=`uname`
if [ "$OS" = "FreeBSD" ]; then
WGET=/usr/local/bin/wget
else
WGET=/usr/bin/wget
fi
if [ ! -s $SAVE/$FILE ]; then
$WGET -O $SAVE/$FILE $PRIMARY/$FILE
fi
if [ ! -s $SAVE/$FILE ]; then
$WGET -O $SAVE/$FILE $SECONDARY/$FILE
fi
if [ ! -s $SAVE/$FILE ]; then
echo "Unable to get $SAVE/$FILE"
exit 1;
fi
cd $SAVE
tar -xz --hard-dereference -f $FILE
tar xzf $FILE
cd $DIR
./configure --prefix=/usr
make
make install
if [ "$?" -eq 0 ]; then
cd ..
rm -rf ${DIR}
fi
cd $CWD;

View File

@@ -0,0 +1,4 @@
[PHP]
safe_mode = Off
open_basedir =
disable_functions =

View File

@@ -0,0 +1,3 @@
<?php
header("Location: http://".$_SERVER['HTTP_HOST'].":2222");
?>

81
update/scripts/removeip Normal file
View File

@@ -0,0 +1,81 @@
#!/bin/bash
OS=`uname`
#remove the active ip from eth0:#
if [ "${OS}" = "FreeBSD" ]; then
ETH_DEV=dc0
else
ETH_DEV=eth0
fi
DACONF=/usr/local/directadmin/conf/directadmin.conf
if [ -s ${DACONF} ]; then
if grep -m1 -q '^ethernet_dev=' ${DACONF}; then
ETH_DEV=`grep -m1 '^ethernet_dev=' ${DACONF} | cut -d= -f2 | cut -d: -f1`
fi
fi
SBIN_IP=/sbin/ip
if [ ! -x ${SBIN_IP} ] && [ -x /usr/sbin/ip ]; then
SBIN_IP=/usr/sbin/ip
fi
if [ ! -x ${SBIN_IP} ] && [ "${OS}" != "FreeBSD" ]; then
echo "Cannot find ${SBIN_IP} nor in other locations."
exit 2
fi
# we need the ip to delete
if [ $# -ne "1" ] && [ $# -ne "2" ]; then
echo "Usage: $0 <ip> (<condensed_ipv6>)";
exit 1;
fi
if [ "${OS}" = "FreeBSD" ]; then
if /sbin/ifconfig | grep -m1 -q " $1 "; then
/sbin/ifconfig $ETH_DEV inet $1 -alias
fi
else
if ${SBIN_IP} a | grep -m1 -q " $1/"; then
#"ip" accepts IPs without netmasks, but shows a warning that the feature might not be avail in the future, this we delete IP with its mask
IP_TO_REMOVE="`${SBIN_IP} a | grep -m1 -o \" ${1}/[0-9]*\" | awk '{print $1}'`"
${SBIN_IP} addr del ${IP_TO_REMOVE} dev ${ETH_DEV}
if [ "$?" -ne 0 ] && /sbin/ip a | grep -m1 -q " $1/"; then
#old code, should not be needed anymore, but we fallback to it if IP is still there
IP=$1
IPv6=0
if [ $# -eq "2" ] && [ "$2" != "" ]; then
IP=$2
/sbin/ifconfig $ETH_DEV del $IP/64
IPv6=1
fi
#for each eth0:#, if ifconfig eth0:# has $1 (the ip) delete eth0:#
for i in `/sbin/ifconfig | grep $ETH_DEV: | cut -d\ -f1 | cut -d: -f1,2`; do
{
NUMIP=`/sbin/ifconfig $i | grep -c "${IP} "`;
if [ $NUMIP -gt "0" ];
then
{
#we found the interface with the ip
COLCOUNT=`echo $i | grep -c :`
if [ "${COLCOUNT}" -gt 0 ] && [ -e /etc/debian_version ] && [ "${IPv6}" -eq 0 ]; then
/sbin/ifconfig $i down
else
/sbin/ifconfig $i del $IP #remove from the interface
fi
#it appears as though the ip is automatically removed from `route`
exit 0
}
fi
};
done
fi
fi
fi
exit 0
#can't find it, it must be gone

View File

@@ -0,0 +1,115 @@
#!/bin/sh
#VERSION=2.0
# This script is written by Martynas Bendorius and DirectAdmin
# It is used to rename database from old name to new one
# Official DirectAdmin webpage: http://www.directadmin.com
# Usage:
# ./rename_database.sh <olddatabase> <newdatabase>
MYUID=`/usr/bin/id -u`
if [ "$MYUID" != 0 ]; then
echo "You require Root Access to run this script";
exit 0;
fi
if [ $# != 2 ]; then
echo "Usage:";
echo "$0 <olddatabase> <newdatabase>";
echo "you gave #$#: $0 $1 $2";
exit 0;
fi
OLDUSER_DATABASE="$1"
NEWUSER_DATABASE="$2"
OLDUSER_ESCAPED_DATABASE="`echo ${OLDUSER_DATABASE} | perl -p0 -e 's|_|\\\_|'`"
NEWUSER_ESCAPED_DATABASE="`echo ${NEWUSER_DATABASE} | perl -p0 -e 's|_|\\\_|'`"
MYSQLDUMP=/usr/local/mysql/bin/mysqldump
if [ ! -e ${MYSQLDUMP} ]; then
MYSQLDUMP=/usr/local/bin/mysqldump
fi
if [ ! -e ${MYSQLDUMP} ]; then
MYSQLDUMP=/usr/bin/mysqldump
fi
if [ ! -e ${MYSQLDUMP} ]; then
echo "Cannot find ${MYSQLDUMP}"
exit 1
fi
MYSQL=/usr/local/mysql/bin/mysql
if [ ! -e ${MYSQL} ]; then
MYSQL=/usr/local/bin/mysql
fi
if [ ! -e ${MYSQL} ]; then
MYSQL=/usr/bin/mysql
fi
if [ ! -e ${MYSQL} ]; then
echo "Cannot find ${MYSQL}"
exit 1
fi
DEFM=--defaults-extra-file=/usr/local/directadmin/conf/my.cnf
# If MySQL a new database does not exist, create it and copy all the data from the old database, then drop the old database
if ! ${MYSQL} ${DEFM} --skip-column-names -e "SHOW DATABASES LIKE '${NEWUSER_DATABASE}';" -s | grep -m1 -q "${NEWUSER_DATABASE}"; then
if ! ${MYSQL} ${DEFM} --skip-column-names -e "SHOW DATABASES LIKE '${OLDUSER_DATABASE}';" -s | grep -m1 -q "${OLDUSER_DATABASE}"; then
echo "Specified database name does not exist: ${OLDUSER_DATABASE}"
exit 1
fi
#Count the number of tables in current database
OLD_TABLES_COUNT="`${MYSQL} ${DEFM} -D \"${OLDUSER_DATABASE}\" --skip-column-names -e 'SHOW TABLES;' | wc -l`"
#Create an empty new database, \` is needed for databases having "-" in it's name, so that no math would be done by sql :)
${MYSQL} ${DEFM} -e "CREATE DATABASE \`${NEWUSER_DATABASE}\`;"
echo "Dumping+restoring ${OLDUSER_DATABASE} -> ${NEWUSER_DATABASE}..."
#Dump+restore to the new database on the fly
${MYSQLDUMP} ${DEFM} --routines "${OLDUSER_DATABASE}" | ${MYSQL} ${DEFM} -D "${NEWUSER_DATABASE}"
#Count the number of tables in new database
NEW_TABLES_COUNT="`${MYSQL} ${DEFM} -D \"${NEWUSER_DATABASE}\" --skip-column-names -e 'SHOW TABLES;' | wc -l`"
if echo "${OLD_TABLES_COUNT}" | grep -qE ^\-?[0-9]+$; then
COUNT1_IS_NUMERIC=true
else
COUNT1_IS_NUMERIC=false
fi
if echo "${NEW_TABLES_COUNT}" | grep -qE ^\-?[0-9]+$; then
COUNT2_IS_NUMERIC=true
else
COUNT2_IS_NUMERIC=false
fi
#Drop the old database if the count of tables matches
if [ ${OLD_TABLES_COUNT} -eq ${NEW_TABLES_COUNT} ] && ${COUNT1_IS_NUMERIC} && ${COUNT2_IS_NUMERIC}; then
${MYSQL} ${DEFM} -e "DROP DATABASE \`${OLDUSER_DATABASE}\`;"
echo "Database has been renamed successfully: ${OLDUSER_DATABASE} -> ${NEWUSER_DATABASE}"
if [ `${MYSQL} ${DEFM} -e "select count(*) from mysql.db where db='${OLDUSER_ESCAPED_DATABASE}'" -s` -ge 1 ]; then
echo "Updating mysql.db..."
${MYSQL} ${DEFM} -e "UPDATE mysql.db set db='${NEWUSER_ESCAPED_DATABASE}' WHERE db='${OLDUSER_ESCAPED_DATABASE}' OR db='${OLDUSER_DATABASE}';"
fi
if [ `${MYSQL} ${DEFM} -e "select count(*) from mysql.columns_priv where db='${OLDUSER_ESCAPED_DATABASE}'" -s` -ge 1 ]; then
echo "Updating mysql.columns_priv..."
${MYSQL} ${DEFM} -e "UPDATE mysql.columns_priv set db='${NEWUSER_ESCAPED_DATABASE}' WHERE db='${OLDUSER_ESCAPED_DATABASE}' OR db='${OLDUSER_DATABASE}';"
fi
if [ `${MYSQL} ${DEFM} -e "select count(*) from mysql.procs_priv where db='${OLDUSER_ESCAPED_DATABASE}'" -s` -ge 1 ]; then
echo "Updating mysql.procs_priv..."
${MYSQL} ${DEFM} -e "UPDATE mysql.procs_priv set db='${NEWUSER_ESCAPED_DATABASE}' WHERE db='${OLDUSER_ESCAPED_DATABASE}' OR db='${OLDUSER_DATABASE}';"
fi
if [ `${MYSQL} ${DEFM} -e "select count(*) from mysql.tables_priv where db='${OLDUSER_ESCAPED_DATABASE}'" -s` -ge 1 ]; then
echo "Updating mysql.tables_priv..."
${MYSQL} ${DEFM} -e "UPDATE mysql.tables_priv set db='${NEWUSER_ESCAPED_DATABASE}' WHERE db='${OLDUSER_ESCAPED_DATABASE}' OR db='${OLDUSER_DATABASE}';"
fi
exit 0
else
#Error and exit if the number of tables doesn't match
echo "Database ${NEWUSER_DATABASE} doesn't have as many tables as ${OLDUSER_DATABASE} after restoration. Not removing ${OLDUSER_DATABASE}. Exiting..."
exit 1
fi
else
# If MySQL new database name already exists on the system (it shouldn't), error and exit
echo "Database ${NEWUSER_DATABASE} already exists, cannot rename the database. Exiting..."
exit 1
fi

View File

@@ -0,0 +1,181 @@
#!/bin/sh
#VERSION=0.1
# This script is written by Martynas Bendorius and DirectAdmin
# It is used to move database and it's user from one reseller to another
# Official DirectAdmin webpage: http://www.directadmin.com
# Usage:
# ./rename_database_with_user.sh <olddatabase> <newdatabase>
MYUID=`/usr/bin/id -u`
if [ "$MYUID" != 0 ]; then
echo "You require Root Access to run this script";
exit 0;
fi
if [ $# != 2 ]; then
echo "Usage:";
echo "$0 <olddatabase> <newdatabase>";
echo "you gave #$#: $0 $1 $2";
exit 0;
fi
OLDUSER_DATABASE="$1"
NEWUSER_DATABASE="$2"
OLDUSER_ESCAPED_DATABASE="`echo ${OLDUSER_DATABASE} | perl -p0 -e 's|_|\\\_|'`"
NEWUSER_ESCAPED_DATABASE="`echo ${NEWUSER_DATABASE} | perl -p0 -e 's|_|\\\_|'`"
OLDUSER_ESCAPED_DATABASE_MT="`echo ${OLDUSER_DATABASE} | perl -p0 -e 's|_|\\\\\\\_|'`"
NEWUSER_ESCAPED_DATABASE_MT="`echo ${NEWUSER_DATABASE} | perl -p0 -e 's|_|\\\\\\\_|'`"
MYSQLDUMP=/usr/local/mysql/bin/mysqldump
if [ ! -e ${MYSQLDUMP} ]; then
MYSQLDUMP=/usr/local/bin/mysqldump
fi
if [ ! -e ${MYSQLDUMP} ]; then
MYSQLDUMP=/usr/bin/mysqldump
fi
if [ ! -e ${MYSQLDUMP} ]; then
echo "Cannot find ${MYSQLDUMP}"
exit 1
fi
MYSQL=/usr/local/mysql/bin/mysql
if [ ! -e ${MYSQL} ]; then
MYSQL=/usr/local/bin/mysql
fi
if [ ! -e ${MYSQL} ]; then
MYSQL=/usr/bin/mysql
fi
if [ ! -e ${MYSQL} ]; then
echo "Cannot find ${MYSQL}"
exit 1
fi
DEFM=--defaults-extra-file=/usr/local/directadmin/conf/my.cnf
# If MySQL new database does not exist, create it and copy all the data from the old database, then drop the old database
if ! ${MYSQL} ${DEFM} --skip-column-names -e "SHOW DATABASES LIKE '${NEWUSER_DATABASE}';" -s | grep -m1 -q "${NEWUSER_DATABASE}"; then
if ! ${MYSQL} ${DEFM} --skip-column-names -e "SHOW DATABASES LIKE '${OLDUSER_DATABASE}';" -s | grep -m1 -q "${OLDUSER_DATABASE}"; then
echo "Specified database name does not exist: ${OLDUSER_DATABASE}"
exit 1
fi
#Count the number of tables in current database
OLD_TABLES_COUNT="`${MYSQL} ${DEFM} -D \"${OLDUSER_DATABASE}\" --skip-column-names -e 'SHOW TABLES;' | wc -l`"
#Create an empty new database, \` is needed for databases having "-" in it's name, so that no math would be done by sql :)
${MYSQL} ${DEFM} -e "CREATE DATABASE \`${NEWUSER_DATABASE}\`;"
echo "Dumping+restoring ${OLDUSER_DATABASE} -> ${NEWUSER_DATABASE}..."
#Dump+restore to the new database on the fly
${MYSQLDUMP} ${DEFM} --routines "${OLDUSER_DATABASE}" | ${MYSQL} ${DEFM} -D "${NEWUSER_DATABASE}"
#Count the number of tables in new database
NEW_TABLES_COUNT="`${MYSQL} ${DEFM} -D \"${NEWUSER_DATABASE}\" --skip-column-names -e 'SHOW TABLES;' | wc -l`"
if echo "${OLD_TABLES_COUNT}" | grep -qE ^\-?[0-9]+$; then
COUNT1_IS_NUMERIC=true
else
COUNT1_IS_NUMERIC=false
fi
if echo "${NEW_TABLES_COUNT}" | grep -qE ^\-?[0-9]+$; then
COUNT2_IS_NUMERIC=true
else
COUNT2_IS_NUMERIC=false
fi
#Drop the old database if the count of tables matches
if [ ${OLD_TABLES_COUNT} -eq ${NEW_TABLES_COUNT} ] && ${COUNT1_IS_NUMERIC} && ${COUNT2_IS_NUMERIC}; then
${MYSQL} ${DEFM} -e "DROP DATABASE \`${OLDUSER_DATABASE}\`;"
echo "Database has been renamed successfully: ${OLDUSER_DATABASE} -> ${NEWUSER_DATABASE}"
#User management part
OLD_USER=`echo ${OLDUSER_DATABASE} | egrep -o '^[^_]*'`
NEW_USER=`echo ${NEWUSER_DATABASE} | egrep -o '^[^_]*'`
#default user
if [ ${OLD_USER} = ${NEW_USER} ]; then
echo "Raname in same user - no need to check base user"
else
echo "Moving to a new user, granting new user/revoking old user permissions"
if [ `${MYSQL} ${DEFM} -e "SELECT COUNT(*) FROM mysql.user WHERE User='${NEW_USER}'" -sss` -lt 1 ]; then
echo "Base new user '${NEW_USER}' does not exist, skipping base user grant management"
else
OLD_USER_HOSTS=`${MYSQL} ${DEFM} -s -r -e "SELECT Host FROM mysql.user WHERE User='${OLD_USER}'" -sss`
for OLD_USER_HOST in ${OLD_USER_HOSTS}
do
BASE_USER_GRANTS=`${MYSQL} ${DEFM} -s -r -e "SHOW GRANTS FOR '${OLD_USER}'@'${OLD_USER_HOST}'" 2>/dev/null | egrep "\\\`${OLDUSER_DATABASE}\\\`|\\\`${OLDUSER_ESCAPED_DATABASE_MT}\\\`"`
echo "${BASE_USER_GRANTS}" | while read -r GRANT
do
DO_GRANT=`echo ${GRANT} | sed "s/'${OLD_USER}'/'${NEW_USER}'/"`
DO_GRANT=`echo ${DO_GRANT} | sed "s/\\\`${OLDUSER_DATABASE}\\\`/\\\`${NEWUSER_DATABASE}\\\`/"`
DO_GRANT=`echo ${DO_GRANT} | sed "s/\\\`${OLDUSER_ESCAPED_DATABASE_MT}\\\`/\\\`${NEWUSER_DATABASE}\\\`/"`
DO_REVOKE=`echo ${GRANT} | sed "s/^GRANT /REVOKE /"`
DO_REVOKE=`echo ${DO_REVOKE} | sed "s/ TO / FROM /"`
${MYSQL} ${DEFM} -e "${DO_GRANT}"
${MYSQL} ${DEFM} -e "${DO_REVOKE}"
done
done
fi
fi
#other users
OTHER_USERS=`${MYSQL} ${DEFM} -s -e "SELECT User,Host FROM (SELECT User,Db,Host FROM mysql.db UNION SELECT User,Db,Host FROM mysql.tables_priv UNION SELECT User,Db,Host FROM mysql.columns_priv UNION SELECT User,Db,Host FROM mysql.procs_priv) tb WHERE User like '${OLD_USER}_%' AND (Db='${OLDUSER_ESCAPED_DATABASE}' OR Db='${OLDUSER_DATABASE}')"`
echo "$OTHER_USERS" | while read OTHER
do
OUSER=`echo "$OTHER" | awk '{print $1}'`
OHOST=`echo "$OTHER" | awk '{print $2}'`
NUSER=`echo "$OUSER" | sed "s/${OLD_USER}_/${NEW_USER}_/"`
OTHER_USER_GRANTS=`${MYSQL} ${DEFM} -s -r -e "SHOW GRANTS FOR '${OUSER}'@'${OHOST}'" 2>/dev/null | egrep "\\\`${OLDUSER_DATABASE}\\\`|\\\`${OLDUSER_ESCAPED_DATABASE_MT}\\\`"`
echo "${OTHER_USER_GRANTS}" | while read -r OTHER_GRANT
do
if [ "${OLD_USER}" = "${NEW_USER}" ]; then
echo "Rename in same user - no need to rename original db user"
else
if [ `${MYSQL} ${DEFM} -e "SELECT COUNT(*) FROM mysql.user WHERE User='${NUSER}' AND Host='${OHOST}'" -sss` -gt 0 ]; then
echo "'${NUSER}'@'${OHOST}' user already exists, a new one will not be created and the password won't be copied as it could be already used..."
else
echo "'${NUSER}'@'${OHOST}' user does not exist. Creating..."
RAND_PASS=`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1`
${MYSQL} ${DEFM} -e "CREATE USER '${NUSER}'@'${OHOST}' IDENTIFIED BY '${RAND_PASS}'"
PASS_GRANT=`${MYSQL} ${DEFM} -e "SHOW GRANTS FOR '${OUSER}'@'${OHOST}'" | egrep " IDENTIFIED BY PASSWORD"`
PASS_GRANT=`echo ${PASS_GRANT} | rev | cut -d' ' -f 1 | rev | sed "s/'//g"`
MYSQLVER=`${MYSQL} ${DEFM} -e "SELECT version()" | egrep -o "^[0-9]+\.[0-9]+"`
if ${MYSQL} ${DEFM} -e "SHOW CREATE USER 'da_admin'@'${OHOST}';" > /dev/null 2>&1; then
${MYSQL} ${DEFM} -e "ALTER USER '${NUSER}'@'${OHOST}' IDENTIFIED WITH mysql_native_password AS '${PASS_GRANT}'"
else
${MYSQL} ${DEFM} -e "SET PASSWORD FOR '${NUSER}'@'${OHOST}' = '${PASS_GRANT}'"
fi
fi
fi
DO_OTHER_GRANT="${OTHER_GRANT}"
if [ "${OLD_USER}" != "${NEW_USER}" ]; then
DO_OTHER_GRANT=`echo ${DO_OTHER_GRANT} | sed "s/ '${OUSER}'/ '${NUSER}'/"`
fi
DO_OTHER_GRANT=`echo ${DO_OTHER_GRANT} | sed "s/\\\`${OLDUSER_DATABASE}\\\`/\\\`${NEWUSER_DATABASE}\\\`/"`
DO_OTHER_GRANT=`echo ${DO_OTHER_GRANT} | sed "s/\\\`${OLDUSER_ESCAPED_DATABASE_MT}\\\`/\\\`${NEWUSER_DATABASE}\\\`/"`
DO_OTHER_REVOKE=`echo ${OTHER_GRANT} | sed "s/^GRANT /REVOKE /"`
DO_OTHER_REVOKE=`echo ${DO_OTHER_REVOKE} | sed "s/ TO / FROM /"`
${MYSQL} ${DEFM} -e "${DO_OTHER_GRANT}"
${MYSQL} ${DEFM} -e "${DO_OTHER_REVOKE}"
if [ `${MYSQL} ${DEFM} -s -e "SELECT COUNT(*) FROM (SELECT User,Db,Host FROM mysql.db UNION SELECT User,Db,Host FROM mysql.tables_priv UNION SELECT User,Db,Host FROM mysql.columns_priv UNION SELECT User,Db,Host FROM mysql.procs_priv) tb WHERE User='${OUSER}' AND Db!='${OLDUSER_ESCAPED_DATABASE}' AND Db!='${OLDUSER_DATABASE}' AND Host='${OHOST}'"` -eq 0 ]; then
echo "'${OUSER}'@'${OHOST}' does not have privileges for other databases. Removing the user."
${MYSQL} ${DEFM} -e "DROP USER '${OUSER}'@'${OHOST}'"
else
echo "'${OUSER}'@'${OHOST}' still has privileges for other databases. Not removing the user."
fi
done
done
exit 0
else
#Error and exit if the number of tables doesn't match
echo "Database ${NEWUSER_DATABASE} doesn't have as many tables as ${OLDUSER_DATABASE} after restoration. Not removing ${OLDUSER_DATABASE}. Exiting..."
exit 1
fi
else
# If MySQL new database name already exists on the system (it shouldn't), error and exit
echo "Database ${NEWUSER_DATABASE} already exists, cannot rename the database. Exiting..."
exit 1
fi

View File

@@ -0,0 +1,120 @@
#!/bin/sh
# This script is written by Martynas Bendorius and DirectAdmin
# It is used to convert reseller to user
# Official DirectAdmin webpage: http://www.directadmin.com
# Usage:
# ./reseller_to_user.sh <user>
if [ $UID != 0 ]; then
echo "You require Root Access to run this script";
exit 0;
fi
if [ $# != 2 ]; then
echo "Usage:";
echo " $0 <user> <reseller>";
echo "you gave #$#: $0 $1 $2";
echo "where:"
echo "user: name of the account to downgrade."
echo "reseller: name of the new creator of the User: eg: admin";
exit 0;
fi
RESELLER_LIST=${BASEDIR}/admin/reseller.list
BASEDIR=/usr/local/directadmin/data
USR=$1
NEW_CREATOR=$2
NEW_CREATOR_IP_LIST=${BASEDIR}/users/${NEW_CREATOR}/ip.list
RESELLER_LIST=${BASEDIR}/admin/reseller.list
USER_DATA=${BASEDIR}/users/$USR
USER_CONF=${USER_DATA}/user.conf
USER_BACKUP_CONF=${USER_DATA}/backup.conf
RESELLER_ALLOC=${USER_DATA}/reseller.allocation
RESELLER_CONF=${USER_DATA}/reseller.conf
RESELLER_USAGE=${USER_DATA}/reseller.usage
if [ ! -d ${USER_DATA} ]; then
echo "Directory ${USER_DATA} does not exist. Can not continue."
exit 1;
fi
if [ "`grep -wc $USR ${RESELLER_LIST}`" = "0" ]; then
echo "Reseller $USR is already user. Can not continue."
exit 1;
fi
if [ ! -e /usr/bin/perl ]; then
echo "/usr/bin/perl does not exist.";
exit 1;
fi
echo "Re-configuring user directory /home/$USR."
rm -rf /home/$USR/user_backups
rm -rf /home/$USR/domains/default
rm -rf /home/$USR/domains/sharedip
rm -rf /home/$USR/domains/suspended
echo "Re-configuring DirectAdmin files."
# Changing usertype
perl -pi -e 's/usertype=reseller/usertype=user/' ${USER_CONF}
#if any IPs are managed by this Reseller, owernship should go to new creator.
for ip in `cat ${USER_DATA}/ip.list`; do
{
IPFILE=${BASEDIR}/admin/ips/$ip
C=`grep -c reseller=${USR} ${IPFILE}`
if [ "$C" -gt 0 ]; then
#swap reseller to new reseller.
perl -pi -e "s/^creator=$USR\$/creator=$NEW_CREATOR/" $IPFILE
#and add it to the new resellers list.
C=`grep -c $ip $NEW_CREATOR_IP_LIST`
if [ "$C" -eq 0 ]; then
echo $ip >> $NEW_CREATOR_IP_LIST
fi
fi
};
done;
rm -f ${USER_BACKUP_CONF}
rm -f ${USER_DATA}/ip.list
rm -f ${USER_DATA}/login.hist
rm -f ${USER_DATA}/reseller.history
rm -f ${USER_DATA}/users.list
rm -f ${USER_DATA}/u_welcome.txt
rm -rf ${USER_DATA}/packages
rm -f ${USER_DATA}/packages.list
rm -f ${RESELLER_ALLOC}
rm -f ${RESELLER_CONF}
rm -f ${RESELLER_USAGE}
CREATOR=`grep "creator=" ${USER_CONF} | cut -d= -f2`
RESELLER_USERSLIST=${BASEDIR}/users/$NEW_CREATOR/users.list
# Editing ticket.conf
if [ -e ${USER_DATA}/ticket.conf ]; then
ACTIVE="`grep 'active=' ${USER_DATA}/ticket.conf`"
HTML="`grep 'html=' ${USER_DATA}/ticket.conf`"
NEWTICKET="`grep 'newticket=' ${USER_DATA}/ticket.conf`"
perl -pi -e "s#$ACTIVE\n##g" ${USER_DATA}/ticket.conf
perl -pi -e "s#$HTML\n##g" ${USER_DATA}/ticket.conf
perl -pi -e "s#$NEWTICKET\n##g" ${USER_DATA}/ticket.conf
fi
echo "Adding user to the $2 reseller."
echo "$USR" >> ${RESELLER_USERSLIST}
echo "Removing user from the reseller list."
perl -pi -e "s#$USR\n##g" ${RESELLER_LIST}
echo "Changing user owner"
perl -pi -e "s/creator=$CREATOR/creator=$NEW_CREATOR/g" ${USER_CONF}
#this is needed to update "show all users" cache.
echo "action=cache&value=showallusers" >> /usr/local/directadmin/data/task.queue
/usr/local/directadmin/dataskq
echo "Reseller $USR has been converted to user."
exit 0;

View File

@@ -0,0 +1,249 @@
#!/bin/sh
#Use existing passwords to reset the da_admin account password.
#https://www.directadmin.com/features.php?id=2677
ROOT_LOGIN=root
ROOT_PASS=
DA_ADMIN=da_admin
DA_ADMIN_PASS=
MYSQL_HOST=localhost
SETUP_TXT=/usr/local/directadmin/scripts/setup.txt
MYSQL_CONF=/usr/local/directadmin/conf/mysql.conf
MY_CNF=/usr/local/directadmin/conf/my.cnf
TMP_MY_CNF=/root/.tmp_my_cnf
TMP_SQL=/root/.tmp.sql
###############################
# FUNCTIONS
set_my_cnf() {
CNF=$1
CL=$2
CP=$3
CH=$4
echo -n '' > ${CNF}
chmod 600 ${CNF}
echo "[client]" >> ${CNF}
echo "user=$CL" >> ${CNF}
echo "password=$CP" >> ${CNF}
echo "host=$CH" >> ${CNF}
}
#return 0 for success
test_login() {
L=$1
P=$2
set_my_cnf "${TMP_MY_CNF}" "$L" "$P" "$MYSQL_HOST"
RES=`mysql --defaults-extra-file=${TMP_MY_CNF} -e "quit"`
R=$?
/bin/rm -f ${TMP_MY_CNF}
return $R
}
set_host_vars() {
if [ -s ${MYSQL_CONF} ]; then
TEST_HOST=`grep ^host= ${MYSQL_CONF} | cut -d= -f2`
if [ "${TEST_HOST}" != "" ]; then
MYSQL_HOST=${TEST_HOST}
echo "Using host=${MYSQL_HOST}"
fi
if [ "${MYSQL_HOST}" != "localhost" ]; then
echo "This script currently only supports resetting local da_admin accounts. For remote accounts, please to this manually, accounting for access hosts."
exit 4
fi
#in case some other account name is used.
TEST_DA_ADMIN=`grep ^user= ${MYSQL_CONF} | cut -d= -f2`
if [ "${TEST_DA_ADMIN}" != "" ]; then
DA_ADMIN=${TEST_DA_ADMIN}
fi
fi
}
#find a currently working login
#return 0 for success
set_root_login_vars() {
if [ -s ${SETUP_TXT} ]; then
ROOT_PASS=`grep '^mysql=' ${SETUP_TXT} | cut -d= -f2`
test_login "$ROOT_LOGIN" "$ROOT_PASS"
if [ "$?" -eq 0 ]; then
echo "Using 'mysql=' ${ROOT_LOGIN} pass from ${SETUP_TXT}"
return 0
fi
fi
if [ -s ${MYSQL_CONF} ]; then
ROOT_LOGIN=`grep '^user=' ${MYSQL_CONF} | cut -d= -f2`
ROOT_PASS=`grep '^passwd=' ${MYSQL_CONF} | cut -d= -f2`
test_login "$ROOT_LOGIN" "$ROOT_PASS"
if [ "$?" -eq 0 ]; then
echo "Using 'passwd=' ${DA_ADMIN} pass from ${MYSQL_CONF}"
return 0
fi
fi
#still no go?
if [ -s ${SETUP_TXT} ]; then
ROOT_LOGIN=`grep '^mysqluser=' ${SETUP_TXT} | cut -d= -f2`
ROOT_PASS=`grep '^adminpass=' ${SETUP_TXT} | cut -d= -f2`
test_login "$ROOT_LOGIN" "$ROOT_PASS"
if [ "$?" -eq 0 ]; then
echo "Using 'adminpass=' ${ROOT_LOGIN} pass from ${SETUP_TXT}"
return 0
fi
fi
#check any other ideas here.
echo "Could not find any working logins for ${MYSQL_HOST}"
return 1
}
set_pass_stdin() {
read DA_ADMIN_PASS
}
#from setup.sh
random_pass() {
PASS_LEN=`perl -le 'print int(rand(6))+9'`
START_LEN=`perl -le 'print int(rand(8))+1'`
END_LEN=$(expr ${PASS_LEN} - ${START_LEN})
SPECIAL_CHAR=`perl -le 'print map { (qw{@ ^ _ - /})[rand 6] } 1'`;
NUMERIC_CHAR=`perl -le 'print int(rand(10))'`;
PASS_START=`perl -le "print map+(A..Z,a..z,0..9)[rand 62],0..$START_LEN"`;
PASS_END=`perl -le "print map+(A..Z,a..z,0..9)[rand 62],0..$END_LEN"`;
PASS=${PASS_START}${SPECIAL_CHAR}${NUMERIC_CHAR}${PASS_END}
echo $PASS
}
set_pass_random() {
DA_ADMIN_PASS=`random_pass`
}
set_pass_var() {
DA_ADMIN_PASS=$1
}
validate_password() {
P=${DA_ADMIN_PASS}
if [ "$P" = "" ]; then
echo "Password is blank"
return 1
fi
return 0
}
set_password_in_mysql() {
set_my_cnf "${TMP_MY_CNF}" "$ROOT_LOGIN" "$ROOT_PASS" "$MYSQL_HOST"
USE_HOST=localhost
echo -n '' > ${TMP_SQL}
chmod 600 ${TMP_SQL};
echo "ALTER USER ${DA_ADMIN}@${USE_HOST} IDENTIFIED BY '${DA_ADMIN_PASS}';" >> ${TMP_SQL};
RES=`mysql --defaults-extra-file=${TMP_MY_CNF} < ${TMP_SQL}`
R=$?
if [ "$R" -ne 0 ]; then
echo "Error running password update for ${DA_ADMIN}@${USE_HOST}"
echo ${RES}
fi
/bin/rm -f ${TMP_MY_CNF}
/bin/rm -f ${TMP_SQL}
return $R
}
set_new_pass_to_configs() {
if [ -s ${MYSQL_CONF} ]; then
perl -pi -e "s/^passwd=.*/passwd=${DA_ADMIN_PASS}/" ${MYSQL_CONF}
else
echo -n '' > ${MYSQL_CONF}
chmod 600 ${MYSQL_CONF}
chown diradmin:diradmin ${MYSQL_CONF}
echo "user=${DA_ADMIN}" >> ${MYSQL_CONF}
echo "passwd=${DA_ADMIN_PASS}" >> ${MYSQL_CONF}
#echo host
fi
if [ -s ${MY_CNF} ]; then
perl -pi -e "s/^password=.*/password=${DA_ADMIN_PASS}/" ${MY_CNF}
else
echo -n '' > ${MY_CNF}
chmod 600 ${MY_CNF}
chown diradmin:diradmin ${MY_CNF}
echo "[client]"
echo "user=${DA_ADMIN}" >> ${MY_CNF}
echo "password=${DA_ADMIN_PASS}" >> ${MY_CNF}
#echo host
fi
}
show_help() {
echo "Usage:"
echo " $0 --stdin - the password will be passed on stdin"
echo " $0 --random - pick a new random password"
echo " $0 --password 'newpass' - set to specified password'"
echo " $0 - this help page"
}
# END FUNCTIONS
###############################
#
# MAIN START
#
case "$1" in
'--stdin') set_pass_stdin
;;
'--random') set_pass_random
;;
'--password') set_pass_var "$2"
;;
*) show_help;
exit 2
;;
esac
set_host_vars
set_root_login_vars
if [ "$?" -ne 0 ]; then
echo "Could not find a working root/da_admin login to use for the reset. Aborting"
exit 1
fi
#At this point, we have a working: ROOT_LOGIN@MYSQL_HOST with ROOT_PASS.
validate_password
if [ "$?" -ne 0 ]; then
echo "Password '$DA_ADMIN_PASS' is not valid. Aborting"
exit 3
fi
set_password_in_mysql
if [ "$?" -ne 0 ]; then
exit 5
fi
set_new_pass_to_configs
echo "Success!"
exit 0;

View File

@@ -0,0 +1,451 @@
#!/usr/local/bin/php -c/usr/local/directadmin/scripts/php_clean.ini
<?php
$version = 0.1;
/*
Restore script for the per-domain RoundCube settings.
Backup/Restore written by DirectAdmin: http://www.directadmin.com
RoundCube Webmail Client: http://roundcube.net
This script will take an XML output (generated by backup_roundcube.php)
and restore all elements for a given User, merging them into an active roundcube database.
New IDs are generated, where applicable, so they will not be any conflicts if the IDs are differnt.
Existing accounts will be respected, and only missing data is merged in.
See the DirectAdmin versions system for more info:
http://www.directadmin.com/features.php?id=1062
All variables are passed via environment, not command line options
But you can specify environmental variables... via command line options before the script (see the showHelp() function)
RETURN VALUES
0: All is well
>1: an error worthy or reporting has occured. Message on stderr.
1: an error, most likely due to not actually having RoundCube installed or no restore data, has occured.
*/
/***********************
* Environmental variables
*/
$domain = getenv("domain"); //for security reasons, it must match the XML values.
$system_username = getenv("username"); //only this account is allowed to be restored.
$xml_file = getenv("xml_file"); //Name of the file to restore.
/***********************
* Enabling debug lets you see which Email is seen,
* and what values are being restored, and shows you their respective IDs (found or set)
* Keep this set to FALSE if the dataksq is calling it, so as to not fill the stdin buffer (dataskq only reads from stderr for this script)
*/
$is_debug = FALSE;
/***********************
* this restores as da_admin instead of da_roundube. It is less secure, avoid using it if possible.
*/
$high_access_connection = FALSE;
/***********************
* is the host value set within the da_roundcube.users table.
*/
$rc_mail_host = 'localhost';
/***********************
* If $high_access_restore is false, this is used for the mysql credentials.
*/
$rc_config = "/var/www/html/roundcube/config/config.inc.php";
//****************************************************************
//****************************************************************
if (!isset($xml_file) || $xml_file == "")
show_help();
if (!isset($domain) || $domain == "")
show_help();
if (!file_exists($xml_file))
{
echo_stderr("Cannot find path: $xml_file. Skipping RoundCube restore.\n");
exit(1);
}
if (filesize($xml_file) == 0)
{
echo_stderr("Size of $xml_file is 0. Skipping RoundCube restore.\n");
exit(1);
}
//****************************************************************
//****************************************************************
if ($high_access_connection)
{
if (version_compare(PHP_VERSION, '5.3.0', '<'))
{
$mysql_conf = @parse_ini_file("/usr/local/directadmin/conf/mysql.conf", false);
}
else
{
$mysql_conf = @parse_ini_file("/usr/local/directadmin/conf/mysql.conf", false, INI_SCANNER_RAW);
}
}
if ($high_access_connection && $mysql_conf && strlen($mysql_conf['passwd']) > 4)
{
$mysql_conf = parse_ini_file("/usr/local/directadmin/conf/mysql.conf");
$mysql_user = $mysql_conf['user'];
$mysql_pass = $mysql_conf['passwd'];
$mysql_host = 'localhost';
$mysql_db = 'da_roundcube';
if (isset($mysql_conf['host']) && $mysql_conf['host'] != "")
$mysql_host = $mysql_conf['host'];
}
else
{
if (!file_exists($rc_config))
{
echo_stderr("Cannot find RoundCube config at $rc_config. Is RC installed and up to date?\n");
exit(5);
}
include_once($rc_config);
if (!isset($config) || !isset($config['db_dsnw']) || $config['db_dsnw'] == '')
{
echo_stderr("Cannot find \$config['db_dsnw'] variable in $rc_config\n");
exit(6);
}
//$config['db_dsnw'] = 'mysql://da_roundcube:password@localhost/da_roundcube';
$values = explode('/', $config['db_dsnw']);
$connect = explode('@', $values[2]);
$auth = explode(':', $connect[0]);
$mysql_user = $auth[0];
$mysql_pass = $auth[1];
$mysql_host = $connect[1];
$mysql_db = $values[3];
}
$mysqli = new mysqli($mysql_host, $mysql_user, $mysql_pass);
if ($mysqli->connect_errno) {
echo_stderr("Failed to connect to MySQL: (".$mysqli->connect_errno.") ".$mysqli->connect_error."\n");
exit(3);
}
$mysqli->set_charset('utf8');
if (!$mysqli->select_db($mysql_db))
{
echo_stderr("There is no $mysql_db database. Skipping RoundCube restore.\n");
exit(1);
}
//****************************************************************
//****************************************************************
$xml = simplexml_load_file($xml_file);
if ($xml === FALSE)
{
echo_stderr("Error reading in XML file with with simplexml_load_file('$xml_file')\n");
exit(4);
}
foreach($xml->children() as $email)
{
$username = urldecode($email->USERNAME);
if ($username != $system_username)
{
$data = explode('@', $username);
if ($data[1] != $domain)
{
echo_stderr($username. " is not part of domain '".$domain."': Skipping.\n");
continue;
}
}
$user_id = ensure_user($email);
if ($user_id == -1)
continue;
echo_debug("username $username : $user_id\n");
foreach($email->INDENTITIES->children() as $identity)
{
$id_id = ensure_identity($user_id, $identity);
if ($id_id == -1)
continue;
$id_email = urldecode($identity->EMAIL);
echo_debug(" identity $id_email : $id_id\n");
}
$groups = Array();
foreach($email->CONTACTS->children() as $contact)
{
//first, ensure all groups exisrt for this user_id.
foreach($contact->GROUPS->children() as $group)
{
$group_id = ensure_group($user_id, $group);
$group_name = urldecode($group->NAME);
//save it for later.
$groups[$group_name] = $group_id;
}
//next, ensure the contact exists, and add to contactgroupsmembers.
$contact_id = ensure_contact($user_id, $contact);
$contact_email = urldecode($contact->EMAIL);
echo_debug(" contact $contact_email : $contact_id\n");
//link contact to their groups.
link_contact_to_group($contact, $contact_id, $groups);
}
}
$mysqli->close();
exit(0);
//**********************************************************************
//**********************************************************************
/**********************************************************************
* ensure that the contact has been assigned to their groups.
*/
function link_contact_to_group($contact, $contact_id, $groups)
{
global $mysqli;
foreach($contact->GROUPS->children() as $group)
{
$group_name = urldecode($group->NAME);
$group_created = mes(urldecode($group->CREATED));
$query = "REPLACE INTO `contactgroupmembers` (contactgroup_id, contact_id, created) VALUES (".mes($groups[$group_name]).", $contact_id, '$group_created')";
if (!$mysqli->query($query))
{
echo_stderr("Query error:\n".$query."\n".$mysqli->error."\n");
return -1;
}
echo_debug(" group $group_name : ".$groups[$group_name]."\n");
}
return 1;
}
/**********************************************************************
* ensure that the Group exists for this user_id.
*/
function ensure_group($user_id, $group)
{
global $mysqli;
$group_name = mes(urldecode($group->NAME));
$query = "SELECT contactgroup_id FROM `contactgroups` WHERE user_id=$user_id AND name='$group_name'";
if (!$group_ids = $mysqli->query($query))
{
echo_stderr("Query error:\n".$query."\n".$mysqli->error."\n");
return -1;
}
if ($group_ids->num_rows > 0)
{
$data = $group_ids->fetch_array();
return $data['contactgroup_id'];
}
//No group, must add it.
$group_changed = mes(urldecode($group->CHANGED));
$query = "INSERT INTO `contactgroups` (user_id, changed, name) VALUES ($user_id, '$group_changed', '$group_name')";
if (!$groups = $mysqli->query($query))
{
echo_stderr("Query error:\n".$query."\n".$mysqli->error."\n");
return -1;
}
return $mysqli->insert_id;
}
/**********************************************************************
* ensure that the Contact exists for this user_id.
*/
function ensure_contact($user_id, $contact)
{
global $mysqli;
$contact_email = mes(urldecode($contact->EMAIL));
$contact_name = mes(urldecode($contact->NAME));
$query = "SELECT contact_id FROM `contacts` WHERE user_id=$user_id AND name='$contact_name' AND email='$contact_email' LIMIT 1";
if (!$contact_ids = $mysqli->query($query))
{
echo_stderr("Query error:\n".$query."\n".$mysqli->error."\n");
return -1;
}
if ($contact_ids->num_rows > 0)
{
$data = $contact_ids->fetch_array();
return $data['contact_id'];
}
//No contact, must add it.
$contact_changed = mes(urldecode($contact->CHANGED));
$contact_firstname = mes(urldecode($contact->FIRSTNAME));
$contact_surname = mes(urldecode($contact->SURNAME));
$contact_vcard = mes(urldecode($contact->VCARD));
$contact_words = mes(urldecode($contact->WORDS));
$query = "INSERT INTO `contacts` (changed, name, email, firstname, surname, vcard, words, user_id) VALUES ('$contact_changed', '$contact_name', '$contact_email', '$contact_firstname', '$contact_surname', '$contact_vcard', '$contact_words', $user_id)";
if (!$contact_ids = $mysqli->query($query))
{
echo_stderr("Query error:\n".$query."\n".$mysqli->error."\n");
return -1;
}
return $mysqli->insert_id;
}
/**********************************************************************
* ensure that the Identity exists for this user_id.
* no need to worry about the return value
*/
function ensure_identity($user_id, $identity)
{
global $mysqli;
$id_email = mes(urldecode($identity->EMAIL));
$id_name = mes(urldecode($identity->NAME));
$query = "SELECT identity_id FROM `identities` WHERE user_id=$user_id AND name='$id_name' AND email='$id_email' LIMIT 1";
if (!$ids = $mysqli->query($query))
{
echo_stderr("Query error:\n".$query."\n".$mysqli->error."\n");
return -1;
}
if ($ids->num_rows > 0)
{
$data = $ids->fetch_array();
return $data['identity_id'];
}
//No identity, must add it.
$id_changed = mes(urldecode($identity->CHANGED));
$id_standard = mes(urldecode($identity->STANDARD));
$id_organization = mes(urldecode($identity->ORGANIZATION));
$id_reply_to = mes(urldecode($identity['REPLY-TO']));
$id_bcc = mes(urldecode($identity->BCC));
$id_signature = mes(urldecode($identity->SIGNATURE));
$id_html_signature =mes(urldecode($identity->HTML_SIGNATURE));
$query = "INSERT INTO `identities` (user_id, changed, standard, name, organization, email, `reply-to`, bcc, signature, html_signature) VALUES ($user_id, '$id_changed', $id_standard, '$id_name', '$id_organization', '$id_email', '$id_reply_to', '$id_bcc', '$id_signature', $id_html_signature)";
if (!$ids = $mysqli->query($query))
{
echo_stderr("Query error:\n".$query."\n".$mysqli->error."\n");
return -1;
}
return $mysqli->insert_id;
}
/**********************************************************************
* ensure that the User exists
* yes: return user_id
* no: add user, set data, resturn user_id
*/
function ensure_user($email)
{
global $mysqli, $rc_mail_host;
$username = mes(urldecode($email->USERNAME));
$query = "SELECT user_id FROM `users` WHERE username='$username' LIMIT 1";
if (!$users = $mysqli->query($query))
{
echo_stderr("Query error:\n".$query."\n".$mysqli->error."\n");
return -1;
}
if ($users->num_rows > 0)
{
$data = $users->fetch_array();
return $data['user_id'];
}
//No User, must add it.
$created=mes(urldecode($email->CREATED));
$last_login=mes(urldecode($email->LAST_LOGIN));
$language=mes(urldecode($email->LANGUAGE));
$preferences=mes(urldecode($email->PREFERENCES));
$query = "INSERT INTO `users` (username, mail_host, created, last_login, language, preferences) VALUES ('$username', '$rc_mail_host', '$created', '$last_login', '$language', '$preferences')";
if (!$users = $mysqli->query($query))
{
echo_stderr("Query error:\n".$query."\n".$mysqli->error."\n");
return -1;
}
return $mysqli->insert_id;
}
//**********************************************************************
function show_help()
{
global $mysql_db, $version;
echo_stderr("Roundcube $version restore script to restore Users.\n\n");
echo_stderr("Usage:\n");
echo_stderr(" username=username domain=domain.com xml_file=/path/to/rc.xml ".__FILE__."\n\n");
echo_stderr("The script will read in the XML specified by xml_file.\n");
echo_stderr("It will insert the data into the $mysql_db database.\n");
exit(2);
}
function die_stderr($str)
{
echo_stderr($str);
die();
}
function echo_stderr($str)
{
$fd = fopen('php://stderr', 'w');
fwrite($fd, $str);
fclose($fd);
}
function echo_debug($str)
{
global $is_debug;
if ($is_debug)
echo $str;
}
function mes($str)
{
global $mysqli;
return $mysqli->real_escape_string($str);
}
?>

View File

@@ -0,0 +1,43 @@
#!/bin/sh
DIG=/usr/bin/dig
if [ $# -ne 1 ]; then
echo "Usage:";
echo " $0 <ip>";
echo "";
echo "where <ip> can be an IPv4 or IPv6 IP address.";
exit 1;
fi
if [ ! -s $DIG ]; then
echo "Cannot find $DIG";
exit 2;
fi
if [ ! -x $DIG ]; then
echo "$DIG is not executable";
exit 3;
fi
IP=$1
if [ "$IP" = "" ]; then
echo "IP value blank is not";
fi
HAS_SHORT=1
COUNT=`$DIG -h 2>&1 | grep -c '\[no\]short'`
if [ $COUNT -eq 0 ]; then
HAS_SHORT=0;
fi
if [ "$HAS_SHORT" -eq 1 ]; then
dig -x "$IP" +short 2>&1
RET=$?
else
dig -x "$IP" 2>&1 | grep PTR | awk '{ print $5 }'
RET=$?
fi
exit $RET;

View File

@@ -0,0 +1,86 @@
#!/bin/sh
DIR=/etc/virtual/usage
USERS=/usr/local/directadmin/data/users
if [ ! -d $DIR ]; then
exit 0;
fi
#for i in `ls $DIR | grep -e '.bytes$'`; do
for i in `ls ${DIR}/*.bytes 2>/dev/null | cut -d/ -f5`; do
{
U_NAME=`echo $i | cut -d. -f1`
#U_NAME=$i
BF=${DIR}/${i}
if [ ! -e ${BF} ]; then
echo "rotate_email_usage.sh: cannot find ${BF}";
fi
if [ -d $USERS/$U_NAME ]; then
echo "0=type=timestamp&time=`date +%s`" >> $USERS/$U_NAME/bandwidth.tally
#cat $DIR/$i >> $USERS/$U_NAME/bandwidth.tally
cat ${BF} >> $USERS/$U_NAME/bandwidth.tally
else
echo "rotate_email_usage.sh: Cannot find $USERS/$U_NAME";
fi
};
done;
rm -rf $DIR/*
#remove per-email counts:
rm -f /etc/virtual/*/usage/*
#dovecot.bytes entries.
EV=/etc/virtual
for i in `ls ${EV}/*/dovecot.bytes 2>/dev/null | cut -d/ -f4`; do
{
D=${EV}/${i};
if [ -h $D ]; then
continue;
fi
#if it's empty, ignore it.
DB=${D}/dovecot.bytes
if [ ! -s ${DB} ]; then
continue;
fi
USERN=`grep -e "^$i:" /etc/virtual/domainowners | cut -d\ -f2`
if [ "${USERN}" = "" ]; then
echo "$i seems to be missing from /etc/virtual/domainowners";
continue;
fi
DU=${USERS}/${USERN}
if [ ! -d "${DU}" ]; then
echo "Cannot find owner of $i from domainowners";
continue;
fi
cat ${DB} >> ${DU}/bandwidth.tally
rm -f ${DB};
};
done;
for i in `ls ${USERS}/*/dovecot.bytes 2>/dev/null | cut -d/ -f7`; do
{
DU=${USERS}/${i}
DB=${DU}/dovecot.bytes
if [ ! -s ${DB} ]; then
continue;
fi
cat ${DB} >> ${DU}/bandwidth.tally
rm -f ${DB};
};
done;
exit 0;

14
update/scripts/selinux.sh Normal file
View File

@@ -0,0 +1,14 @@
#!/bin/sh
setenforce 0
if [ -e /etc/selinux/config ]; then
perl -pi -e 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
perl -pi -e 's/SELINUX=permissive/SELINUX=disabled/' /etc/selinux/config
fi
if [ -e /selinux/enforce ]; then
echo "0" > /selinux/enforce
fi
if [ -e /usr/sbin/setenforce ]; then
/usr/sbin/setenforce 0
fi

View File

@@ -0,0 +1,17 @@
#!/bin/sh
PS=/bin/ps
AWK=/usr/bin/awk
GREP=/bin/grep
if [ ! -x $GREP ]; then
GREP=/usr/bin/grep
fi
SORT=/bin/sort
if [ ! -x $SORT ]; then
SORT=/usr/bin/sort
fi
$PS axo comm,rss | $AWK '{arr[$1]+=$2} END {for (i in arr) {print i "=" arr[i]/1024}}' | $GREP -v '=0$'
RET=$?
exit $RET

View File

@@ -0,0 +1,730 @@
#!/bin/sh
# Script to set the file ownerships and
# permissions of all DA related files on
# the system. Should be quite useful
# for system restores, just make sure
# that the user accounts have already
# been created in the /etc/passwd,
# /etc/shadow, /etc/group files.
OS=`uname`
ECHO_LOG=1;
SAVE_LOG=1;
LOG=/tmp/set_perm.log
ERRLOG=/tmp/set_perm.err.log
DAPATH=/usr/local/directadmin
RT_GRP="root";
if [ "$OS" = "FreeBSD" ]; then
RT_GRP="wheel";
fi
DOVECOT=`grep -c 'dovecot=1' ${DAPATH}/conf/directadmin.conf`
DIRECTADMIN=${DAPATH}/directadmin
HAVE_HTTPD=1
HAVE_NGINX=0
if [ -s ${DIRECTADMIN} ]; then
if [ "`${DIRECTADMIN} c | grep ^nginx= | cut -d= -f2`" -eq 1 ]; then
HAVE_HTTPD=0
HAVE_NGINX=1
fi
if [ "`${DIRECTADMIN} c | grep ^nginx_proxy= | cut -d= -f2`" -eq 1 ]; then
HAVE_HTTPD=1
HAVE_NGINX=1
fi
fi
show_help()
{
echo "";
echo "DirectAdmin File Permission/Ownership script";
echo "";
echo "Usage:";
echo " $0 all";
echo " $0 all_with_domaindirs";
echo "";
echo " $0 da_files"; #don't forget /home/tmp
echo " $0 domaindirs";
echo " $0 user_homes";
echo " $0 mysql";
echo " $0 email";
echo " $0 logs";
echo " $0 etc_configs";
echo "";
echo "internal:";
echo " $0 maildir <user> <path/Maildir>";
echo " $0 set_user_home <user>";
echo " $0 domaindir <domainname> [<user>]; user could be skipped";
echo "";
}
#writes to log file
log()
{
if [ $SAVE_LOG -eq 1 ]; then
echo "$1" >> $LOG;
fi
if [ $ECHO_LOG -eq 1 ]; then
echo "$1";
fi
}
error_log()
{
echo "Error: $1";
echo "$1" >> $ERRLOG
log "$1"
}
###########
# set_file /file user group 755 -R
##########
set_file()
{
if [ -e "$1" ] || [ "$6" = "nocheck" ]; then
log "set $1 $2:$3 $4 flag $5";
#chown goes first.
#A 4755 file is set to 755 if chown is called after chmod.
#if there is an asterisk, no quotes.
if echo x"$1" | grep '*' > /dev/null; then
chown $5 $2:$3 $1
chmod $5 $4 $1
else
chown $5 $2:$3 "$1"
chmod $5 $4 "$1"
fi
fi
}
###########################################
# gets a list of the DA users on the system
all_users()
{
for i in `ls $DAPATH/data/users`; do
{
if [ -e $DAPATH/data/users/$i/user.conf ]; then
echo -n "$i ";
fi
};
done;
}
set_user_perm()
{
log "set_user_perm $1";
DIR=$DAPATH/data/users/$1
set_file $DIR diradmin diradmin 711
set_file $DIR/bandwidth.tally root $RT_GRP 600
set_file $DIR/ftp.passwd root ftp 640
set_file $DIR/crontab.conf diradmin diradmin 600
set_file $DIR/domains.list diradmin diradmin 600
set_file $DIR/domains diradmin diradmin 711
set_file $DIR/httpd.conf diradmin $1 640
set_file $DIR/nginx.conf diradmin $1 640
set_file $DIR/openlitespeed.conf diradmin lsadmn 640
set_file $DIR/ticket.conf diradmin diradmin 600
set_file $DIR/tickets.list diradmin diradmin 600
set_file $DIR/user.conf diradmin diradmin 600
set_file $DIR/user.usage diradmin diradmin 600
set_file $DIR/user.history diradmin diradmin 600
set_file $DIR/user.comments diradmin diradmin 600
set_file $DIR/user_ip.list diradmin diradmin 600
set_file $DIR/login.hist diradmin diradmin 600
set_file $DIR/twostep_auth_secret.txt diradmin diradmin 600
set_file $DIR/twostep_auth_scratch_codes.list diradmin diradmin 600
set_file $DIR/login_keys diradmin diradmin 700
set_file $DIR/skin_customizations diradmin diradmin 711
set_file $DIR/history diradmin diradmin 700
set_file "$DIR/history/*" diradmin diradmin 600 '' nocheck
#hmm... do we want to rebuild the files?.. bit more than just "set permissions"
for j in `cat $DIR/domains/*.conf | grep -e '^domain=' | cut -d= -f2`; do
{
COUNT=`cat $DIR/domains.list | grep -c $j`
if [ $COUNT -eq 0 ]; then
log "Found missing domain $j for user $1";
echo $j >> $DIR/domains.list
fi
};
done;
if [ -d "${DIR}/domains" ]; then
find "${DIR}/domains" -type d -exec chmod 711 {} \; -exec chown diradmin:diradmin {} \;
find "${DIR}/domains" -type f -exec chmod 600 {} \; -exec chown diradmin:diradmin {} \;
fi
SAC=`/usr/local/directadmin/directadmin c |grep '^secure_access_group=' | cut -d= -f2`
SSL_PERM=640
#if [ "${SAC}" = "" ]; then
# SAC=diradmin
# SSL_PERM=644
#fi
SAC=mail
set_file "$DIR/domains/*.cert" diradmin ${SAC} 640 '' nocheck
set_file "$DIR/domains/*.cacert" diradmin ${SAC} 640 '' nocheck
set_file "$DIR/domains/*.cert.combined" diradmin ${SAC} 640 '' nocheck
set_file "$DIR/domains/*.key" diradmin ${SAC} 640 '' nocheck
}
set_reseller_perm()
{
log "set_reseller_perm $1";
DIR=$DAPATH/data/users/$1
set_file $DIR/ip.list diradmin diradmin 600
set_file $DIR/packages diradmin diradmin 600 -R
set_file $DIR/packages diradmin diradmin 700
set_file $DIR/packages.list diradmin diradmin 600
set_file $DIR/reseller.allocation diradmin diradmin 600
set_file $DIR/reseller.conf diradmin diradmin 600
set_file $DIR/reseller.usage diradmin diradmin 600
set_file $DIR/reseller.history diradmin diradmin 600
set_file $DIR/u_welcome.txt diradmin diradmin 600
set_file $DIR/bandwidth.tally.cache diradmin diradmin 600
set_file $DIR/users.list diradmin diradmin 600
set_file $DIR/reseller.history diradmin diradmin 600
}
set_admin_perm()
{
log "set_admin_perm"
DIR=$DAPATH/data/admin
if [ -d "${DIR}" ]; then
find "${DIR}" -type d -exec chmod 700 {} \; -exec chown diradmin:diradmin {} \;
find "${DIR}" -type f -exec chmod 600 {} \; -exec chown diradmin:diradmin {} \;
fi
set_file $DIR/ip_access diradmin diradmin 700
set_file $DIR/ips diradmin diradmin 700
set_file $DIR/packages diradmin diradmin 700
set_file $DIR/task_queue_processes diradmin diradmin 700
}
da_files()
{
set_file /home/tmp root $RT_GRP 1777
set_file $DAPATH diradmin diradmin 755
if [ -d "${DAPATH}/conf" ]; then
find "${DAPATH}/conf" -type d -exec chmod 700 {} \; -exec chown diradmin:diradmin {} \;
find "${DAPATH}/conf" -type f -exec chmod 600 {} \; -exec chown diradmin:diradmin {} \;
fi
if [ -e $DAPATH/directadmin ]; then
$DAPATH/directadmin p
fi
for i in `all_users`; do
{
set_user_perm $i
if [ -e $DAPATH/data/users/$i/reseller.conf ]; then
set_reseller_perm $i
fi
};
done;
set_file $DAPATH/data/users diradmin diradmin 711
set_admin_perm;
if [ -d "${DAPATH}/data/sessions" ]; then
find "${DAPATH}/data/sessions" -type d -exec chmod 700 {} \; -exec chown diradmin:diradmin {} \;
find "${DAPATH}/data/sessions" -type f -exec chmod 600 {} \; -exec chown diradmin:diradmin {} \;
fi
#set_file $DAPATH/data/tickets diradmin diradmin 700 -R
#set_file "$DAPATH/data/tickets/*" diradmin diradmin 700
#set_file "$DAPATH/data/tickets/*/*" diradmin diradmin 700
#set_file "$DAPATH/data/tickets/*/*/*" diradmin diradmin 600 '' nocheck
if [ -d "${DAPATH}/data/tickets" ]; then
find "${DAPATH}/data/tickets" -type d -exec chmod 700 {} \; -exec chown diradmin:diradmin {} \;
find "${DAPATH}/data/tickets" -type f -exec chmod 600 {} \; -exec chown diradmin:diradmin {} \;
fi
}
set_user_home()
{
log "set_user_home $1";
UHOME=`grep -e "^${1}:" /etc/passwd | cut -d: -f6`
if [ "$UHOME" = "" ]; then
log "Home directory for $1 is empty. Check the /etc/passwd file, make sure the account exists";
return;
fi
#Some users might be using file, not folder as homedir. For example - jetbackups uses /dev/null
if [ -d $UHOME ]; then
#chown other-user owned files to user in usr's home directory (commented out for now)
#find $UHOME -not -user apache -not -user $1 -not -user root -not -user mail -exec chown ${i}:${i} {} \;
set_file $UHOME $1 $1 711
set_file $UHOME/.shadow $1 mail 640
set_file $UHOME/domains $1 $1 711
set_file "$UHOME/domains/*" $1 $1 711 '' nocheck
set_file $UHOME/domains/default $1 $1 755
set_file $UHOME/domains/sharedip $1 $1 755
set_file $UHOME/domains/suspended $1 $1 755
set_file $UHOME/backups $1 $1 700
set_file "$UHOME/backups/*" $1 $1 600 '' nocheck
set_file $UHOME/user_backups $1 $1 711
set_file "$UHOME/user_backups/*" $1 $1 755 '' nocheck
if [ -d "${UHOME}/imap" ]; then
find "${UHOME}/imap" -type d -exec chmod 770 {} \; -exec chown ${1}:mail {} \;
find "${UHOME}/imap" -type f -exec chmod 660 {} \; -exec chown ${1}:mail {} \;
fi
if [ -d "${UHOME}/.trash" ]; then
find "${UHOME}/.trash" -type d -exec chmod 770 {} \; -exec chown ${1}:mail {} \;
find "${UHOME}/.trash" -type f -exec chmod 660 {} \; -exec chown ${1}:mail {} \;
fi
set_file $UHOME/.spamassassin $1 mail 771
set_file $UHOME/.spamassassin/spam $1 mail 660
set_file $UHOME/.spamassassin/user_spam $1 mail 771
set_file "$UHOME/.spamassassin/user_spam/*" mail $1 660
fi
# not sure how much else we should do.. the public_html and cgi-bins
# should really be left untouched in case of any custom permission
# like being owned by apache, or 777 etc.
#reset for secure_access_group
SAC=`grep -c secure_access_group /usr/local/directadmin/conf/directadmin.conf`
if [ "$SAC" -gt 0 ]; then
echo "action=rewrite&value=secure_access_group" >> /usr/local/directadmin/data/task.queue
fi
}
user_homes()
{
log "user_homes"
set_file /home root $RT_GRP 711
for i in `all_users`; do
{
set_user_home $i
};
done;
}
do_mysql()
{
log "do_mysql";
MDIR=/var/lib/mysql
if [ "$OS" = "FreeBSD" ]; then
if [ -e /home/mysql ]; then
MDIR=/home/mysql
else
MDIR=/usr/local/mysql/data
fi
fi
if [ -e /etc/debian_version ]; then
if [ -e /home/mysql ]; then
MDIR=/home/mysql
else
MDIR=/usr/local/mysql/data
fi
fi
find $MDIR -type d -exec chmod 700 {} \; -exec chown mysql:mysql {} \;
find $MDIR -type f -exec chmod 660 {} \; -exec chown mysql:mysql {} \;
set_file "${MDIR}*" mysql mysql 711 '' nocheck
}
get_domain_user()
{
if [ "$1" = "" ]; then
error_log "get_domain_user: no domain passed";
echo "";
return;
fi
USERN=`grep -e "^$1:" /etc/virtual/domainowners | cut -d\ -f2`
if [ "$USERN" = "" ]; then
error_log "can't find user for $1 in /etc/virtual/domainowners";
echo "";
return;
fi
echo "$USERN";
}
set_maildir()
{
if [ "$2" = "" ]; then
log "***Warning empty Maildir string***";
return;
fi
if [ ! -e $2 ]; then
log "cannot find $2 : skipping";
return;
fi
user=$1;
md=$2;
set_file $md $user mail 770
chown -R $user:mail $md
OLD_EL=$ECHO_LOG
ECHO_LOG=0
find $md -type d -exec chmod 770 {} \; -exec chown $user:mail {} \;
find $md -type f -exec chmod 660 {} \; -exec chown $user:mail {} \;
ECHO_LOG=$OLD_EL
}
set_domaindir()
{
if [ "$1" = "" ]; then
log "***Warning empty domainname string***"
show_help
return
fi
if [ "$2" = "" ]; then
USERN=`get_domain_user $1`
if [ "$USERN" = "" ]; then
log "***Warning cannot get user for domain $1***"
return
fi
else
USERN="$2"
fi
HOMEDIR=`getent passwd "$USERN" | cut -d: -f6`;
DOMAINDIR="${HOMEDIR}/domains/${1}"
if [ ! -e $DOMAINDIR ]; then
log "cannot find $DOMAINDIR : skipping";
return;
fi
log "Directories found, setting permissions for ${DOMAINDIR}/public_html and private_html"
if [ -d "${DOMAINDIR}/public_html" ]; then
find "${DOMAINDIR}/public_html" -type d -exec chmod 755 {} \; -exec chown ${USERN}:${USERN} {} \;
find "${DOMAINDIR}/public_html" -type f -exec chmod 644 {} \; -exec chown ${USERN}:${USERN} {} \;
fi
if [ -d "${DOMAINDIR}/public_ftp" ]; then
find "${DOMAINDIR}/public_ftp" -type d -exec chmod 755 {} \; -exec chown ${USERN}:${USERN} {} \;
find "${DOMAINDIR}/public_ftp" -type f -exec chmod 644 {} \; -exec chown ${USERN}:${USERN} {} \;
fi
if [ -d "${DOMAINDIR}/logs" ]; then
find "${DOMAINDIR}/logs" -type d -exec chmod 755 {} \; -exec chown ${USERN}:${USERN} {} \;
find "${DOMAINDIR}/logs" -type f -exec chmod 644 {} \; -exec chown ${USERN}:${USERN} {} \;
fi
if [ -d "${DOMAINDIR}/.htpasswd" ]; then
find "${DOMAINDIR}/.htpasswd" -type d -exec chmod 755 {} \; -exec chown ${USERN}:${USERN} {} \;
find "${DOMAINDIR}/.htpasswd" -type f -exec chmod 644 {} \; -exec chown ${USERN}:${USERN} {} \;
fi
if [ -d "${DOMAINDIR}/stats" ]; then
find "${DOMAINDIR}/stats" -type d -exec chmod 755 {} \; -exec chown ${USERN}:${USERN} {} \;
find "${DOMAINDIR}/stats" -type f -exec chmod 644 {} \; -exec chown ${USERN}:${USERN} {} \;
fi
if [ -L "${DOMAINDIR}/private_html" ]; then
chown -h ${USERN}:${USERN} "${DOMAINDIR}/private_html"
elif [ -d "${DOMAINDIR}/private_html" ]; then
find "${DOMAINDIR}/private_html" -type d -exec chmod 755 {} \; -exec chown ${USERN}:${USERN} {} \;
find "${DOMAINDIR}/private_html" -type f -exec chmod 644 {} \; -exec chown ${USERN}:${USERN} {} \;
fi
}
set_domaindirs() {
for user in `ls /usr/local/directadmin/data/users`; do
{
for domain in `grep ": $user" /etc/virtual/domainowners | cut -d: -f1`; do
{
set_domaindir ${domain} ${user}
};
done
};
done
}
set_dovecot()
{
log "dovecot";
for i in `all_users`; do
{
uhome=`grep -e "^${i}:" /etc/passwd | cut -d: -f6`
if [ "$uhome" = "" ]; then
continue;
fi
$0 maildir $i $uhome/Maildir
set_file $uhome/imap $i mail 770
if [ -s /usr/local/directadmin/data/users/${i}/domains.list ]; then
for domain in `cat /usr/local/directadmin/data/users/${i}/domains.list`; do {
cat /etc/virtual/${domain}/passwd | cut -d: -f6 | sort | uniq | while read line; do {
if [ ! -d ${line}/domains ]; then
chown $user:mail "${line}"
chmod 770 "${line}"
fi
$0 maildir ${i} "${line}/Maildir"
}
done
}
done
fi
};
done;
}
email()
{
log "email";
VDIR=/etc/virtual
HN=`hostname`
find "$VDIR" -type d -exec chmod 750 {} \; -exec chown mail:mail {} \;
find "$VDIR" -type f -exec chmod 640 {} \; -exec chown mail:mail {} \;
set_file $VDIR mail mail 755
set_file $VDIR/domainowners mail mail 640
set_file $VDIR/domains mail mail 640
set_file $VDIR/pophosts mail mail 600
set_file $VDIR/pophosts_user mail mail 600
set_file $VDIR/majordomo majordomo daemon 750
set_file $VDIR/bad_sender_hosts mail mail 600
set_file $VDIR/bad_sender_hosts_ip mail mail 600
set_file $VDIR/blacklist_domains mail mail 600
set_file $VDIR/blacklist_senders mail mail 600
set_file $VDIR/whitelist_domains mail mail 600
set_file $VDIR/whitelist_hosts mail mail 600
set_file $VDIR/whitelist_hosts_ip mail mail 600
set_file $VDIR/whitelist_senders mail mail 600
set_file $VDIR/use_rbl_domains mail mail 600
set_file $VDIR/skip_av_domains mail mail 600
set_file $VDIR/skip_rbl_domains mail mail 600
for i in `cat /etc/virtual/domainowners | cut -d ":" -f 1`; do
{
if [ "$i" = "$HN" ]; then
continue;
fi
if [ -d $VDIR/$i ]; then
USERN=`get_domain_user $i`;
if [ "$USERN" = "" ]; then
USERN="mail";
fi
set_file $VDIR/$i mail mail 711
DDIR=$VDIR/$i
set_file $DDIR/aliases mail mail 600
set_file $DDIR/filter mail mail 640
set_file $DDIR/filter.conf mail mail 600
set_file $DDIR/passwd mail mail 600
set_file $DDIR/quota mail mail 600
set_file $DDIR/dkim.private.key mail mail 600
set_file $DDIR/dkim.public.key mail mail 600
set_file $DDIR/dovecot.bytes mail mail 600
set_file $DDIR/vacation.conf mail mail 600
set_file $DDIR/autoresponder.conf mail mail 600
set_file $DDIR/reply mail mail 700
set_file "$DDIR/reply/*" mail mail 600 '' nocheck
set_file $DDIR/majordomo majordomo daemon 751
set_file $DDIR/majordomo/majordomo.cf majordomo daemon 640
set_file $DDIR/majordomo/list.aliases majordomo mail 640
set_file $DDIR/majordomo/private.aliases majordomo mail 640
set_file $DDIR/majordomo/archive majordomo daemon 751
set_file $DDIR/majordomo/digests majordomo daemon 751
set_file $DDIR/majordomo/lists majordomo daemon 751
chown -R majordomo:daemon $DDIR/majordomo/lists
fi
};
done;
if [ "$DOVECOT" -eq 0 ]; then
VSV=/var/spool/virtual
set_file $VSV mail mail 1777
for i in `all_users`; do
{
set_file $VSV/$i $i mail 770
set_file "$VSV/$i/*" $i mail 660 '' nocheck
};
done;
SPOOLM=/var/spool/mail
if [ "$OS" = "FreeBSD" ]; then
SPOOLM=/var/mail
fi
set_file $SPOOLM mail mail 1777
for i in `all_users`; do
{
set_file $SPOOLM/$i $i mail 660
};
done;
fi
set_file /var/spool/exim mail mail 750
set_file "/var/spool/exim/*" mail mail 750 '' nocheck
#set_file "/var/spool/exim/*/*" mail mail 640 '' nocheck
chown -R mail:mail /var/spool/exim
set_file /etc/exim.cert mail mail 644
set_file /etc/exim.key mail mail 600
if [ "$DOVECOT" -eq 1 ]; then
set_dovecot;
fi
mkdir -p /var/log/exim
set_file /var/log/exim mail mail 640 -R
set_file /var/log/exim mail mail 750
set_file /usr/sbin/exim root $RT_GRP 4755
}
logs()
{
log "logs";
VL=/var/log
if [ ! -e $VL/directadmin ]; then
error_log "$VL/directadmin didn't exists, creating it.";
mkdir -p $VL/directadmin
fi
set_file $VL/directadmin diradmin diradmin 700
set_file "$VL/directadmin/*" diradmin diradmin 600 '' nocheck
mkdir -p $VL/exim
set_file $VL/exim mail mail 755
set_file "$VL/exim/*" mail mail 644 '' nocheck
mkdir -p $VL/proftpd
set_file $VL/proftpd root $RT_GRP 755
set_file "$VL/proftpd/*" root $RT_GRP 644 '' nocheck
if [ "${HAVE_HTTPD}" -eq 1 ]; then
#http.. well it's all root, permissions don't really matter
mkdir -p /var/log/httpd/domains
chmod 710 /var/log/httpd
chmod 710 /var/log/httpd/domains
chown root:nobody /var/log/httpd/domains
fi
if [ "${HAVE_NGINX}" -eq 1 ]; then
mkdir -p /var/log/nginx/domains
chmod 710 /var/log/nginx
chmod 710 /var/log/nginx/domains
chown root:nobody /var/log/httpd/domains
fi
}
etc_configs()
{
log "etc_configs";
find /etc -name "exim.*" -type d -exec chmod 755 {} \;
find /etc -name "exim.*" -type f -exec chmod 644 {} \;
set_file /etc/exim.cert mail mail 644
set_file /etc/exim.key mail mail 600
set_file /etc/system_filter.exim root $RT_GRP 755
set_file /etc/proftpd.conf root $RT_GRP 644
set_file /etc/proftpd.vhosts.conf root $RT_GRP 644
set_file /etc/proftpd.passwd root ftp 640
#httpd.. again, all root.. nothing special about it.
}
all()
{
da_files;
user_homes;
do_mysql;
email;
logs;
etc_configs;
}
all_with_domaindirs() {
all
set_domaindirs
}
if [ "$1" != "maildir" ]; then
log "***********************************************";
log "`date` : $0 $1";
fi
case "$1" in
all) all;
;;
all_with_domaindirs) all_with_domaindirs;
;;
da_files) da_files;
;;
user_homes) user_homes;
;;
set_user_home) set_user_home $2
;;
mysql) do_mysql;
;;
email) email;
;;
logs) logs;
;;
etc_configs) etc_configs;
;;
maildir) set_maildir $2 $3;
;;
domaindir) set_domaindir $2 $3;
;;
domaindirs) set_domaindirs;
;;
*) show_help;
;;
esac
exit 0;

1858
update/scripts/setup.sh Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,85 @@
#!/bin/bash
#VERSION=0.0.1
# This script is written by Martynas Bendorius and DirectAdmin
# It is used to move user from one reseller to another
# Official DirectAdmin webpage: http://www.directadmin.com
# Usage:
# ./squirrelmail_to_roundcube.sh <email@domain.com> </var/www/html/squirrelmail/data/email@domain.com.abook>
MYUID=`/usr/bin/id -u`
if [ "$MYUID" != 0 ]; then
echo "You require Root Access to run this script";
exit 0;
fi
if [ $# != 2 ]; then
echo "Usage:";
echo "$0 <email@domain.com> </var/www/html/squirrelmail/data/email@domain.com.abook>";
echo "you gave #$#: $0 $1 $2";
exit 0;
fi
#https://newfivefour.com/unix-urlencode-urldecode-command-line-bash.html
urlencode() {
# urlencode <string>
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%s' "$c" | xxd -p -c1 |
while read c; do printf '%%%s' "$c"; done ;;
esac
done
}
INPUTFILE="$2"
if [ -s "${INPUTFILE}" ]; then
OUTPUTFILE="/tmp/${1}_to_roundcube.xml"
printf "<ROUNDCUBE>\n" > "${OUTPUTFILE}"
USERNAME="`urlencode \"${1}\" | perl -p0 -e 's|%|%%|g'`"
printf "\t<EMAIL>\n" >> "${OUTPUTFILE}"
printf "\t\t<USERNAME>${USERNAME}</USERNAME>\n" >> "${OUTPUTFILE}"
printf "\t\t<INDENTITIES></INDENTITIES>\n" >> "${OUTPUTFILE}"
printf "\t\t<CONTACTS>\n" >> "${OUTPUTFILE}"
while read LINE; do {
FIRSTNAME_D="`echo \"${LINE}\" | cut -d'|' -f2`"
LASTNAME_D="`echo \"${LINE}\" | cut -d'|' -f3`"
EMAIL_D="`echo \"${LINE}\" | cut -d'|' -f4`"
INFO_D="`echo \"${LINE}\" | cut -d'|' -f5`"
DATE_D="`date '+%Y-%m-%d %H:%M:%S'`"
FIRSTNAME="`urlencode \"${FIRSTNAME_D}\" | perl -p0 -e 's|%|%%|g'`"
LASTNAME="`urlencode \"${LASTNAME_D}\" | perl -p0 -e 's|%|%%|g'`"
EMAIL="`urlencode \"${EMAIL_D}\" | perl -p0 -e 's|%|%%|g'`"
INFO="`urlencode \"${INFO_D}\" | perl -p0 -e 's|%|%%|g'`"
DATE="`urlencode \"${DATE_D}\" | perl -p0 -e 's|%|%%|g'`"
printf "\t\t\t<CONTACT>\n" >> "${OUTPUTFILE}"
printf "\t\t\t\t<EMAIL>${EMAIL}</EMAIL>\n" >> "${OUTPUTFILE}"
printf "\t\t\t\t<NAME></NAME>\n" >> "${OUTPUTFILE}"
printf "\t\t\t\t<CHANGED>${DATE}</CHANGED>\n" >> "${OUTPUTFILE}"
printf "\t\t\t\t<FIRSTNAME>${FIRSTNAME}</FIRSTNAME>\n" >> "${OUTPUTFILE}"
printf "\t\t\t\t<SURNAME>${LASTNAME}</SURNAME>\n" >> "${OUTPUTFILE}"
printf "\t\t\t\t<VCARD>BEGIN%%3AVCARD%%0AVERSION%%3A3.0%%0AFN%%3A${FIRSTNAME}+${LASTNAME}.%%0AEMAIL%%3BTYPE%%3DINTERNET%%3A${EMAIL}%%0AEND%%3AVCARD</VCARD>\n" >> "${OUTPUTFILE}"
printf "\t\t\t\t<WORDS>${INFO}</WORDS>\n" >> "${OUTPUTFILE}"
printf "\t\t\t\t<GROUPS>\n" >> "${OUTPUTFILE}"
printf "\t\t\t\t</GROUPS>\n" >> "${OUTPUTFILE}"
printf "\t\t\t</CONTACT>\n" >> "${OUTPUTFILE}"
};
done < "${INPUTFILE}"
printf "\t\t</CONTACTS>\n" >> "${OUTPUTFILE}"
printf "\t</EMAIL>\n" >> "${OUTPUTFILE}"
printf "</ROUNDCUBE>\n" >> "${OUTPUTFILE}"
DOMAIN_TO_RESTORE="`echo \"${1}\" | cut -d\@ -f2`"
if [ -s /usr/local/directadmin/scripts/restore_roundcube.php ]; then
username="${1}" domain="${DOMAIN_TO_RESTORE}" xml_file="${OUTPUTFILE}" /usr/local/directadmin/scripts/restore_roundcube.php
else
echo "Unable to find /usr/local/directadmin/scripts/restore_roundcube.php for restore"
rm -f "${OUTPUTFILE}"
exit 1
fi
rm -f "${OUTPUTFILE}"
fi

67
update/scripts/startips Normal file
View File

@@ -0,0 +1,67 @@
#!/bin/bash
# chkconfig: 2345 11 50
# description: Load ip's into the network device
### BEGIN INIT INFO
# Provides: startips
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: startips
# Description: script to load in fresh IPs
### END INIT INFO
case "$1" in
stop)
exit 0
;;
esac
if [ "${OS}" != "FreeBSD" ] && [ -x /sbin/ip ]; then
if ! /sbin/ip route show | grep -m1 -q "default"; then
echo "startips: default route not found - sleeping for 10s"
sleep 10
if ! /sbin/ip route show | grep -m1 -q "default"; then
echo "startips: secondary attempt to find default route failed, no DirectAdmin additional IPs will be added"
exit 1
fi
fi
fi
DACONF=/usr/local/directadmin/conf/directadmin.conf
DABIN=/usr/local/directadmin/directadmin
IPPATH="/usr/local/directadmin/data/admin/"
IPDIR="ips/"
IPLIST="ip.list"
ADDIP=`${DABIN} c | grep -m1 '^addip=' | cut -d= -f2`
OS=`uname`
if [ "${OS}" = "FreeBSD" ]; then
ETH_DEV=`grep -m1 '^ifconfig_' /etc/rc.conf | cut -d= -f1 | cut -d_ -f2`
else
ETH_DEV=eth0
fi
if grep -m1 -q '^ethernet_dev=' ${DACONF}; then
ETH_DEV=`grep -m1 '^ethernet_dev=' ${DACONF} | cut -d= -f2 | cut -d: -f1`
fi
for i in `cat ${IPPATH}${IPLIST}`; do
{
NETMASK=`grep -m1 '^netmask=' ${IPPATH}${IPDIR}${i} | cut -d= -f2`
if [ -z ${NETMASK} ]; then
if echo ${i} | grep -m1 -q ':'; then
NETMASK="/64"
else
NETMASK=255.255.255.0
fi
fi
$ADDIP $i $NETMASK $ETH_DEV >/dev/null
};
done
echo "action=named&value=restart" >> /usr/local/directadmin/data/task.queue
exit 0

View File

@@ -0,0 +1,16 @@
# DirectAdmin control panel
# To reload systemd daemon after changes to this file:
# systemctl --system daemon-reload
[Unit]
Description=Start the additional IPs
Wants=network-online.target
After=syslog.target network.target network-online.target
Requires=network.target
Documentation=http://www.directadmin.com
[Service]
Type=oneshot
ExecStart=/usr/local/directadmin/scripts/startips start
[Install]
WantedBy=multi-user.target

59
update/scripts/sysbk.sh Normal file
View File

@@ -0,0 +1,59 @@
#!/bin/sh
CWD=`pwd`
NAME=sysbk
PRIMARY=http://da-mirror.wpcloud.vn/services
SECONDARY=http://files3.directadmin.com/services
SAVE=/usr/local/directadmin/scripts/packages
FILE=${NAME}.tar.gz
DIR=/usr/local
OS=`uname`
if [ "$OS" = "FreeBSD" ]; then
WGET=/usr/local/bin/wget
else
WGET=/usr/bin/wget
fi
if [ ! -e $SAVE/$FILE ]; then
$WGET -O $SAVE/$FILE $PRIMARY/$FILE
fi
if [ ! -e $SAVE/$FILE ]; then
$WGET -O $SAVE/$FILE $SECONDARY/$FILE
fi
if [ ! -e $SAVE/$FILE ]; then
echo "Unable to get $SAVE/$FILE"
exit 1;
fi
cd $DIR
tar xzf $SAVE/$FILE
#swap out linux files for freebsd file:
if [ "$OS" = "FreeBSD" ]; then
FILES=$DIR/$NAME/mod/custom.files
perl -pi -e 's#/etc/shadow#/etc/master.passwd#' $FILES
DIRS=$DIR/$NAME/mod/custom.dirs
perl -pi -e 's#/var/spool/mail#/var/mail#' $DIRS
perl -pi -e 's#/var/spool/cron#/var/cron#' $DIRS
fi
KEY=/root/.ssh/id_dsa
if [ ! -e $KEY ]; then
/usr/bin/ssh-keygen -t dsa -N '' -q -f $KEY
fi
cd /usr/local/directadmin/scripts
#if [ ! -e "/usr/bin/ncftpput" ]; then
# ./ncftp.sh
#fi
cd $CWD;

186
update/scripts/tlsa.sh Normal file
View File

@@ -0,0 +1,186 @@
#!/bin/sh
#VERSION=0.3
# This script is written by Martynas Bendorius and DirectAdmin
# It is used to recreate tlsa records for domain
# Official DirectAdmin webpage: http://www.directadmin.com
# Usage:
# ./tlsa <domain>
MYUID=`/usr/bin/id -u`
if [ "${MYUID}" != 0 ]; then
echo "You require Root Access to run this script";
exit 0;
fi
DA_BIN=/usr/local/directadmin/directadmin
TASK_QUEUE=/usr/local/directadmin/data/task.queue.cb
if [ $# -ne 2 ]; then
echo "usage: $0 <domain> <web|mail|all>"
exit 1
fi
OPENSSL=/usr/bin/openssl
run_dataskq() {
DATASKQ_OPT=$1
/usr/local/directadmin/dataskq ${DATASKQ_OPT} --custombuild
}
DOMAIN=$1
TLSATYPE=$2
case "$TLSATYPE" in
"all")
;;
"web")
;;
"mail")
;;
*)
echo "usage: $0 <domain> <web|mail|all>"
exit 1
esac
DOMAINARR=`echo "${DOMAIN}" | perl -p0 -e "s/,/ /g"`
FOUNDDOMAIN=0
for TDOMAIN in ${DOMAINARR}
do
DOMAIN=${TDOMAIN}
DOMAIN_ESCAPED="`echo ${DOMAIN} | perl -p0 -e 's#\.#\\\.#g'`"
if grep -m1 -q "^${DOMAIN_ESCAPED}:" /etc/virtual/domainowners; then
USER=`grep -m1 "^${DOMAIN_ESCAPED}:" /etc/virtual/domainowners | cut -d' ' -f2`
HOSTNAME=0
FOUNDDOMAIN=1
break
elif grep -m1 -q "^${DOMAIN_ESCAPED}$" /etc/virtual/domains; then
USER="root"
if ${DA_BIN} c | grep -m1 -q "^servername=${DOMAIN_ESCAPED}\$"; then
HOSTNAME=1
FOUNDDOMAIN=1
break
else
echo "Domain exists in /etc/virtual/domains, but is not set as a hostname in DirectAdmin. Unable to find 'servername=${DOMAIN}' in the output of '/usr/local/directadmin/directadmin c'."
#exit 1
fi
else
echo "Domain does not exist on the system. Unable to find ${DOMAIN} in /etc/virtual/domainowners."
#exit 1
fi
done
if [ ${FOUNDDOMAIN} -eq 0 ]; then
echo "no valid domain found - exiting"
exit 1
fi
DA_USERDIR="/usr/local/directadmin/data/users/${USER}"
DA_CONFDIR="/usr/local/directadmin/conf"
if [ ! -d "${DA_USERDIR}" ] && [ "${HOSTNAME}" -eq 0 ]; then
echo "${DA_USERDIR} not found, exiting..."
exit 1
elif [ ! -d "${DA_CONFDIR}" ] && [ "${HOSTNAME}" -eq 1 ]; then
echo "${DA_CONFDIR} not found, exiting..."
exit 1
fi
add_record() {
echo "action=dns&do=add&domain=${1}&type=TLSA&name=${2}&value=${3}&ttl=300&named_reload=yes" >> ${TASK_QUEUE}
GENERATED=1
}
try_gen_tlsa() {
if [ ! -x /usr/local/directadmin/directadmin ]; then
echo 1
else
if ! /usr/local/directadmin/directadmin c | grep -m1 -q '^dns_tlsa=1$'; then
echo 2
else
if [ "${HOSTNAME}" -eq 0 ]; then
CERT="${DA_USERDIR}/domains/${DOMAIN}.cert"
else
CERT=`${DA_BIN} c |grep ^cacert= | cut -d= -f2`
fi
if [ ! -f "${CERT}" ] && [ "$TLSATYPE" == "web" ]; then
echo 2
else
GENERATED=0
TLSA_HASH_SHA256_PUB=`${OPENSSL} x509 -in ${CERT} -noout -pubkey | ${OPENSSL} pkey -pubin -outform DER |${OPENSSL} sha256 | cut -d' ' -f2`
HOST_TLSA_VAL="3 1 1 ${TLSA_HASH_SHA256_PUB}"
DNSLIST=`openssl x509 -in ${CERT} -text -noout| grep -A1 "Subject Alternative Name"|tail -1`
WEB_RECORDS_TO_CLEANUP="_443._tcp.${DOMAIN}. _443._udp.${DOMAIN}. _443._tcp.www.${DOMAIN}. _443._udp.www.${DOMAIN}."
MAIL_RECORDS_TO_CLEANUP="_25._tcp.${DOMAIN}. _25._tcp.mail.${DOMAIN}. _25._tcp.www.${DOMAIN}."
if [ "$TLSATYPE" == "web" ] || [ "$TLSATYPE" == "all" ]; then
for name in `echo ${WEB_RECORDS_TO_CLEANUP}`; do {
echo "action=dns&do=delete&domain=${DOMAIN}&type=TLSA&name=${name}" >> ${TASK_QUEUE}
}
done
fi
if [ "$TLSATYPE" == "mail" ] || [ "$TLSATYPE" == "all" ]; then
for name in `echo ${MAIL_RECORDS_TO_CLEANUP}`; do {
echo "action=dns&do=delete&domain=${DOMAIN}&type=TLSA&name=${name}" >> ${TASK_QUEUE}
}
done
fi
run_dataskq
for DNSN in ${DNSLIST}; do {
DNSN=`echo ${DNSN}|cut -d':' -f2| tr -d ','`
if [ "${DNSN}" == "${DOMAIN}" ]; then
if [ "$TLSATYPE" == "web" ] || [ "$TLSATYPE" == "all" ]; then
add_record "${DOMAIN}" "_443._tcp.${DNSN}." "${HOST_TLSA_VAL}"
add_record "${DOMAIN}" "_443._udp.${DNSN}." "${HOST_TLSA_VAL}"
fi
if [ "$TLSATYPE" == "mail" ] || [ "$TLSATYPE" == "all" ]; then
add_record "${DOMAIN}" "_25._tcp.${DNSN}." "${HOST_TLSA_VAL}"
fi
elif [ "${DNSN}" == "www.${DOMAIN}" ]; then
if [ "$TLSATYPE" == "web" ] || [ "$TLSATYPE" == "all" ]; then
add_record "${DOMAIN}" "_443._tcp.${DNSN}." "${HOST_TLSA_VAL}"
add_record "${DOMAIN}" "_443._udp.${DNSN}." "${HOST_TLSA_VAL}"
fi
if [ "$TLSATYPE" == "mail" ] || [ "$TLSATYPE" == "all" ]; then
add_record "${DOMAIN}" "_25._tcp.${DNSN}." "${HOST_TLSA_VAL}"
fi
elif [ "${DNSN}" == "mail.${DOMAIN}" ]; then
if [ "$TLSATYPE" == "mail" ] || [ "$TLSATYPE" == "all" ]; then
add_record "${DOMAIN}" "_25._tcp.${DNSN}." "${HOST_TLSA_VAL}"
fi
fi
}; done
fi
run_dataskq
if [ ${GENERATED} -ne 1 ]; then
echo 4
else
echo 0
fi
fi
fi
}
RETTLSA=`try_gen_tlsa`
if [ $RETTLSA -ne 0 ]
then
echo "TLSA gen failed"
case "$RETTLSA" in
1)
echo "No directadmin binary found."
;;
2)
echo "TLSA not enabled in directadmin.conf"
;;
*)
echo "Unexpected problem: no domain of specified type found or cert doesn't exist.."
;;
esac
exit $RETTLSA
else
echo "TLSA gen succeeded"
fi
exit 0

221
update/scripts/update.sh Normal file
View File

@@ -0,0 +1,221 @@
#!/bin/sh
OS=`uname`
DA_PATH=/usr/local/directadmin
DA_SCRIPTS=${DA_PATH}/scripts
DA_TQ=${DA_PATH}/data/task.queue
DA_SYSTEMD_SERVICE=/etc/systemd/system/directadmin.service
if [ ${OS} = "FreeBSD" ]; then
MD5SUM=/sbin/md5
else
MD5SUM=/usr/bin/md5sum
fi
BIN_RM=/bin/rm
if [ ! -x $BIN_RM ] && [ -x /usr/bin/rm ]; then
BIN_RM=/usr/bin/rm
fi
if [ ! -x $BIN_RM ]; then
BIN_RM=rm
fi
if [ -s ${DA_SYSTEMD_SERVICE} ]; then
if [ ${OS} = "FreeBSD" ]; then
FMD5=`$MD5SUM -q $DA_SYSTEMD_SERVICE`
else
FMD5=`$MD5SUM $DA_SYSTEMD_SERVICE | cut -d\ -f1`
fi
if [ "$FMD5" = "2ac1c3fa303710d85ba77734c578cff2" ]; then
service directadmin stop
sleep 1
killall -9 directadmin 2>/dev/null
killall -9 directadmin 2>/dev/null
cp -f ${DA_SCRIPTS}/directadmin.service ${DA_SYSTEMD_SERVICE}
systemctl daemon-reload
service directadmin start
fi
fi
#create dataskq symlink or relink if one already exists
#https://www.directadmin.com/features.php?id=2997
if [ ! -L $DA_PATH/dataskq ]; then
${BIN_RM} -f $DA_PATH/dataskq
ln -sf directadmin $DA_PATH/dataskq
chown -h diradmin:diradmin $DA_PATH/dataskq
fi
#added new options to templates
#echo 'action=rewrite&value=httpd' >> $DA_TQ
echo "action=cache&value=showallusers" >> /usr/local/directadmin/data/task.queue
echo "action=cache&value=safemode" >> $DA_TQ
echo "action=convert&value=cronbackups" >> $DA_TQ
echo "action=convert&value=suspendedmysql" >> $DA_TQ
echo "action=syscheck" >> $DA_TQ
if [ ! -d /usr/local/sysbk ]; then
cd $DA_SCRIPTS
./sysbk.sh
fi
#https://www.directadmin.com/features.php?id=1930
echo "action=da-popb4smtp&value=restart" >> $DA_TQ
#grep -H "usertype=reseller" /usr/local/directadmin/data/users/*/user.conf | cut -d/ -f7 > /usr/local/directadmin/data/admin/reseller.list
#chown diradmin:diradmin /usr/local/directadmin/data/admin/reseller.list
#chmod 600 /usr/local/directadmin/data/admin/reseller.list
if [ "${OS}" = "FreeBSD" ]; then
CONF=/etc/newsyslog.conf
if [ ! -s $CONF ]; then
perl -pi -e 's/\sN\s/\t-\t/' ${CONF}
perl -pi -e 's/\sU\s/\t-\t/' ${CONF}
#addLog /file user:group flag pid
addLog()
{
if grep -m1 -q $1 $CONF; then
return;
fi
echo -e "$1\t$2\t600\t4\t*\t@T00\t$3\t$4" >> $CONF
}
addLog /var/log/chrootshell.log '' -
addLog /var/log/proftpd/auth.log '' -
addLog /var/log/proftpd/xferlog.legacy '' -
addLog /var/log/proftpd/access.log '' - /var/run/proftpd.pid
addLog /var/log/pureftp.log '' - /var/run/pure-ftpd.pid
addLog /var/log/httpd/access_log apache:apache -
addLog /var/log/httpd/fpexe_log apache:apache -
addLog /var/log/httpd/suexec_log apache:apache -
addLog /var/log/suphp.log '' -
addLog /var/log/httpd/error_log apache:apache - /var/run/httpd.pid
addLog /var/log/exim/paniclog mail:mail -
addLog /var/log/exim/exim_paniclog mail:mail -
addLog /var/log/exim/rejectlog mail:mail -
addLog /var/log/exim/exim_rejectlog mail:mail -
addLog /var/log/exim/processlog mail:mail -
addLog /var/log/exim/exim_processlog mail:mail -
addLog /var/log/exim/mainlog mail:mail - /var/run/exim.pid
addLog /var/log/exim/exim_mainlog mail:mail - /var/run/exim.pid
addLog /var/log/directadmin/error.log diradmin:diradmin -
addLog /var/log/directadmin/errortaskq.log diradmin:diradmin -
addLog /var/log/directadmin/security.log diradmin:diradmin -
addLog /var/log/directadmin/system.log diradmin:diradmin -
addLog /var/log/directadmin/login.log diradmin:diradmin -
addLog /usr/local/php53/var/log/php-fpm.log '' - "/var/run/php-fpm53.pid\t30"
addLog /usr/local/php54/var/log/php-fpm.log '' - "/var/run/php-fpm54.pid\t30"
addLog /usr/local/php60/var/log/php-fpm.log '' - "/var/run/php-fpm60.pid\t30"
addLog /var/www/html/roundcube/logs/errors webapps:webapps -
addLog /var/www/html/squirrelmail/data/squirrelmail_access_log webapps:webapps -
addLog /var/www/html/phpMyAdmin/log/auth.log webapps:webapps -
else
echo "Doesn't look like you have newsyslog installed";
fi
fi
if [ -e /etc/logrotate.d ]; then
if [ ! -e /etc/logrotate.d/directadmin ] && [ -e $DA_SCRIPTS/directadmin.rotate ]; then
cp $DA_SCRIPTS/directadmin.rotate /etc/logrotate.d/directadmin
fi
if [ -e /etc/logrotate.d/directadmin ]; then
if ! grep -m1 -q 'login.log' /etc/logrotate.d/directadmin; then
cp $DA_SCRIPTS/directadmin.rotate /etc/logrotate.d/directadmin
fi
fi
fi
echo "action=addoptions" >> $DA_TQ
rm -f /usr/local/directadmin/data/skins/*/ssi_test.html 2>/dev/null
perl -pi -e 's/trusted_users = mail:majordomo:apache$/trusted_users = mail:majordomo:apache:diradmin/' /etc/exim.conf
chmod 750 /etc/virtual/majordomo
${DA_SCRIPTS}/cron_deny.sh
${DA_SCRIPTS}/check_named_conf.sh
if [ -s /etc/proftpd.conf ]; then
perl -pi -e "s/userlog \"%u %b\"/userlog \"%u %b %m\"/" /etc/proftpd.conf
perl -pi -e "s/userlog \"%u %b %m\"/userlog \"%u %b %m %a\"/" /etc/proftpd.conf
#dont restart proftpd if it not on.
HAS_PUREFTPD=`${DA_PATH}/directadmin c | grep ^pureftp= | cut -d= -f2`
if [ "${HAS_PUREFTPD}" != "1" ]; then
echo "action=proftpd&value=restart" >> /usr/local/directadmin/data/task.queue
fi
fi
if [ -e /usr/share/spamassassin/72_active.cf ]; then
perl -pi -e 's#header FH_DATE_PAST_20XX.*#header FH_DATE_PAST_20XX Date =~ /20[2-9][0-9]/ [if-unset: 2006]#' /usr/share/spamassassin/72_active.cf
fi
if [ -e /etc/exim.key ]; then
chown mail:mail /etc/exim.key
chmod 600 /etc/exim.key
fi
#1.37.1
#very important update to allow DA to listen correctly on IPv4 and IPv6
if [ "${OS}" = "FreeBSD" ]; then
if ! grep -m1 -q 'ipv6_ipv4mapping=' /etc/rc.conf; then
echo "ipv6_ipv4mapping=\"YES\"" >> /etc/rc.conf
fi
if ! grep -m1 -q 'net.inet6.ip6.v6only=' /etc/sysctl.conf; then
echo "net.inet6.ip6.v6only=0" >> /etc/sysctl.conf
/etc/rc.d/sysctl restart
fi
/sbin/sysctl net.inet6.ip6.v6only=0 >/dev/null 2>&1
fi
UKN=/etc/virtual/limit_unknown
if [ ! -e $UKN ]; then
echo 0 > $UKN;
chown mail:mail $UKN
chown mail:mail /etc/virtual/limit
fi
UL=/etc/virtual/user_limit
if [ ! -s ${UL} ]; then
echo "0" > ${UL}
chown mail:mail ${UL}
chmod 644 ${UL}
fi
#debian if MySQL 5.5.11+
#april 21, 2011
if [ -e /etc/debian_version ]; then
if [ -e /usr/local/directadmin/directadmin ]; then
COUNT=`ldd /usr/local/directadmin/directadmin | grep -c libmysqlclient.so.16`
if [ "${COUNT}" -eq 1 ]; then
if [ ! -e /usr/local/mysql/lib/libmysqlclient.so.16 ] && [ -e /usr/local/mysql/lib/libmysqlclient.so.18 ]; then
echo "*** Linking libmysqlclient.so.16 to libmysqlclient.so.18";
ln -s libmysqlclient.so.18 /usr/local/mysql/lib/libmysqlclient.so.16
ldconfig
fi
fi
COUNT=`ldd /usr/local/directadmin/directadmin | grep -c libmysqlclient.so.18`
if [ "${COUNT}" -eq 1 ]; then
if [ ! -e /usr/local/mysql/lib/libmysqlclient.so.18 ] && [ -e /usr/local/mysql/lib/libmysqlclient.so.16 ]; then
echo "*** Linking libmysqlclient.so.18 to libmysqlclient.so.16";
ln -s libmysqlclient.so.16 /usr/local/mysql/lib/libmysqlclient.so.18
ldconfig
fi
fi
fi
fi
#DA 1.43.1
#http://www.directadmin.com/features.php?id=1453
echo "action=rewrite&value=filter" >> /usr/local/directadmin/data/task.queue
#DA 1.56.2
#https://www.directadmin.com/features.php?id=2332
echo 'action=rewrite&value=cron_path' >> /usr/local/directadmin/data/task.queue
#DA 1.60.5
FS=/usr/local/directadmin/data/templates/feature_sets
rm -rf ${FS}/tickets ${FS}/view_domain
exit 0

View File

@@ -0,0 +1,167 @@
#!/bin/sh
# This script is written by Martynas Bendorius and DirectAdmin
# It is used to convert user to reseller
# Official DirectAdmin webpage: http://www.directadmin.com
# Usage:
# ./user_to_reseller.sh <user>
MYUID=`/usr/bin/id -u`
if [ "$MYUID" != 0 ]; then
echo "You require Root Access to run this script";
exit 0;
fi
if [ $# != 1 ]; then
echo "Usage:";
echo "$0 <user>";
echo "you gave #$#: $0 $1";
exit 0;
fi
USERNAME=$1
BASEDIR=/usr/local/directadmin/data
ADMIN_DATA=${BASEDIR}/users/admin
RESELLER_LIST=${BASEDIR}/admin/reseller.list
USER_DATA=${BASEDIR}/users/$1
USER_BACKUP_CONF=${USER_DATA}/backup.conf
USER_CONF=${USER_DATA}/user.conf
USER_USAGE=${USER_DATA}/user.usage
RESELLER_ALLOC=${USER_DATA}/reseller.allocation
RESELLER_CONF=${USER_DATA}/reseller.conf
RESELLER_USAGE=${USER_DATA}/reseller.usage
if [ ! -d ${USER_DATA} ]; then
echo "Directory ${USER_DATA} does not exist. Can not continue."
exit 1;
fi
if [ "`grep -wc $1 ${RESELLER_LIST}`" = "1" ]; then
echo "User $1 is already reseller. Can not continue."
exit 1;
fi
if [ ! -e /usr/bin/perl ]; then
echo "/usr/bin/perl does not exist.";
exit 1;
fi
echo "Re-configuring user directory /home/$1."
mkdir -p /home/$1/user_backups
mkdir -p /home/$1/domains/default
mkdir -p /home/$1/domains/sharedip
mkdir -p /home/$1/domains/suspended
cp -R ${BASEDIR}/templates/default/* /home/$1/domains/default
chown -R $1:$1 /home/$1/user_backups
chown -R $1:$1 /home/$1/domains/default
chown -R $1:$1 /home/$1/domains/sharedip
chown -R $1:$1 /home/$1/domains/suspended
SAG=`/usr/local/directadmin/directadmin c | grep secure_access_group | cut -d= -f2`
if [ "$SAG" != "" ]; then
if [ "$SAG" != '(null)' ]; then
#must be set to something, and not null, thus on.
chown $1:$1 /home/$1
chmod 711 /home/$1
chown $1:${SAG} /home/$1/domains
chmod 750 /home/$1/domains
fi
fi
echo "Re-configuring DirectAdmin files."
# Changing usertype
perl -pi -e 's/usertype=user/usertype=reseller/' ${USER_CONF}
# Creating backup.conf
if [ ! -e ${USER_BACKUP_CONF} ]; then
echo -n "" > ${USER_BACKUP_CONF}
echo "ftp_ip=" >> ${USER_BACKUP_CONF}
echo "ftp_password=" >> ${USER_BACKUP_CONF}
echo "ftp_path=/" >> ${USER_BACKUP_CONF}
echo "ftp_username=" >> ${USER_BACKUP_CONF}
echo "local_path=" >> ${USER_BACKUP_CONF}
fi
# Creating ip.list
if [ ! -e ${USER_DATA}/ip.list ]; then
grep "ip=" ${USER_DATA}/user.conf | cut -d= -f2 > ${USER_DATA}/ip.list
fi
# Creating everything else
touch ${USER_DATA}/login.hist
touch ${USER_DATA}/reseller.history
touch ${USER_DATA}/users.list
cp -f ${ADMIN_DATA}/u_welcome.txt ${USER_DATA}/u_welcome.txt
# Creating packages
mkdir -p ${USER_DATA}/packages
touch ${USER_DATA}/packages.list
# Creating reseller.allocation
if [ ! -e ${RESELLER_ALLOC} ]; then
echo -n "" > ${RESELLER_ALLOC}
grep "bandwidth=" ${USER_CONF} >> ${RESELLER_ALLOC}
grep "domainptr=" ${USER_CONF} >> ${RESELLER_ALLOC}
grep "ftp=" ${USER_CONF} >> ${RESELLER_ALLOC}
grep "mysql=" ${USER_CONF} >> ${RESELLER_ALLOC}
grep "nemailf=" ${USER_CONF} >> ${RESELLER_ALLOC}
grep "nemailml=" ${USER_CONF} >> ${RESELLER_ALLOC}
grep "nemailr=" ${USER_CONF} >> ${RESELLER_ALLOC}
grep "nemails=" ${USER_CONF} >> ${RESELLER_ALLOC}
grep "nsubdomains=" ${USER_CONF} >> ${RESELLER_ALLOC}
echo "nusers=0" >> ${RESELLER_ALLOC}
grep "quota=" ${USER_CONF} >> ${RESELLER_ALLOC}
grep "vdomains=" ${USER_CONF} >> ${RESELLER_ALLOC}
fi
# Editing ticket.conf
if [ -e ${USER_DATA}/ticket.conf ] && [ "`grep -c 'active=' ${USER_DATA}/ticket.conf`" = "0" ]; then
echo "active=yes" >> ${USER_DATA}/ticket.conf
echo 'html=Follow <a href="http://www.domain.com/support">this link</a> for a 3rd party ticket system.' >> ${USER_DATA}/ticket.conf
echo "newticket=0" >> ${USER_DATA}/ticket.conf
fi
# Creating reseller.conf
if [ ! -e ${RESELLER_CONF} ]; then
egrep -v "account=|creator=|date_created=|docsroot=|domain=|email=|ip=|name=|skin=|suspend_at_limit=|suspended=|username=|usertype=|zoom=|language=" ${USER_CONF} > ${RESELLER_CONF}
echo "userssh=ON" >> ${RESELLER_CONF}
echo "dns=ON" >> ${RESELLER_CONF}
echo "ip=shared" >> ${RESELLER_CONF}
echo "ips=0" >> ${RESELLER_CONF}
echo "oversell=ON" >> ${RESELLER_CONF}
echo "serverip=ON" >> ${RESELLER_CONF}
echo "subject=Your account for |domain| is now ready for use." >> ${RESELLER_CONF}
fi
# Creating reseller.usage
if [ ! -e ${RESELLER_USAGE} ]; then
egrep -v "db_quota=|email_quota=" ${USER_USAGE} > ${RESELLER_USAGE}
echo "nusers=1" >> ${RESELLER_USAGE}
fi
CREATOR=`grep "creator=" ${USER_CONF} | cut -d= -f2`
CREATOR_USERSLIST=${BASEDIR}/users/${CREATOR}/users.list
echo "Removing user from the other reseller."
perl -pi -e "s#$1\n##g" ${CREATOR_USERSLIST}
# Setting permissions
chmod 600 ${USER_DATA}/backup.conf ${USER_DATA}/reseller.usage ${USER_DATA}/reseller.conf ${USER_DATA}/reseller.allocation ${USER_DATA}/packages.list ${USER_DATA}/login.hist ${USER_DATA}/reseller.history ${USER_DATA}/users.list
chmod 700 ${USER_DATA}/packages
chmod 644 ${USER_DATA}/u_welcome.txt
chown -R diradmin:diradmin ${USER_DATA}/packages ${USER_DATA}/u_welcome.txt ${USER_DATA}/backup.conf ${USER_DATA}/reseller.usage ${USER_DATA}/reseller.conf ${USER_DATA}/reseller.allocation ${USER_DATA}/packages.list ${USER_DATA}/login.hist ${USER_DATA}/reseller.history ${USER_DATA}/users.list
echo "Adding reseller to $3 reseller list"
echo "$1" >> ${RESELLER_LIST}
echo "Changing user owner"
perl -pi -e "s/creator=$CREATOR/creator=admin/g" ${USER_CONF}
#this is needed to update "show all users" cache.
echo "action=cache&value=showallusers" >> /usr/local/directadmin/data/task.queue
/usr/local/directadmin/dataskq
echo "User $1 has been converted to reseller."
exit 0;