#!/bin/sh

#################################################################################
#
#   Lynis
# ------------------
#
# Copyright 2007-2008, Michael Boelen (michael@rootkit.nl), The Netherlands
# Web site: http://www.rootkit.nl
#
# This software is licensed under GPL, version 3. See LICENSE file for
# usage of this software.
#
#################################################################################
#
# Functions
#
#################################################################################
#
#    Function			Description
#    -----------------------    -------------------------------------------------
#    CheckFilePermissions	
#    counttests
#    Display			Output text to screen with colors and identation
#    InsertSection              Insert a section block
#
#################################################################################


    # Check file permissions
    # Parameter 1 is file/dir
    # Result: FILE_NOT_FOUND | OK | BAD
    CheckFilePermissions()
      {
        CHECKFILE=$1
        if [ ! -d $CHECKFILE -a ! -f $CHECKFILE ]; then
	    PERMS="FILE_NOT_FOUND"
	  else
	    # If 'file' is an directory, use -d
	    if [ -d ${CHECKFILE} ]; then
	        FILEVALUE=`ls -d -l ${CHECKFILE} | cut -c 2-10`
		PROFILEVALUE=`cat ${PROFILE} | grep '^permdir' | grep ":${CHECKFILE}:" | cut -d: -f3` 
	      else
	        FILEVALUE=`ls -l ${CHECKFILE} | cut -c 2-10`
		PROFILEVALUE=`cat ${PROFILE} | grep '^permfile' | grep ":${CHECKFILE}:" | cut -d: -f3` 
	    fi
	    if [ "${FILEVALUE}" = "${PROFILEVALUE}" ]; then PERMS="OK"; else PERMS="BAD"; fi
	fi
      }

    # Count the number of performed tests
    counttests()
      {
        CTESTS_PERFORMED=`expr ${CTESTS_PERFORMED} + 1`
      }

    Display()
      {
        INDENT=0; TEXT=""; RESULT=""; COLOR=""
	if [ "${LINUX_VERSION}" = "Ubuntu" ]; then
	    ECHOCMD="/bin/echo -e"	
	  else
	    ECHOCMD="echo -e"
	fi
        while [ $# -ge 1 ]; do
	    case $1 in
	        --color)
		    shift
		        case $1 in
			  WHITE) COLOR=$WHITE ;;
			  RED)   COLOR=$RED ;;
			  GREEN) COLOR=$GREEN ;;
			esac		
		;;
	        --indent)
		    shift
		    INDENT=$1
	        ;;
		--no-break | --nobreak | -nb)		    
		    ECHOCMD="echo -en"
		;;
		--result)
		    shift
		    RESULT=$1
		;;
	        --text)
	            shift
	            TEXT=$1
	        ;;
		*)
		    echo "INVALID OPTION (Display): $1"
		    exit 1
		;;
	    esac
	    # Go to next parameter
	    shift
	done
	
	if [ "${RESULT}" = "" ]; then
	    RESULTPART=""
	  else
	    if [ ${CRONJOB} -eq 0 ]; then
	        RESULTPART=" [ ${COLOR}${RESULT}${NORMAL} ]"
	      else
	        RESULTPART=" [ ${RESULT} ]"
	    fi
	fi
	
	if [ ! "${TEXT}" = "" ]; then
	    # Show warnings always, and other messages if no quiet is being used
	    if [ ${QUIET} -eq 0 -o "${RESULT}" = "WARNING" ]; then
	        # Display
		LINESIZE=`echo "${TEXT}" | wc -c | tr -d ' '`
	        SPACES=`expr 62 - ${INDENT} - ${LINESIZE}`
		if [ ${CRONJOB} -eq 0 ]; then
                    ${ECHOCMD} "\033[${INDENT}C${TEXT}\033[${SPACES}C${RESULTPART}"
    		  else
	    	    echo "${TEXT}${RESULTPART}"
		fi	    
	    fi
	fi
      }

    # Insert section block
    InsertSection()
      {
        if [ ${QUIET} -eq 0 ]; then
            echo ""
	    echo "[+] ${SECTION}$1${NORMAL}"
    	    echo "------------------------------------"
	fi
      }

    # Function IsWorldWritable
    IsWorldWritable()
      {
        FileIsWorldWritable=""
        if [ -f $1 ]
          then
            FINDVAL=`ls -l $1 | cut -c 9`
	    if [ "${FINDVAL}" = "w" ]; then FileIsWorldWritable="TRUE"; else FileIsWorldWritable="FALSE"; fi
          else
    	    FileIsWorldWritable="NOSUCHFILE"
        fi	   
      }

    # Function logtext (redirect data ($1) to log file)
    logtext()
      {	
	CDATE=`date "+[%H:%M:%S]"`
        echo "${CDATE} $1" >> ${LOGFILE}
      }

    # Function logtextbreak (redirect a break to log file)
    logtextbreak()
      {
    	CDATE=`date "+[%H:%M:%S]"`
        echo "${CDATE} ===-------------------------------------------------===" >> ${LOGFILE}
      }

    # Cleanup service
    Maid()
      {
	echo ""; echo "Interrupt detected."
        # Remove PID
        RemovePIDFile
	
	# YYY Remove TMPFILE if present
	# if [ -f ${TMPFILE} ]; then rm -f ${TMPFILE}; fi

	Display --text "Cleaning up..." --result DONE --color GREEN
	
	# Exit with exit code 1
	exit 1
      }

    # Dump to report file
    report()
      {
        echo "$1" >> ${REPORTFILE}
      }

    # Report data (TESTID STATUS IMPACT MESSAGE)
    ReportResult()
      {
        if [ $1 = "" ]; then TESTID="UNKNOWN"; fi
	# Status: OK, WARNING, NEUTRAL, SUGGESTION
	# Impact: HIGH, SEVERE, LOW, 
	#report "result[]=TESTID-${TESTID},STATUS-$2,IMPACT-$3,MESSAGE-$4-"
	# Reset ID before next test
	TESTID=""
      }

    # Remove PID file
    RemovePIDFile()
      {
        # Test if PIDFILE is defined, before checking file presence
	if [ ! "${PIDFILE}" = "" ]; then
	  if [ -f ${PIDFILE} ]; then rm -f $PIDFILE; fi
	fi
      }

    ShowResult()
      {
	case $1 in
	OK)
	    echo "[ ${OK}OK${NORMAL} ]"
	;;
	WARNING)
	    echo "[ ${WARNING}WARNING${NORMAL} ]"
	    # log the warning to our log file
	    #logtext "Warning: $2"
	    # add the warning to our report file
	    #report "warning=$2"
	;;
        esac
      }
    
    # Wait for [ENTER] or manually break
    wait_for_keypress()
      {
        if [ ! ${QUICKMODE} -eq 1 ]; then
          echo ""; echo "[ ${WHITE}Press [ENTER] to continue, or [CTRL]+C to stop${NORMAL} ]"
          read void
	fi
      }


#================================================================================
# Lynis - Copyright 2007-2008, Michael Boelen - www.rootkit.nl - The Netherlands
