1#!/bin/sh
2
3################################################################################
4#
5#  Rootkit Hunter installer
6# --------------------------
7#
8# Copyright Michael Boelen ( michael AT rootkit DOT nl )
9# See LICENSE file for use of this software
10#
11################################################################################
12
13INSTALLER_NAME="Rootkit Hunter installer"
14INSTALLER_VERSION="1.2.21"
15INSTALLER_COPYRIGHT="Copyright 2018, Michael Boelen"
16INSTALLER_LICENSE="
17
18This software was developed by the Rootkit Hunter project team.
19For reporting bugs, patches, comments and questions, please go to:
20http://rkhunter.sourceforge.net
21
22Rootkit Hunter comes with ABSOLUTELY NO WARRANTY. This is free
23software, and you are welcome to redistribute it under the terms
24of the GNU General Public License. See LICENSE for details.
25"
26
27APPNAME="rkhunter"
28APPVERSION="1.4.6"
29RKHINST_OWNER="0:0"
30RKHINST_MODE_EX="0700"
31RKHINST_MODE_RW="0600"
32RKHINST_MODE_RWR="0644"
33RKHINST_LAYOUT="default"
34RKHINST_ACTION=""
35RKHINST_ACTION_SEEN=0
36ERRCODE=0
37OVERWRITE=0
38STRIPROOT=""
39
40RPM_USING_ROOT=0
41TGZ_USING_ROOT=0
42TXZ_USING_ROOT=0
43DEB_USING_ROOT=0
44
45umask 027
46
47OPERATING_SYSTEM=`uname`
48UNAMEM=`uname -m`
49
50if [ "${OPERATING_SYSTEM}" = "SunOS" ]; then
51	if [ -z "$RANDOM" ]; then
52		# If the 'which' output contains a space, then it is probably an error.
53		if [ -n "`which bash 2>/dev/null | grep -v ' '`" ]; then
54			exec bash $0 $*
55		elif [ -n "`which ksh 2>/dev/null | grep -v ' '`" ]; then
56			exec ksh $0 $*
57		else
58			echo "Unable to find the bash or ksh shell to run the installer. Exiting."
59			exit 1
60		fi
61
62		exit 0
63	fi
64
65	# We need /usr/xpg4/bin before other directories on Solaris.
66	PATH="/usr/xpg4/bin:${PATH}"
67fi
68
69
70showHelp() { # Show help / version
71	echo "${INSTALLER_NAME} ${INSTALLER_VERSION}"
72	echo ""
73	echo "Usage: $0 <parameters>"
74	echo ""
75	echo "Ordered valid parameters:"
76	echo '  --help (-h)      : Show this help.'
77	echo "  --examples       : Show layout examples."
78	echo '  --layout <value> : Choose installation template.'
79	echo "                     The templates are:"
80        echo '                      - default: (FHS compliant; the default)'
81        echo "                      - /usr"
82        echo "                      - /usr/local"
83	echo "                      - oldschool: old version file locations"
84	echo "                      - custom: supply your own installation directory"
85	echo "                      - RPM: for building RPM's. Requires \$RPM_BUILD_ROOT."
86	echo "                      - DEB: for building DEB's. Requires \$DEB_BUILD_ROOT."
87	echo "                      - TGZ: for building Slackware TGZ's. Requires \$TGZ_BUILD_ROOT."
88	echo "                      - TXZ: for building Slackware TXZ's. Requires \$TXZ_BUILD_ROOT."
89	echo '  --striproot      : Strip path from custom layout (for package maintainers).'
90	echo "  --install        : Install according to chosen layout."
91	echo "  --overwrite      : Overwrite the existing configuration file."
92	echo "                     (Default is to create a separate configuration file.)"
93	echo "  --show           : Show chosen layout."
94	echo "  --remove         : Uninstall according to chosen layout."
95	echo "  --uninstall      : Alias for the '--remove' option."
96	echo "  --version        : Show the installer version."
97	echo ""
98
99	return
100}
101
102showExamples() { # Show examples
103	echo "${INSTALLER_NAME}"
104	echo ""
105	echo "Examples:"
106	echo "1. Show layout, files in /usr:"
107	echo "        installer.sh --layout /usr --show"
108	echo ""
109	echo "2. Install in /usr/local:"
110	echo "        installer.sh --layout /usr/local --install"
111	echo ""
112	echo '3. Install in chosen (custom) directory /opt:'
113	echo "        installer.sh --layout custom /opt --install"
114	echo ""
115	echo "4. Install in temporary directory /tmp/rkhunter/usr/local,"
116	echo '   with files in /usr/local (for package maintainers):'
117	echo "        mkdir -p /tmp/rkhunter/usr/local"
118	echo "        installer.sh --layout custom /tmp/rkhunter/usr/local \\"
119	echo "                     --striproot /tmp/rkhunter --install"
120	echo ""
121	echo "5. Remove files, layout /usr/local:"
122	echo "        installer.sh --layout /usr/local --remove"
123	echo ""
124
125	return
126}
127
128showVersion() { echo "${INSTALLER_NAME} ${INSTALLER_VERSION} ${INSTALLER_LICENSE}"; return; }
129
130selectTemplate() { # Take input from the "--install parameter"
131	case "$1" in
132	/usr|/usr/local|default|custom_*|RPM|DEB|TGZ|TXZ)
133		case "$1" in
134		default)
135			PREFIX="/usr/local"
136			;;
137		custom_*)
138			PREFIX=`echo "${RKHINST_LAYOUT}" | sed 's|custom_||g'`
139
140			case "${PREFIX}" in
141			.)
142				if [ "${RKHINST_ACTION}" = "install" ]; then
143					echo "Standalone installation into ${PWD}/files"
144				fi
145				;;
146			.*|/.*|*//*)
147				echo "Invalid layout directory chosen: ${PREFIX}"
148				exit 1
149				;;
150			*)
151				test "${PREFIX}" = "/" && PREFIX=""
152
153				if [ "${RKHINST_ACTION}" = "install" ]; then
154					RKHTMPVAR=`echo "${PATH}" | grep "${PREFIX}/bin"`
155
156					if [ -z "${RKHTMPVAR}" ]; then
157						echo ""
158						echo "Note: Directory ${PREFIX}/bin is not in your PATH"
159						echo ""
160					fi
161				fi
162				;;
163			esac
164			;;
165		RPM)
166			if [ -n "${RPM_BUILD_ROOT}" ]; then
167				if [ "${RPM_BUILD_ROOT}" = "/" ]; then
168					RPM_USING_ROOT=1
169					PREFIX="/usr/local"
170				else
171					PREFIX="${RPM_BUILD_ROOT}/usr/local"
172				fi
173			else
174				echo "RPM installation chosen but \$RPM_BUILD_ROOT variable not found. Exiting."
175				exit 1
176			fi
177			;;
178		DEB)
179			if [ -n "${DEB_BUILD_ROOT}" ]; then
180				if [ "${DEB_BUILD_ROOT}" = "/" ]; then
181					DEB_USING_ROOT=1
182					PREFIX="/usr"
183				else
184					PREFIX="${DEB_BUILD_ROOT}/usr"
185				fi
186			else
187				echo "DEB installation chosen but \$DEB_BUILD_ROOT variable not found. Exiting."
188				exit 1
189			fi
190			;;
191		TGZ)
192			if [ -n "${TGZ_BUILD_ROOT}" ]; then
193				if [ "${TGZ_BUILD_ROOT}" = "/" ]; then
194					TGZ_USING_ROOT=1
195					PREFIX="/usr"
196				else
197					PREFIX="${TGZ_BUILD_ROOT}/usr"
198				fi
199			else
200				echo "TGZ installation chosen but \$TGZ_BUILD_ROOT variable not found. Exiting."
201				exit 1
202			fi
203			;;
204		TXZ)
205			if [ -n "${TXZ_BUILD_ROOT}" ]; then
206				if [ "${TXZ_BUILD_ROOT}" = "/" ]; then
207					TXZ_USING_ROOT=1
208					PREFIX="/usr"
209				else
210					PREFIX="${TXZ_BUILD_ROOT}/usr"
211				fi
212			else
213				echo "TXZ installation chosen but \$TXZ_BUILD_ROOT variable not found. Exiting."
214				exit 1
215			fi
216			;;
217		*)
218			PREFIX="$1"
219			;;
220		esac
221
222		case "$1" in
223		RPM|DEB|TGZ|TXZ)
224			;;
225		*)
226			if [ "${RKHINST_ACTION}" = "install" ]; then
227				if [ -n "${PREFIX}" -a ! -d "${PREFIX}" ]; then
228					echo "Non-existent installation directory chosen: ${PREFIX}"
229					echo "Perhaps run \"mkdir -p ${PREFIX}\" first?"
230					exit 1
231				fi
232			fi
233			;;
234		esac
235
236		case "$1" in
237		/usr/local|custom_*)
238			SYSCONFIGDIR="${PREFIX}/etc"
239			;;
240		RPM)
241			if [ $RPM_USING_ROOT -eq 1 ]; then
242				SYSCONFIGDIR="/etc"
243			else
244				SYSCONFIGDIR="${RPM_BUILD_ROOT}/etc"
245			fi
246			;;
247		DEB)
248			if [ $DEB_USING_ROOT -eq 1 ]; then
249				SYSCONFIGDIR="/etc"
250			else
251				SYSCONFIGDIR="${DEB_BUILD_ROOT}/etc"
252			fi
253			;;
254		TGZ)
255			if [ $TGZ_USING_ROOT -eq 1 ]; then
256				SYSCONFIGDIR="/etc"
257			else
258				SYSCONFIGDIR="${TGZ_BUILD_ROOT}/etc"
259			fi
260			;;
261		TXZ)
262			if [ $TXZ_USING_ROOT -eq 1 ]; then
263				SYSCONFIGDIR="/etc"
264			else
265				SYSCONFIGDIR="${TXZ_BUILD_ROOT}/etc"
266			fi
267			;;
268		*)
269			SYSCONFIGDIR="/etc"
270			;;
271		esac
272
273		case "$1" in
274		custom_*)
275			LIBDIR=""
276
277			if [ -z "${PREFIX}" -a "${OPERATING_SYSTEM}" = "Darwin" ]; then
278				test -d "/Library" && LIBDIR="/Library"
279			fi
280
281			if [ -z "${LIBDIR}" ]; then
282				if [ "${UNAMEM}" = "x86_64" -o "${UNAMEM}" = "ppc64" ]; then
283					LIBDIR="${PREFIX}/lib"
284				else
285					LIBDIR="${PREFIX}/lib"
286				fi
287			fi
288
289			BINDIR="${PREFIX}/bin"
290			VARDIR="${PREFIX}/var"
291
292			if [ -z "${PREFIX}" ]; then
293				if [ ! -d "/share" -a -d "/usr/share" ]; then
294					SHAREDIR="/usr/share"
295				else
296					SHAREDIR="/share"
297				fi
298			else
299				SHAREDIR="${PREFIX}/share"
300			fi
301			;;
302		RPM)
303			if [ "${UNAMEM}" = "x86_64" -o "${UNAMEM}" = "ppc64" ]; then
304				LIBDIR="${PREFIX}/lib"
305			else
306				LIBDIR="${PREFIX}/lib"
307			fi
308
309			BINDIR="${PREFIX}/bin"
310
311			if [ $RPM_USING_ROOT -eq 1 ]; then
312				VARDIR="/var"
313			else
314				VARDIR="${RPM_BUILD_ROOT}/var"
315			fi
316
317			SHAREDIR="${PREFIX}/share"
318			;;
319		DEB)
320			BINDIR="${PREFIX}/bin"
321			LIBDIR="${PREFIX}/lib"
322
323			if [ $DEB_USING_ROOT -eq 1 ]; then
324				VARDIR="/var"
325			else
326				VARDIR="${DEB_BUILD_ROOT}/var"
327			fi
328
329			SHAREDIR="${PREFIX}/share"
330			;;
331		TGZ)
332			if [ "${UNAMEM}" = "x86_64" -o "${UNAMEM}" = "ppc64" ]; then
333				LIBDIR="${PREFIX}/lib"
334			else
335				LIBDIR="${PREFIX}/lib"
336			fi
337
338			BINDIR="${PREFIX}/bin"
339
340			if [ $TGZ_USING_ROOT -eq 1 ]; then
341				VARDIR="/var"
342			else
343				VARDIR="${TGZ_BUILD_ROOT}/var"
344			fi
345
346			SHAREDIR="${PREFIX}/share"
347			;;
348		TXZ)
349			if [ "${UNAMEM}" = "x86_64" -o "${UNAMEM}" = "ppc64" ]; then
350				LIBDIR="${PREFIX}/lib"
351			else
352				LIBDIR="${PREFIX}/lib"
353			fi
354
355			BINDIR="${PREFIX}/bin"
356
357			if [ $TXZ_USING_ROOT -eq 1 ]; then
358				VARDIR="/var"
359			else
360				VARDIR="${TXZ_BUILD_ROOT}/var"
361			fi
362
363			SHAREDIR="${PREFIX}/share"
364			;;
365		*)
366			if [ -d "${PREFIX}/lib" ]; then
367				LIBDIR="${PREFIX}/lib"
368			else
369				LIBDIR="${PREFIX}/lib"
370			fi
371
372			BINDIR="${PREFIX}/bin"
373			VARDIR="/var"
374			SHAREDIR="${PREFIX}/share"
375			;;
376		esac
377		;;
378	oldschool) # The rigid way, like RKH used to be set up.
379		PREFIX="/usr/local"
380		SYSCONFIGDIR="${PREFIX}/etc"
381		LIBDIR="${PREFIX}/${APPNAME}/lib"
382		VARDIR="${LIBDIR}"
383		SHAREDIR="${LIBDIR}"
384		RKHINST_DOC_DIR="${PREFIX}/${APPNAME}/lib/docs"
385		BINDIR="${PREFIX}/bin"
386		;;
387	*)	# None chosen.
388		echo "No template chosen. Exiting."
389		exit 1
390		;;
391	esac
392
393	RKHINST_ETC_DIR="${SYSCONFIGDIR}"
394	RKHINST_BIN_DIR="${BINDIR}"
395	RKHINST_SCRIPT_DIR="${LIBDIR}/${APPNAME}/scripts"
396	RKHINST_MAN_DIR="${PREFIX}/man/man8"
397
398	if [ "${RKHINST_LAYOUT}" = "oldschool" ]; then
399		RKHINST_DB_DIR="${VARDIR}/${APPNAME}/db"
400		RKHINST_TMP_DIR="${VARDIR}/${APPNAME}/tmp"
401		RKHINST_DOC_DIR="${SHAREDIR}/${APPNAME}/docs"
402	elif [ "${RKHINST_LAYOUT}" = "DEB" ]; then
403		RKHINST_DB_DIR="${VARDIR}/lib/${APPNAME}/db"
404		RKHINST_TMP_DIR="${VARDIR}/lib/${APPNAME}/tmp"
405		RKHINST_DOC_DIR="${SHAREDIR}/doc/${APPNAME}"
406		RKHINST_SCRIPT_DIR="${SHAREDIR}/${APPNAME}/scripts"
407	elif [ "${RKHINST_LAYOUT}" = "TXZ" ]; then
408		RKHINST_DB_DIR="${VARDIR}/lib/${APPNAME}/db"
409		RKHINST_TMP_DIR="${VARDIR}/lib/${APPNAME}/tmp"
410		RKHINST_DOC_DIR="${PREFIX}/doc/${APPNAME}"
411		RKHINST_MAN_DIR="${PREFIX}/man/man8"
412	else
413		RKHINST_DB_DIR="${VARDIR}/lib/${APPNAME}/db"
414		RKHINST_TMP_DIR="${VARDIR}/lib/${APPNAME}/tmp"
415		RKHINST_DOC_DIR="${SHAREDIR}/doc/${APPNAME}"
416	fi
417
418	RKHINST_LANG_DIR="${RKHINST_DB_DIR}/i18n"
419	RKHINST_SIG_DIR="${RKHINST_DB_DIR}/signatures"
420
421	RKHINST_ETC_FILE="${APPNAME}.conf"
422	RKHINST_BIN_FILES="${APPNAME}"
423
424	RKHINST_SCRIPT_FILES="check_modules.pl filehashsha.pl stat.pl readlink.sh"
425	RKHINST_DB_FILES="backdoorports.dat mirrors.dat programs_bad.dat suspscan.dat"
426	RKHINST_SIG_FILES="RKH_dso.ldb RKH_Glubteba.ldb RKH_jynx.ldb RKH_kbeast.ldb RKH_libkeyutils1.ldb RKH_libkeyutils.ldb RKH_libncom.ldb RKH_pamunixtrojan.ldb RKH_shv.ldb RKH_sniffer.ldb RKH_sshd.ldb RKH_turtle.ldb RKH_xsyslog.ldb"
427
428	if [ "${RKHINST_LAYOUT}" = "DEB" ]; then
429		RKHINST_DOC_FILES="ACKNOWLEDGMENTS FAQ README"
430	else
431		RKHINST_DOC_FILES="ACKNOWLEDGMENTS CHANGELOG FAQ LICENSE README"
432	fi
433
434	RKHINST_MAN_FILES="${APPNAME}.8"
435
436	return
437}
438
439# Additions we need to be aware / take care of:
440# any /contrib/ files which should include any RH*L/alike ones:
441# Additions we need to be aware / take care of wrt RH*L/alike:
442# /etc/cron.daily/rkhunter (different versions of cronjob)
443# /etc/sysconfig/rkhunter (config for cronjob)
444# /etc/logrotate.d/rkhunter
445
446showTemplate() { # Take input from the "--install parameter"
447	case "$1" in
448	custom_.)
449		# Dump *everything* in the current dir.
450		echo "Standalone installation into ${PWD}/files"
451		;;
452	*)
453		NOTPRESENT="   (Directory will be created)"
454
455		selectTemplate "$1"
456
457		test -z "${PREFIX}" && RKHTMPVAR="/" || RKHTMPVAR="${PREFIX}"
458
459		test ! -d "${RKHTMPVAR}" && RKHTMPVAR="${RKHTMPVAR}                            (Directory does not exist)"
460		echo "Install into:       ${RKHTMPVAR}"
461
462		RKHTMPVAR="${RKHINST_BIN_DIR}"
463		test ! -d "${RKHTMPVAR}" && RKHTMPVAR="${RKHTMPVAR}                     ${NOTPRESENT}"
464		echo "Application:        ${RKHTMPVAR}"
465
466		RKHTMPVAR="${RKHINST_ETC_DIR}"
467		test ! -d "${RKHTMPVAR}" && RKHTMPVAR="${RKHTMPVAR}                     ${NOTPRESENT}"
468		if [ $OVERWRITE -eq 0 ]; then
469			echo "Configuration file: ${RKHTMPVAR}"
470		else
471			if [ ! -d "${RKHTMPVAR}" ]; then
472				echo "Configuration file: ${RKHTMPVAR}"
473			else
474				if [ -z "${PREFIX}" ]; then
475					echo "Configuration file: ${RKHINST_ETC_DIR}               (Configuration file will be overwritten)"
476				else
477					echo "Configuration file: ${RKHINST_ETC_DIR}           (Configuration file will be overwritten)"
478				fi
479			fi
480		fi
481
482		RKHTMPVAR="${RKHINST_DOC_DIR}"
483		test ! -d "${RKHTMPVAR}" && RKHTMPVAR="${RKHTMPVAR}${NOTPRESENT}"
484		echo "Documents:          ${RKHTMPVAR}"
485
486		RKHTMPVAR="${RKHINST_MAN_DIR}"
487		test ! -d "${RKHTMPVAR}" && RKHTMPVAR="${RKHTMPVAR}          ${NOTPRESENT}"
488		echo "Man page:           ${RKHTMPVAR}"
489
490		RKHTMPVAR="${RKHINST_SCRIPT_DIR}"
491		if [ ! -d "${RKHTMPVAR}" ]; then
492			if [ -z "${PREFIX}" ]; then
493				RKHTMPVAR="${RKHTMPVAR}      ${NOTPRESENT}"
494			else
495				RKHTMPVAR="${RKHTMPVAR}  ${NOTPRESENT}"
496			fi
497		fi
498		echo "Scripts:            ${RKHTMPVAR}"
499
500		RKHTMPVAR="${RKHINST_DB_DIR}"
501		test ! -d "${RKHTMPVAR}" && RKHTMPVAR="${RKHTMPVAR}     ${NOTPRESENT}"
502		echo "Databases:          ${RKHTMPVAR}"
503
504		RKHTMPVAR="${RKHINST_SIG_DIR}"
505		test ! -d "${RKHTMPVAR}" && RKHTMPVAR="${RKHTMPVAR}     ${NOTPRESENT}"
506		echo "Signatures:         ${RKHTMPVAR}"
507
508		RKHTMPVAR="${RKHINST_TMP_DIR}"
509		test ! -d "${RKHTMPVAR}" && RKHTMPVAR="${RKHTMPVAR}    ${NOTPRESENT}"
510		echo "Temporary files:    ${RKHTMPVAR}"
511
512		if [ -n "${STRIPROOT}" ]; then
513			echo ""; echo "Got STRIPROOT=\"${STRIPROOT}\""
514		fi
515		;;
516	esac
517
518	return
519}
520
521
522#################################################################################
523#
524# Start installation
525#
526#################################################################################
527
528doInstall()  {
529	DOING_UPDT=0
530
531	# Preflight checks
532	echo "Checking system for:"
533
534	if [ -f "./files/${APPNAME}" ]; then
535		echo " ${INSTALLER_NAME} files: found"
536
537		case "${RKHINST_LAYOUT}" in
538		RPM|DEB|TGZ|TXZ)
539			;;
540		*)
541			for ITEM in `find ./files`; do
542				chown "${RKHINST_OWNER}" "${ITEM}"
543			done
544			;;
545		esac
546	else
547		echo "Checking system for: ${INSTALLER_NAME} files: FAILED"
548		echo "Installation files not in \"${PWD}/files\". Exiting."
549		exit 1
550	fi
551
552
553	# We only look for one download command.
554
555	for RKHWEBCMD in wget links elinks lynx curl GET bget; do
556		SEARCH=`which ${RKHWEBCMD} 2>/dev/null | grep -v ' '`
557
558		if [ -n "${SEARCH}" ]; then
559			echo " A web file download command: ${RKHWEBCMD} found"
560			break
561		fi
562	done
563
564	if [ -z "${SEARCH}" ]; then
565		echo " A web file download command: None found"
566		echo ""
567		echo "    Please install one of wget, links, elinks, lynx, curl, GET or"
568		echo '    bget (from www.cpan.org/authors/id/E/EL/ELIJAH/bget)'
569		echo ""
570	fi
571
572
573	# Perl will be found in rkhunter itself.
574
575	RKHINST_DIRS="$RKHINST_DOC_DIR $RKHINST_MAN_DIR $RKHINST_ETC_DIR $RKHINST_BIN_DIR"
576	RKHINST_DIRS_EXCEP="$RKHINST_SCRIPT_DIR $RKHINST_DB_DIR $RKHINST_TMP_DIR $RKHINST_LANG_DIR $RKHINST_SIG_DIR"
577
578	if [ -f "${RKHINST_ETC_DIR}/rkhunter.conf" ]; then
579		echo "Starting update:"
580		DOING_UPDT=1
581	else
582		echo "Starting installation:"
583	fi
584
585	case "${RKHINST_LAYOUT}" in
586	RPM|DEB|TGZ|TXZ)
587		;;
588	*)
589		# Check PREFIX
590		if [ -z "${PREFIX}" ]; then
591			:
592		elif [ -d "${PREFIX}" ]; then
593			if [ -w "${PREFIX}" ]; then
594				echo " Checking installation directory \"$PREFIX\": it exists and is writable."
595
596				# That's enough for a standalone installation.
597				if [ "${PREFIX}" = "." ]; then
598					chown -R ${RKHINST_OWNER} ./files
599
600					for ITEM in `find ./files -type f`; do
601						case "${ITEM}" in
602						*.sh|*.pl|*/rkhunter)
603							chmod "${RKHINST_MODE_EX}" "${ITEM}"
604							;;
605						*)
606							chmod "${RKHINST_MODE_RW}" "${ITEM}"
607							;;
608						esac
609					done
610
611					cd ./files
612
613					PREFIX="${PWD}"
614
615					echo "LOGFILE=${PREFIX}/rkhunter.log" >>rkhunter.conf
616					echo "TMPDIR=$PREFIX" >>rkhunter.conf
617					echo "DBDIR=$PREFIX" >>rkhunter.conf
618					echo "SCRIPTDIR=$PREFIX" >>rkhunter.conf
619					echo "INSTALLDIR=$PREFIX" >>rkhunter.conf
620					echo "USER_FILEPROP_FILES_DIRS=$PREFIX/rkhunter" >>rkhunter.conf
621					echo "USER_FILEPROP_FILES_DIRS=$PREFIX/rkhunter.conf" >>rkhunter.conf
622					test -f "$PREFIX/rkhunter.conf.local" && echo "USER_FILEPROP_FILES_DIRS=$PREFIX/rkhunter.conf.local" >>rkhunter.conf
623					test -d "$PREFIX/rkhunter.d" && echo "USER_FILEPROP_FILES_DIRS=$PREFIX/rkhunter.d/*.conf" >>rkhunter.conf
624
625					sed -e "s|-f /etc/rkhunter.conf|-f $PREFIX/rkhunter.conf|g" -e "s|CONFIGFILE=\"/etc|CONFIGFILE=\"$PREFIX|g" rkhunter >rkhunter.
626					mv -f rkhunter. rkhunter
627
628					chmod "${RKHINST_MODE_EX}" rkhunter
629
630					echo "Installation complete"
631
632					exit 0
633				fi
634			else
635				echo " Checking installation directory \"$PREFIX\": it exists, but it is not writable. Exiting."
636				exit 1
637			fi
638		elif [ -e "${PREFIX}" ]; then
639			echo " Checking installation directory \"$PREFIX\": it is not a directory. Exiting."
640			exit 1
641		else
642			echo " Checking installation directory \"$PREFIX\": it does not exist. Exiting."
643			exit 1
644		fi
645		;;
646	esac # end Check PREFIX
647
648
649	echo " Checking installation directories:"
650
651	if [ "${RKHINST_LAYOUT}" = "oldschool" ]; then
652		RKHDIR_LIST="${RKHINST_DIRS}"
653	else
654		RKHDIR_LIST="${RKHINST_DIRS} ${LIBDIR} ${VARDIR}/lib"
655	fi
656
657	umask 022
658	for DIR in ${RKHDIR_LIST}; do
659		if [ -d "${DIR}" ]; then
660			if [ -w "${DIR}" ]; then
661				echo "  Directory ${DIR}: exists and is writable."
662			else
663				echo "  Directory ${DIR}: exists, but it is not writable. Exiting."
664				exit 1
665			fi
666		else
667			mkdir -p ${DIR} >/dev/null 2>&1
668			ERRCODE=$?
669
670			if [ $ERRCODE -eq 0 ]; then
671				echo "  Directory ${DIR}: creating: OK"
672			else
673				echo "  Directory ${DIR}: creating: FAILED: Code $ERRCODE"
674				exit 1
675			fi
676		fi
677	done
678
679	umask 077
680	for DIR in ${RKHINST_DIRS_EXCEP}; do
681		if [ -d "${DIR}" ]; then
682			if [ -w "${DIR}" ]; then
683				echo "  Directory ${DIR}: exists and is writable."
684			else
685				echo "  Directory ${DIR}: exists, but it is not writable. Exiting."
686				exit 1
687			fi
688		else
689			mkdir -p ${DIR} >/dev/null 2>&1
690			ERRCODE=$?
691
692			if [ $ERRCODE -eq 0 ]; then
693				echo "  Directory ${DIR}: creating: OK"
694			else
695				echo "  Directory ${DIR}: creating: FAILED: Code $ERRCODE"
696				exit 1
697			fi
698		fi
699
700		case "${DIR}" in
701		*/${APPNAME}|*/${APPNAME}/*|*/${APPNAME}-${APPVERSION})
702			chmod "${RKHINST_MODE_EX}" "${DIR}"
703			;;
704		esac
705	done
706	umask 027
707
708
709	#
710	# Now do the actual installation.
711	#
712
713	# Helper scripts, database and man page
714	for FILE in ${RKHINST_SCRIPT_FILES} ${RKHINST_DB_FILES} ${RKHINST_MAN_FILES}; do
715		case "${FILE}" in
716		*.pl|*.sh)
717			cp -f ./files/"${FILE}" "${RKHINST_SCRIPT_DIR}" >/dev/null 2>&1
718			ERRCODE=$?
719
720			if [ $ERRCODE -eq 0 ]; then
721				echo " Installing ${FILE}: OK"
722				chmod "${RKHINST_MODE_EX}" "${RKHINST_SCRIPT_DIR}/${FILE}"
723			else
724				echo " Installing ${FILE}: FAILED: Code $ERRCODE"
725				exit 1
726			fi
727			;;
728		*.dat)
729			if [ "${FILE}" = "mirrors.dat" -a -f "${RKHINST_DB_DIR}/mirrors.dat" ]; then
730				RKHTMPVAR=`egrep '^(local|remote)=' ${RKHINST_DB_DIR}/mirrors.dat 2>/dev/null`
731
732				if [ -n "${RKHTMPVAR}" ]; then
733					echo " Installing ${FILE}: Locally modified - not overwritten"
734					continue
735				fi
736			fi
737
738			cp -f ./files/"${FILE}" "${RKHINST_DB_DIR}" >/dev/null 2>&1
739			ERRCODE=$?
740
741			if [ $ERRCODE -eq 0 ]; then
742				echo " Installing ${FILE}: OK"
743				chmod "${RKHINST_MODE_RW}" "${RKHINST_DB_DIR}/${FILE}"
744			else
745				echo " Installing ${FILE}: FAILED: Code $ERRCODE"
746				exit 1
747			fi
748			;;
749		*.8)
750			cp -f ./files/"${FILE}" "${RKHINST_MAN_DIR}" >/dev/null 2>&1
751			ERRCODE=$?
752
753			if [ $ERRCODE -eq 0 ]; then
754				echo " Installing ${FILE}: OK"
755				chmod "${RKHINST_MODE_RWR}" "${RKHINST_MAN_DIR}/${FILE}"
756			else
757				echo " Installing ${FILE}: FAILED: Code $ERRCODE"
758				exit 1
759			fi
760			;;
761		esac
762	done
763
764
765	# Application documents
766	for FILE in ${RKHINST_DOC_FILES}; do
767		cp -f ./files/"${FILE}" "${RKHINST_DOC_DIR}" >/dev/null 2>&1
768		ERRCODE=$?
769
770		if [ $ERRCODE -eq 0 ]; then
771			echo " Installing ${FILE}: OK"
772			chmod "${RKHINST_MODE_RWR}" "${RKHINST_DOC_DIR}/${FILE}"
773		else
774			echo " Installing ${FILE}: FAILED: Code $ERRCODE"
775			exit 1
776		fi
777	done
778
779
780	# Language support files
781	ERRCODE=0
782
783	for FILE in `find ./files/i18n -type f`; do
784		cp "${FILE}" "${RKHINST_LANG_DIR}" >/dev/null 2>&1
785		ERRCODE=$?
786
787		FNAME=`echo ${FILE} | sed 's|^./files/i18n/||'`
788
789		if [ $ERRCODE -eq 0 ]; then
790			chmod "${RKHINST_MODE_RW}" "${RKHINST_LANG_DIR}/${FNAME}"
791		else
792			echo " Installing ${FILE}: FAILED: Code $ERRCODE"
793			break
794		fi
795	done
796
797	if [ $ERRCODE -eq 0 ];then
798		echo " Installing language support files: OK"
799	else
800		echo " Installing language support files: FAILED: Code $ERRCODE"
801		exit 1
802	fi
803
804
805	# ClamAV signatures
806	ERRCODE=0
807
808	for FILE in `find ./files/signatures -type f`; do
809		cp "${FILE}" "${RKHINST_SIG_DIR}" >/dev/null 2>&1
810		ERRCODE=$?
811
812		FNAME=`echo ${FILE} | sed 's|^./files/signatures/||'`
813
814		if [ $ERRCODE -eq 0 ]; then
815			chmod "${RKHINST_MODE_RW}" "${RKHINST_SIG_DIR}/${FNAME}"
816		else
817			echo " Installing ${FILE}: FAILED: Code $ERRCODE"
818			break
819		fi
820	done
821
822	if [ $ERRCODE -eq 0 ];then
823		echo " Installing ClamAV signatures: OK"
824	else
825		echo " Installing ClamAV signatures: FAILED: Code $ERRCODE"
826		exit 1
827	fi
828
829	# Application
830	for FILE in ${RKHINST_BIN_FILES}; do
831		case "${RKHINST_LAYOUT}" in
832		RPM|DEB|TGZ|TXZ)
833			cp -f ./files/"${FILE}" "${RKHINST_BIN_DIR}/${FILE}" >/dev/null 2>&1
834			ERRCODE=$?
835
836			if [ $ERRCODE -eq 0 ]; then
837				echo " Installing ${FILE}: OK"
838				chmod "${RKHINST_MODE_EX}" "${RKHINST_BIN_DIR}/${FILE}"
839			else
840				echo " Installing ${FILE}: FAILED: Code $ERRCODE"
841				exit 1
842			fi
843			;;
844		*)
845			sed -e "s|-f /etc/rkhunter.conf|-f $RKHINST_ETC_DIR/rkhunter.conf|g" -e "s|CONFIGFILE=\"/etc|CONFIGFILE=\"$RKHINST_ETC_DIR|g" ./files/"${FILE}" >"${RKHINST_BIN_DIR}/${FILE}"
846			ERRCODE=$?
847
848			if [ $ERRCODE -eq 0 ]; then
849				echo " Installing ${FILE}: OK"
850				chmod "${RKHINST_MODE_EX}" "${RKHINST_BIN_DIR}/${FILE}"
851			else
852				echo " Installing ${FILE}: FAILED: Code $ERRCODE"
853				exit 1
854			fi
855			;;
856		esac
857	done
858
859
860	# Configuration file
861	for FILE in ${RKHINST_ETC_FILE}; do
862		test $OVERWRITE -eq 1 && rm -f "${RKHINST_ETC_DIR}/${FILE}"
863
864		if [ -f "${RKHINST_ETC_DIR}/${FILE}" ]; then
865			# We need people to make local changes themselves, so
866			# give opportunity and alert. Don't use Perl to get value.
867
868			if [ -n "$RANDOM" ]; then
869				RANDVAL=$RANDOM
870			else
871				RANDVAL=`date +%Y%m%d%H%M%S 2>/dev/null`
872
873				if [ -z "${RANDVAL}" ]; then
874					RANDVAL=$$
875				fi
876			fi
877
878			NEWFILE="${FILE}.${RANDVAL}"
879
880			cp -f "./files/${FILE}" "${RKHINST_ETC_DIR}/${NEWFILE}" >/dev/null 2>&1
881			ERRCODE=$?
882
883			if [ $ERRCODE -eq 0 ]; then
884				echo " Installing ${FILE} in no-clobber mode: OK"
885				chmod "${RKHINST_MODE_RW}" "${RKHINST_ETC_DIR}/${NEWFILE}"
886			else
887				echo " Installing ${FILE} in no-clobber mode: FAILED: Code $ERRCODE"
888				exit 1
889			fi
890
891			echo "" >>"${RKHINST_ETC_DIR}/${NEWFILE}"
892
893			test -z "${PREFIX}" && RKHTMPVAR="/" || RKHTMPVAR="${PREFIX}"
894
895			echo "INSTALLDIR=${RKHTMPVAR}" >>"${RKHINST_ETC_DIR}/${NEWFILE}"
896			echo "DBDIR=${RKHINST_DB_DIR}" >>"${RKHINST_ETC_DIR}/${NEWFILE}"
897			echo "SCRIPTDIR=${RKHINST_SCRIPT_DIR}" >>"${RKHINST_ETC_DIR}/${NEWFILE}"
898			echo "TMPDIR=${RKHINST_TMP_DIR}" >>"${RKHINST_ETC_DIR}/${NEWFILE}"
899
900			if [ "$FILE" = "rkhunter.conf" ]; then
901				echo "USER_FILEPROP_FILES_DIRS=${RKHINST_ETC_DIR}/${FILE}" >>"${RKHINST_ETC_DIR}/${NEWFILE}"
902
903				if [ -f "${RKHINST_ETC_DIR}/${FILE}.local" ]; then
904					echo "USER_FILEPROP_FILES_DIRS=${RKHINST_ETC_DIR}/${FILE}.local" >>"${RKHINST_ETC_DIR}/${NEWFILE}"
905					chmod "${RKHINST_MODE_RW}" "${RKHINST_ETC_DIR}/${FILE}.local"
906				fi
907
908				if [ -d "${RKHINST_ETC_DIR}/rkhunter.d" ]; then
909					echo "USER_FILEPROP_FILES_DIRS=${RKHINST_ETC_DIR}/rkhunter.d/*.conf" >>"${RKHINST_ETC_DIR}/${NEWFILE}"
910				fi
911			fi
912
913			case "${RKHINST_LAYOUT}" in
914			RPM|DEB|TGZ|TXZ)
915				;;
916			*)
917				echo " >>>"
918				echo " >>> PLEASE NOTE: inspect for update changes in \"${RKHINST_ETC_DIR}/${NEWFILE}\","
919				echo " >>> and apply to either \"${RKHINST_ETC_DIR}/${FILE}\" or your local configuration"
920				echo " >>> file before running Rootkit Hunter."
921				echo " >>>"
922				;;
923			esac
924		else
925			cp -f "./files/${FILE}" "${RKHINST_ETC_DIR}" >/dev/null 2>&1
926			ERRCODE=$?
927
928			if [ $ERRCODE -eq 0 ]; then
929				echo " Installing ${FILE}: OK"
930				chmod "${RKHINST_MODE_RW}" "${RKHINST_ETC_DIR}/${FILE}"
931
932				if [ -f "${RKHINST_ETC_DIR}/${FILE}.local" ]; then
933					chmod "${RKHINST_MODE_RW}" "${RKHINST_ETC_DIR}/${FILE}.local"
934				fi
935			else
936				echo " Installing ${FILE}: FAILED: Code $ERRCODE"
937				exit 1
938			fi
939
940			echo "" >>"${RKHINST_ETC_DIR}/${FILE}"
941
942			if [ -n "${RPM_BUILD_ROOT}" -a $RPM_USING_ROOT -eq 0 ]; then
943				echo "INSTALLDIR=${PREFIX}" | sed "s|${RPM_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
944				echo "DBDIR=${RKHINST_DB_DIR}" | sed "s|${RPM_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
945				echo "SCRIPTDIR=${RKHINST_SCRIPT_DIR}" | sed "s|${RPM_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
946				echo "TMPDIR=${RKHINST_TMP_DIR}" | sed "s|${RPM_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
947				echo "USER_FILEPROP_FILES_DIRS=${RKHINST_ETC_DIR}/${FILE}" | sed "s|${RPM_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
948			elif [ -n "${TGZ_BUILD_ROOT}" -a $TGZ_USING_ROOT -eq 0 ]; then
949				echo "INSTALLDIR=${PREFIX}" | sed "s|${TGZ_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
950				echo "DBDIR=${RKHINST_DB_DIR}" | sed "s|${TGZ_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
951				echo "SCRIPTDIR=${RKHINST_SCRIPT_DIR}" | sed "s|${TGZ_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
952				echo "TMPDIR=${RKHINST_TMP_DIR}" | sed "s|${TGZ_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
953				echo "USER_FILEPROP_FILES_DIRS=${RKHINST_ETC_DIR}/${FILE}" | sed "s|${TGZ_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
954			elif [ -n "${TXZ_BUILD_ROOT}" -a $TXZ_USING_ROOT -eq 0 ]; then
955				echo "INSTALLDIR=${PREFIX}" | sed "s|${TXZ_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
956				echo "DBDIR=${RKHINST_DB_DIR}" | sed "s|${TXZ_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
957				echo "SCRIPTDIR=${RKHINST_SCRIPT_DIR}" | sed "s|${TXZ_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
958				echo "TMPDIR=${RKHINST_TMP_DIR}" | sed "s|${TXZ_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
959				echo "USER_FILEPROP_FILES_DIRS=${RKHINST_ETC_DIR}/${FILE}" | sed "s|${TXZ_BUILD_ROOT}||g" >>"${RKHINST_ETC_DIR}/${FILE}"
960			elif [ -n "${DEB_BUILD_ROOT}" ]; then
961				# Debian builds are handled with a patch during the build process.
962				:
963			else
964				test -z "${PREFIX}" && RKHTMPVAR="/" || RKHTMPVAR="${PREFIX}"
965
966				echo "INSTALLDIR=${RKHTMPVAR}" >>"${RKHINST_ETC_DIR}/${FILE}"
967				echo "DBDIR=${RKHINST_DB_DIR}" >>"${RKHINST_ETC_DIR}/${FILE}"
968				echo "SCRIPTDIR=${RKHINST_SCRIPT_DIR}" >>"${RKHINST_ETC_DIR}/${FILE}"
969				echo "TMPDIR=${RKHINST_TMP_DIR}" >>"${RKHINST_ETC_DIR}/${FILE}"
970				echo "USER_FILEPROP_FILES_DIRS=${RKHINST_ETC_DIR}/${FILE}" >>"${RKHINST_ETC_DIR}/${FILE}"
971			fi
972		fi
973	done
974
975
976	# Strip root from fake root install.
977	if [ -n "${STRIPROOT}" ]; then
978		for FILE in `find "${PREFIX}" -type f`; do
979			STR=`grep "${PREFIX}" "${FILE}"`
980
981			if [ -n "${STR}" ]; then
982				sed -i "s|${STRIPROOT}||g" "${FILE}" >/dev/null 2>&1
983				ERRCODE=$?
984
985				if [ $ERRCODE -eq 0 ]; then
986					echo " Striproot ${FILE}: OK"
987				else
988					echo " Striproot ${FILE}: FAILED: Code $ERRCODE"
989					exit 1
990				fi
991			fi
992		done
993	fi
994
995
996	# Finally copy the passwd/group files to the TMP directory
997	# to avoid warnings when rkhunter is first run.
998
999	case "${RKHINST_LAYOUT}" in
1000	RPM|DEB|TGZ|TXZ)	# This is done by a %post section in the spec file / postinst file.
1001		;;
1002	*)
1003		cp -p /etc/passwd ${RKHINST_TMP_DIR} >/dev/null 2>&1
1004		cp -p /etc/group ${RKHINST_TMP_DIR} >/dev/null 2>&1
1005		;;
1006	esac
1007
1008	if [ $DOING_UPDT -eq 1 ]; then
1009		echo "Update complete"
1010	else
1011		echo "Installation complete"
1012	fi
1013
1014	return
1015} # End doInstall
1016
1017
1018doRemove()  {
1019	RKHINST_DIRS="$RKHINST_ETC_DIR $RKHINST_BIN_DIR $RKHINST_SCRIPT_DIR $RKHINST_DOC_DIR $RKHINST_DB_DIR $RKHINST_TMP_DIR $RKHINST_LANG_DIR $RKHINST_SIG_DIR"
1020
1021	echo "Starting uninstallation"
1022	echo ""
1023
1024	# Check the PREFIX
1025	if [ -z "${PREFIX}" ]; then
1026		:
1027	elif [ -d "${PREFIX}" ]; then
1028		if [ -w "${PREFIX}" ]; then
1029			echo "Checking installation directory \"$PREFIX\": it exists and is writable."
1030		else
1031			echo "Checking installation directory \"$PREFIX\": it exists, but it is not writable. Exiting."
1032			exit 1
1033		fi
1034	elif [ -e "${PREFIX}" ]; then
1035		echo "Checking installation directory \"$PREFIX\": it exists but it is not a directory. Exiting."
1036		exit 1
1037	else
1038		echo "Checking installation directory \"$PREFIX\": it does not exist. Exiting."
1039		exit 1
1040	fi
1041
1042
1043	# Standalone removal involves just deleting the 'files' subdirectory.
1044	if [ "$PREFIX" = "." ]; then
1045		rm -rf ./files >/dev/null 2>&1
1046		ERRCODE=$?
1047
1048		if [ $ERRCODE -eq 0 ]; then
1049			echo "Uninstallation complete"
1050		else
1051			echo "Uninstallation FAILED: Code $ERRCODE"
1052		fi
1053
1054		return
1055	fi
1056
1057
1058	echo "Removing installation files:"
1059
1060	# Man page
1061	for FILE in ${RKHINST_MAN_FILES}; do
1062		if [ -f "${RKHINST_MAN_DIR}/${FILE}" ]; then
1063			rm -f "${RKHINST_MAN_DIR}/${FILE}" >/dev/null 2>&1
1064			ERRCODE=$?
1065
1066			if [ $ERRCODE -eq 0 ]; then
1067				echo " Removing ${FILE}: OK"
1068			else
1069				echo " Removing ${FILE}: FAILED: Code $ERRCODE"
1070			fi
1071		fi
1072	done
1073
1074	# Configuration file
1075	for FILE in ${RKHINST_ETC_FILE}; do
1076		if [ -f "${RKHINST_ETC_DIR}/${FILE}" ]; then
1077			rm -f "${RKHINST_ETC_DIR}/${FILE}" >/dev/null 2>&1
1078			ERRCODE=$?
1079
1080			if [ $ERRCODE -eq 0 ]; then
1081				echo " Removing ${RKHINST_ETC_DIR}/${FILE}: OK"
1082			else
1083				echo " Removing ${RKHINST_ETC_DIR}/${FILE}: FAILED: Code $ERRCODE"
1084			fi
1085		fi
1086
1087		echo ""
1088		echo "Please remove any ${RKHINST_ETC_DIR}/${FILE}.* files manually."
1089		echo ""
1090
1091		if [ -d "${RKHINST_ETC_DIR}/${FILE}.d" ]; then
1092			echo ""
1093			echo "Please remove any ${RKHINST_ETC_DIR}/${FILE}.d directory manually."
1094			echo ""
1095		fi
1096	done
1097
1098
1099	# Helper scripts: remove dir
1100	# Application documents: remove dir
1101	# Databases: remove dir
1102	# Language support: remove dir
1103
1104	echo "Removing installation directories:"
1105
1106	for DIR in ${RKHINST_DIRS}; do
1107		case "${DIR}" in
1108		*/${APPNAME})
1109			if [ -d "${DIR}" ]; then
1110				rm -rf "${DIR}" >/dev/null 2>&1
1111				ERRCODE=$?
1112
1113				if [ $ERRCODE -eq 0 ]; then
1114					echo " Removing ${DIR}: OK"
1115				else
1116					echo " Removing ${DIR}: FAILED: Code $ERRCODE"
1117				fi
1118			fi
1119			;;
1120		*/${APPNAME}-${APPVERSION})
1121			# Anything involving a specific version number
1122			# needs to remove all old versions as well.
1123			DIR=`dirname "${DIR}"`
1124
1125			for RKHAPPDIR in ${DIR}/${APPNAME}-*; do
1126				if [ -d "${RKHAPPDIR}" ]; then
1127					rm -rf "${RKHAPPDIR}" >/dev/null 2>&1
1128					ERRCODE=$?
1129
1130					if [ $ERRCODE -eq 0 ]; then
1131						echo " Removing ${RKHAPPDIR}: OK"
1132					else
1133						echo " Removing ${RKHAPPDIR}: FAILED: Code $ERRCODE"
1134					fi
1135				fi
1136			done
1137			;;
1138		*/${APPNAME}/*)
1139			DIR=`dirname "${DIR}"`
1140
1141			if [ -d "${DIR}" ]; then
1142				rm -rf "${DIR}" >/dev/null 2>&1
1143				ERRCODE=$?
1144
1145				if [ $ERRCODE -eq 0 ]; then
1146					echo " Removing ${DIR}: OK"
1147				else
1148					echo " Removing ${DIR}: FAILED: Code $ERRCODE"
1149				fi
1150			fi
1151			;;
1152		esac
1153	done
1154
1155
1156	# Could use patch for removing custom $VARDIR $SHAREDIR $PREFIX here.
1157
1158	if [ "${RKHINST_LAYOUT}" = "oldschool" ]; then
1159		if [ -d "/usr/local/rkhunter" ]; then
1160			echo ""
1161			echo "Note: The directory '/usr/local/rkhunter' still exists."
1162		fi
1163	fi
1164
1165
1166	# Remove any old log files.
1167	rm -f /var/log/rkhunter.log /var/log/rkhunter.log.old >/dev/null 2>&1
1168
1169	echo ""
1170	echo "Finished removing files. Please double-check."
1171
1172	return
1173} # end doRemove
1174
1175
1176#
1177# Start of the installer
1178#
1179
1180if [ $# -eq 0 ]; then
1181	showHelp
1182	exit 1
1183fi
1184
1185while [ $# -ge 1 ]; do
1186	case "$1" in
1187	h | -h | --help | --usage)
1188		showHelp
1189		exit 1
1190		;;
1191	-e | --examples)
1192		showExamples
1193		exit 1
1194		;;
1195	-v | --version)
1196		showVersion
1197		exit 1
1198		;;
1199	-l | --layout)
1200		shift 1
1201
1202		case "$1" in
1203		custom)
1204			shift 1
1205			if [ -n "$1" ]; then
1206				RKHINST_LAYOUT="custom_$1"
1207			else
1208				echo "No custom layout given. Exiting."
1209				exit 1
1210			fi
1211			;;
1212		default|oldschool|/usr|/usr/local|RPM|DEB|TGZ|TXZ)
1213			RKHINST_LAYOUT="$1"
1214			;;
1215		*)
1216			echo "Unknown layout given: $1"
1217			exit 1
1218			;;
1219		esac
1220		;;
1221	-s | --striproot)
1222		shift 1
1223
1224		if [ -n "$1" ]; then
1225			STRIPROOT="$1"
1226		else
1227			echo "Striproot requested but no directory name given. Exiting."
1228			exit 1
1229		fi
1230		;;
1231	--show | --remove | --install | --uninstall)
1232		RKHINST_ACTION_SEEN=1
1233		RKHINST_ACTION=`echo "$1" | sed 's/-//g'`
1234		;;
1235	-o | --overwrite)
1236		OVERWRITE=1
1237		;;
1238	*)
1239		echo "Unknown option given: $1"
1240		echo ""
1241
1242		showHelp
1243		exit 1
1244		;;
1245	esac
1246
1247	shift
1248done
1249
1250# We only get here when some installation action was to be taken.
1251if [ $RKHINST_ACTION_SEEN -eq 0 ]; then
1252	echo "No action given. Exiting."
1253else
1254	case "${RKHINST_ACTION}" in
1255	show)
1256		showTemplate $RKHINST_LAYOUT
1257		;;
1258	remove | uninstall)	# Clean active window
1259		selectTemplate $RKHINST_LAYOUT
1260		clear
1261		doRemove
1262		;;
1263	install) # Clean active window
1264		selectTemplate $RKHINST_LAYOUT
1265		clear
1266		doInstall
1267		;;
1268	esac
1269fi
1270
1271exit 0
1272