#!/bin/sh

#===========================================================
# [AddPoint ѳƼ掠ݡ]
#
# $Id: aputil,v 1.8 2006/03/06 10:36:23 oshima Exp $
#                          Copyright (C) NEC Soft, Ltd. 2003
#===========================================================
##########################################################################
#History : Version  Date        Name          Comment
#          1.5.0.1  2007/07/06  S.Harima      null check -> "" check
#                                             serverkind -> add 
#          1.5.0.2  2007/07/09  K.Hayakawa    crontab -l -> cat
#                                             /usr/bin/ntpdate -> /usr/sbin
#          1.5.0.3  2007/07/19  K.Hayakawa    chg_cgi_passwd -> add function
#	   1.6.0.1  2008/04/30  Y.Toyota      remove fstab(Singele & Admin)
#	   	    2008/06/02  Y.Toyota      remove fstab(Filter)
#	   1.6.0.2  2008/07/24  Y.Toyota      remove fstab(restore)
###########################################################################
#PATH=/sbin:/bin:/usr/sbin:/usr/bin
#LANG=C

VERSION=`echo '$Revision: 1.8 $' | cut -d ' ' -f 2`
DATE=`echo '$Date: 2006/03/06 10:36:23 $' | cut -d ' ' -f 2-3`
COPYRIGHT="Copyright (C) NEC Soft, Ltd. 2003-"`echo $DATE | cut -d '/' -f 1`

NTPCONF="/etc/addpoint/ntpconf"
COMMON_CONFIG="/var/www/cgi-bin/addpoint/withauth/common_config.pl"
ARCHIVE_SPEC="/var/addpoint/addpoint.spec"
PRODUCTS="/etc/addpoint/products"
# Ver. 1.5.0.1  2007/07/06 ADD SRT
SERVER_KIND="/etc/addpoint/serverkind"
# Ver. 1.5.0.1  2007/07/06 ADD END


# Ver. 1.5.0.3  2007/07/19 ADD SRT
CHG_FLG_ON="ON"
CHG_FLG_OFF="OFF"

#####################################################################
# Function : chg_cgi_passwd
#####################################################################
chg_cgi_passwd() {

    # Argv
    CHGPKGFILE=/$1

    # FIle List
    PKGLIST1="grdn_checksum.chk"
    PKGLIST2="grdn_config.tar"

    # Package File Open
    tar zxf ${CHGPKGFILE}

    # Check List Pick Up
    CHK_FILE="etc/admin/server/*/server.conf"
    CHK_LIST=`tar tf ${PKGLIST2} ${CHK_FILE} 2>/dev/null`

    # Change Flag Default Setting
    chg_flg=${CHG_FLG_OFF}

    for CHK_SVR_CNF in ${CHK_LIST}
    do
        if [ -e /opt/Guardian/Admin/${CHK_SVR_CNF} ]; then
            tar xf ${PKGLIST2} ${CHK_SVR_CNF}
            wall_cgi_pwd=`grep Password /opt/Guardian/Admin/${CHK_SVR_CNF} 2>/dev/null`
            wall_cgi_pwd_a=`grep Password /opt/Guardian/Admin/${CHK_SVR_CNF} | awk '{print $3}' 2>/dev/null`
            wall_cgi_pwd_b=`grep Password ${CHK_SVR_CNF} | awk '{print $3}' 2>/dev/null`

            # Password Check
            if [ ${wall_cgi_pwd_b} != ${wall_cgi_pwd_a} ]; then

                # change cgi password
                ed - ${CHK_SVR_CNF} <<-ED
		%s/^Password.*/${wall_cgi_pwd}/
		wq
		ED

                # server.conf renewal
                tar f ${PKGLIST2} --delete ${CHK_SVR_CNF}
                tar f ${PKGLIST2} --append ${CHK_SVR_CNF}

                # Change Flag ON
                chg_flg=${CHG_FLG_ON}
            fi
        fi
    done

    # CHange Flag Check
    if [ ${CHG_FLG_ON} = ${chg_flg} ]; then

        # Reset The Message Digest
        md5sum ${PKGLIST2} |awk '{print $1}' > ${PKGLIST1}

        # Relewal Package File
        tar zcf ${CHGPKGFILE} ${PKGLIST1} ${PKGLIST2}

    fi

    # Delete Temporary File
    rm -rf etc
    rm -f ${PKGLIST1} ${PKGLIST2}
}
# Ver. 1.5.0.3  2007/07/19 ADD END


#
# Messages
#
ME=`basename $0`

EXIT_MISSING_ARG="\
echo \"${ME}: option \\\`\$1' requires an argument\" >&2
echo \"\${HELP}\" >&2
exit 1"

HELP="\
Try \`${ME} --help' for more information."

USAGE="\
AddPoint Manager support Utility ${VERSION}   ${DATE}
                                     ${COPYRIGHT}
Usage  : ${ME} ntp [options] [args ...]
         ${ME} iptables {dump|stop|start|restart|status|save}
         ${ME} backup [options] [config.tar.gz]
         ${ME} restore config.tar.gz
         ${ME} [-h|--help]

ntp 
    [no option]   print current settings
    server HOST   set HOST to the ntp server
    sync          set the date and time via NTP
    autosync ARG  set/unset auto clock syncronization [default:off]
    unset ARG     unset parameter (delete the parameter from
                  ${NTPCONF})

iptables
    dump          dump /etc/sysconfig/iptables
    stop          /etc/rc.d/init.d/iptables stop
    start         /etc/rc.d/init.d/iptables start
    restart       /etc/rc.d/init.d/iptables restart
    status        /etc/rc.d/init.d/iptables status
    save          /etc/rc.d/init.d/iptables save

backup
    -p, -p=STR    specify the prefix of archive file name [default:addpoint]
    -o, -o=NAME   specify the archive file name [PREFIX-YYYYMMDDhhmmss.tar.gz]
    -m, -m=STR    comment

restore
    -i            only print information of the archive instead of restore
"


is_valid_svr() {
    # return 0 if $1 matches IP address form
    echo $1 | grep '^\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}$' >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        return 0
    fi
    
    # return 0 if $1 matches hostname form (include hostname only)
    echo $1 | grep '^\([0-9a-zA-Z-]\{1,\}\.\)\{2,\}[0-9a-zA-Z-]\{1,\}$' >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        return 0
    fi

    return 1
}


#------------------#
# Option analysing #
#------------------#

if [ $# -le 0 ]; then
    echo "${USAGE}" 1>&2
    exit 0
fi

KIND=$1
shift


case "$KIND" in
    ntp )
        # print settings (default)
        if [ $# -le 0 ]; then
            cat ${NTPCONF}
            exit 0
        fi
        
        case $1 in
            server )
                if [ "$2" = "" ]; then
                    echo "${USAGE}" >&2
                    exit 1
                fi
                
                # server string verification check
                is_valid_svr $2
                if [ $? -ne 0 ]; then
                    echo "${USAGE}" >&2
                    exit 1
                fi
                
                grep '^server' ${NTPCONF} > /dev/null 2>&1
                if [ $? -eq 0 ]; then
                    perl -i -p -e "s/^server[\s]+.*/server	$2/g" ${NTPCONF}
                else
                    echo "server	$2" >> ${NTPCONF}
                fi
                ;;
            sync )
                NTPSVR=`grep ^server ${NTPCONF} | head -1 | awk '{print $2}'`
                is_valid_svr ${NTPSVR}
                if [ $? -ne 0 ]; then
                    echo "${USAGE}" >&2
                    exit 1
                fi
                
                logger -s -t ${ME} "syncronize with ${NTPSVR}"
                LANG=C
                exec 3>&1
                RETVAL=`((ntpdate ${NTPSVR} 2>&1 1>&3 3>&- 4>&-; echo $? >&4) \
                          | cut -d ' ' -f 5- 3>&- 4>&- | logger -s -t ${ME}) 4>&1`
                exit $RETVAL
                ;;
            autosync )
                if [ $# -ne 2 ]; then
                    echo "${USAGE}" >&2
                    exit 1
                fi
                
                case "$2" in
                    on )
                        ARG="on"
                        ;;
                    off )
                        ARG="off"
                        ;;
                    * )
                        echo "${USAGE}" >&2
                        exit 1
                        ;;
                esac
                
                grep '^autosync' ${NTPCONF} > /dev/null 2>&1
                if [ $? -eq 0 ]; then
                    perl -i -p -e "s/^autosync[\s]+.*/autosync	${ARG}/g" ${NTPCONF}
                else
                    echo "autosync	${ARG}" >> ${NTPCONF}
                fi
                
                # edit crontab
                #echo "*** edit crontab ***"
                CRONTAB=`mktemp /tmp/crontab-XXXXXX`
                if [ $? -ne 0 ]; then
                    echo "Can't make a temporary file for edit crontab." >&2
                    exit 3
                fi

# Ver. 1.5.0.2  2007/07/09 CHG SRT
                cat /var/spool/cron/root  >> $CRONTAB
# Ver. 1.5.0.2  2007/07/09 CHG END
                ed $CRONTAB <<-'CRONTAB' 2>/dev/null
			/^# apman$/,/^# end of apman$/d
			wq
		CRONTAB
                
                if [ "${ARG}" = "on" ]; then
                    NTPSVR=`grep ^server ${NTPCONF} | head -1 | awk '{print $2}'`
                    if [ "${NTPSVR}" = "" ]; then
                        echo "Warning : autosync function needs NTP server." >&2
                        exit 2
                    fi
                    
# Ver. 1.5.0.2  2007/07/09 CHG SRT
                    #echo "*** edit crontab to autosync on ***"
                    ed $CRONTAB <<-CRONTAB 2>/dev/null
				\$a
				# apman
				0 0 * * 0	/usr/sbin/ntpdate ${NTPSVR} 2>&1
				# end of apman
				.
				wq
			CRONTAB
# Ver. 1.5.0.2  2007/07/09 CHG END
                fi
                
                crontab $CRONTAB
                rm -f $CRONTAB
                ;;
            unset )
                if [ $# -ne 2 ]; then
                    echo "${USAGE}" >&2
                    exit 1
                fi

                ed ${NTPCONF} <<-ED >/dev/null 2>&1
			g/^$2[ 	]\{1,\}.*\$/d
			wq
		ED
                ;;
            * )
                echo "${USAGE}" >&2
                exit 1
                ;;
        esac
        ;;
    iptables )
        # print usage
        if [ $# -le 0 ]; then
            echo "${USAGE}" >&2
            exit 0
        fi
        
        case $1 in
            dump )
                cat /etc/sysconfig/iptables
                ;;
            stop | start | restart | status | save )
                /etc/rc.d/init.d/iptables $1
                ;;
            * )
                echo "${USAGE}" >&2
                exit 1
                ;;
        esac
        ;;
    backup )
        DIR=`pwd`
	DATESTR=`date +%Y%m%d%H%M`
	SPEC_DATE=`date -R`
	NAME="${DIR}/addpoint-$DATESTR.tar.gz"
        TARGET=`perl -e 'require "'${COMMON_CONFIG}'"; print $apcfg_BackupTarget;'`
        COMMENT=""
        
	while [ $# -gt 0 ]; do
            OPTARG=`expr "x$1" : 'x--[^=]*=\(.*\)' \| \
            "x$1" : 'x-.=\(.*\)'`
            case $1 in
            -p )
                test $# = 1 && eval "${EXIT_MISSING_ARG}" >&2
                shift
                NAME=${DIR}/$1-${DATESTR}.tar.gz
                shift
                ;;
            -p=* )
                NAME=${DIR}/${OPTARG}-${DATESTR}.tar.gz
                shift
                ;;
            -o )
                test $# = 1 && eval "${EXIT_MISSING_ARG}" >&2
                shift
                NAME=$1
                shift
                ;;
            -o=* )
                NAME=${OPTARG}
                shift
                ;;
            -m )
                test $# = 1 && eval "${EXIT_MISSING_ARG}" >&2
                shift
                COMMENT=$1
                shift
                ;;
            -m=* )
                COMMENT=${OPTARG}
                shift
                ;;
            -- )
                shift
                break
                ;;
            *)
                break
                ;;
            esac
        done
        
        if [ $# -ge 2 ]; then
            echo "${USAGE}" >&2
            exit 0
        fi
        
        if [ $# -eq 1 ]; then
            NAME=$1
        fi
        
        USERESCUE="false"
        PACKEDFILE=""

        # MailWallServer type SA
        grep -i 'sa' ${SERVER_KIND} > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            grep -i 'suite .* 4\.' ${PRODUCTS} >/dev/null 2>&1
            if [ $? -eq 0 ]; then
                    USERESCUE="true"
            fi
        else
            # MailWallServer type SF
            grep -i 'sf' ${SERVER_KIND} > /dev/null 2>&1
            if [ $? -eq 0 ]; then
                    USERESCUE="false"

            # MailWallserver type Solo
            else
                grep -i 'wall .* 7\.' ${PRODUCTS} >/dev/null 2>&1
                if [ $? -eq 0 ]; then
                        USERESCUE="true"
                fi
            fi
        fi
        
        # make the spec file (archive information)
        (echo 'system: '`head -1 /etc/addpoint/addpoint-release`
         echo "date: ${SPEC_DATE}"
         echo "createdby: ${ME} V${VERSION} ("`rpm -q apman`")"
         echo "comment: ${COMMENT}"
        ) > ${ARCHIVE_SPEC}
        
        touch `echo "${NAME}" | sed 's/\.tar\.gz$/.check/'`

#SingleServer & AdminServer
        if [ "${USERESCUE}" = "true" ]; then
                PACKEDFILE=`/opt/Guardian/Admin/support/rescue.php --backup`
#1.6.0.1 Y.Toyota ADD
                TARGET="${TARGET} ${PACKEDFILE} --exclude /etc/fstab"

#FilterServer
	else
                TARGET="${TARGET} ${PACKEDFILE} --exclude /etc/fstab"
#1.6.0.1 Y.Toyota END
        fi
        tar --atime-preserve -zcf ${NAME} ${ARCHIVE_SPEC} ${TARGET}
        if [ -n "${PACKEDFILE}" ]; then
                rm -f ${PACKEDFILE}
        fi
        
        rm ${ARCHIVE_SPEC}
        ;;
    restore )
        HISTORY=`perl -e 'require "'${COMMON_CONFIG}'"; print $apcfg_history;'`
	HISTORY_BACKUP=`/bin/mktemp /tmp/upgrade_history-XXXXXX`
        
        IS_PRINT_INFO="false"
        
	while [ $# -gt 0 ]; do
            OPTARG=`expr "x$1" : 'x--[^=]*=\(.*\)' \| \
            "x$1" : 'x-.=\(.*\)'`
            case $1 in
            -i )
                IS_PRINT_INFO="true"
                shift
                ;;
            -- )
                shift
                break
                ;;
            *)
                break
                ;;
            esac
        done
        
        if [ $# -le 0 ]; then
            echo "${USAGE}" >&2
            exit 0
        fi
        
        FILE=$1
	if [ ! -r ${FILE} ]; then
            echo "Couldn't read the archive : ${FILE}"
            exit 0
        fi
        
        if [ "${IS_PRINT_INFO}" = "true" ]; then
            tar xfzO ${FILE} var/addpoint/addpoint.spec
            exit 0
        fi
        
	mv ${HISTORY} ${HISTORY_BACKUP}
# Ver. 1.6.0.2 2008/07/24 ADD SRT
	tar pzxf ${FILE} -C / --exclude etc/fstab -C /
# Ver. 1.6.0.2 2008/07/24 ADD END
	mv ${HISTORY_BACKUP} ${HISTORY}
        
        # for GUARDIAN BACKUP
        PACKEDFILE=`tar tfz ${FILE} tmp/gsuite_backup_config*.gsz 2>/dev/null`
# Ver. 1.5.0.1  2007/07/06 ADD SRT
        if [ "" != "${PACKEDFILE}" ]; then
# Ver. 1.5.0.1  2007/07/06 ADD END
# Ver. 1.5.0.3  2007/07/19 ADD SRT
                chg_cgi_passwd ${PACKEDFILE}
# Ver. 1.5.0.3  2007/07/19 ADD END
                /opt/Guardian/Admin/support/rescue.php --restore "/${PACKEDFILE}"
                rm -f "/${PACKEDFILE}"
        fi
        ;;
    * )
        echo "${USAGE}" >&2
        exit 1
        ;;
esac

exit 0
