1#!/usr/local/bin/bash
2# vim:noet:sw=4:ts=4:
3# Copyright (c) 2005-2014 Andreas Mair
4#
5#
6# Download and patchscript for VDRAdmin-AM
7# (based on install.sh Copyright (c) 2003 Frank (xpix) Herrmann)
8
9PATH=$PATH:/sbin:/bin:/usr/sbin:/usr/bin
10DESTDIR=${DESTDIR}
11LIBDIR=${LIBDIR:-$DESTDIR/usr/share/vdradmin}
12ETCDIR=${ETCDIR:-$DESTDIR/etc/vdradmin}
13DOCDIR=${DOCDIR:-$DESTDIR/usr/share/doc/vdradmin}
14BINDIR=${BINDIR:-$DESTDIR/usr/bin}
15LOCDIR=${LOCDIR:-$DESTDIR/usr/share/locale}
16MANDIR=${MANDIR:-$DESTDIR/usr/share/man}
17LOGDIR=${LOGDIR:-$DESTDIR/var/log/vdradmin}
18CACHEDIR=${CACHEDIR:-$DESTDIR/var/cache/vdradmin}
19PIDFILE=${PIDFILE:-$DESTDIR/var/run/vdradmin/vdradmind.pid}
20VIDEODIR=${VIDEODIR:-/video}
21EPGIMAGES=${EPGIMAGES:-$VIDEODIR/epgimages}
22VDRCONF=${VDRCONF:-$VIDEODIR}
23
24function usage()
25{
26	echo ""
27	echo "usage: $(basename $0) [-c | -u | -p | -h]"
28	echo ""
29	echo -e "\t-c : Run \"vdradmind -c\" after installation (=configure)."
30	echo -e "\t-u : Perform uninstall."
31	echo -e "\t-p : List and optionally install required Perl modules."
32	echo -e "\t-h : This message."
33	echo ""
34	exit 0
35}
36
37function killRunningVDRAdmin()
38{
39	local KILLED=0
40	local PID=$(pidof vdradmind)
41	[ "$PID" ] || PID=$(ps a | grep vdradmind.pl | grep perl | grep -v grep | cut -d' ' -f1)
42	if [ "$PID" ]; then
43		KILLED=1
44		kill $PID
45	fi
46
47	return $KILLED
48}
49
50# $1 - the Perl module to check for.
51function checkPerlModule()
52{
53	[ -z "$1" ] && return 1
54
55	local MODULE=$1
56	local ALT_MODULE=$2
57	local ALT_MESSAGE=
58	[ "$ALT_MODULE" ] && ALT_MESSAGE=" or $ALT_MODULE"
59
60	echo -n "Checking for Perl module $MODULE$ALT_MESSAGE... "
61	perl -ce 'BEGIN{$0 =~ /(^.*\/)/; $BASENAME = $1; unshift(@INC, $BASENAME . "lib/");} use '$MODULE >/dev/null 2>&1
62	if [ $? -eq 2 ]; then
63		if [ "$ALT_MODULE" ]; then
64			perl -ce 'BEGIN{$0 =~ /(^.*\/)/; $BASENAME = $1; unshift(@INC, $BASENAME . "lib/");} use '$ALT_MODULE >/dev/null 2>&1
65			[ $? -eq 0 ] && echo " $ALT_MODULE found" && return 0
66		fi
67		echo " MISSING"
68		read -p "Do you want to install $MODULE? [y/N]"
69		[ "$REPLY" = "y" -o "$REPLY" = "Y" ] && su -c "perl -MCPAN -e 'CPAN::install \"$MODULE\"'"
70	else
71		echo " found"
72	fi
73}
74
75function perlModules()
76{
77	echo ""
78	echo "*** Required ***"
79	checkPerlModule locale
80	checkPerlModule Template
81	checkPerlModule Template::Plugin::JavaScript
82	checkPerlModule CGI
83	checkPerlModule HTTP::Date
84	checkPerlModule IO::Socket
85	checkPerlModule Time::Local
86	checkPerlModule MIME::Base64
87	checkPerlModule File::Temp
88	checkPerlModule URI
89	checkPerlModule URI::Escape
90
91
92	echo ""
93	echo "You need Locale::gettext OR Locale::Messages"
94	checkPerlModule Locale::gettext Locale::Messages
95
96	echo ""
97	echo "*** Optional ***"
98	echo "* Required for AutoTimer email notification"
99	checkPerlModule Net::SMTP
100	checkPerlModule Authen::SASL
101	echo "* Required for AutoTimer email notification and CRAM-MD5 authentication"
102	checkPerlModule Digest::HMAC_MD5
103	echo "* Required if VDR and VDRAdmin-AM use different character encoding"
104	checkPerlModule Encode
105	echo "* Required for IPv6 support"
106	checkPerlModule IO::Socket::INET6
107	echo "* Required for SSL support (https)"
108	checkPerlModule IO::Socket::SSL
109	echo "* Required if you want to use gzip'ed HTTP responses"
110	checkPerlModule Compress::Zlib
111	echo "* Required if you want to log to syslog"
112	checkPerlModule Sys::Syslog
113}
114
115function makeDir()
116{
117	[ -z "$1" ] && return 1
118	local DIR=$1
119	local MUST_CREATE=${2:-0}
120	if [ -e "$DIR" -a ! -d "$DIR" ]; then
121		echo "$DIR exists but is no directory!"
122		echo "Aborting..."
123		return 1
124	elif [ -d $DIR -a $MUST_CREATE = 1 ]; then
125		echo "$DIR exists. Please remove it before calling install.sh!"
126		echo "Aborting..."
127		return 1
128	fi
129	if [ ! -e "$DIR" ]; then
130		mkdir -p "$DIR"
131		if [ $? -ne 0 ]; then
132			echo "Failed to create directory $DIR!"
133			echo "Aborting..."
134			return 1
135		fi
136	fi
137
138	return 0
139}
140
141function doInstall()
142{
143	echo ""
144	echo "********* Installing VDRAdmin-AM *************"
145	echo ""
146
147	perlModules
148
149	makeDir $DESTDIR$LIBDIR 1 && cp -r template lib $DESTDIR$LIBDIR || exit 1
150	makeDir $DESTDIR$BINDIR || exit 1
151	[ -n $NOPORTDOCS ] && makeDir $DESTDIR$DOCDIR && cp -r contrib COPYING CREDITS HISTORY INSTALL LGPL.txt README* REQUIREMENTS FAQ $DESTDIR$DOCDIR || exit 1
152	makeDir $DESTDIR$MANDIR/man8 && cp vdradmind.pl.1 $DESTDIR$MANDIR/man8/vdradmind.8 || exit 1
153
154	(
155		cd locale
156		for lang in *
157		do
158			makeDir $DESTDIR$LOCDIR/$lang/LC_MESSAGES/ && install -m 644 $lang/LC_MESSAGES/vdradmin.mo $DESTDIR$LOCDIR/$lang/LC_MESSAGES/vdradmin.mo || exit 1
159		done
160	)
161
162	local RESTART=
163	if [ -d $DESTDIR$BINDIR ]; then
164		killRunningVDRAdmin
165		if [ $? -ne 0 ] ; then
166			RESTART=1
167			echo "Killed running VDRAdmin-AM..."
168		fi
169		sed <vdradmind.pl >$DESTDIR$BINDIR/vdradmind \
170		    -e "s/^\(my \$SEARCH_FILES_IN_SYSTEM *=\) 0;/\1 1;/" \
171		    -e "s:/usr/share/vdradmin/lib:${LIBDIR}/lib:" \
172		    -e "s:/usr/share/vdradmin/template:${LIBDIR}/template:" \
173		   -e "s:/var/log/vdradmin:${LOGDIR}:" \
174		    -e "s:/var/cache/vdradmin:${CACHEDIR}:" \
175		    -e "s:/var/run/vdradmin/vdradmind.pid:${PIDFILE}:" \
176		    -e "s:\(\$ETCDIR *= \)\"/etc/vdradmin\";:\1\"${ETCDIR}\";:" \
177		    -e "s:/usr/share/locale:${LOCDIR}:" \
178		    -e "s:\(\$CONFIG{VIDEODIR} *= \)\"/video\";:\1\"${VIDEODIR}\";:" \
179		    -e "s:\(\$CONFIG{EPGIMAGES} *= \)\"\$CONFIG{VIDEODIR}/epgimages\";:\1\"${EPGIMAGES}\";:" \
180				-e "s:\(\$CONFIG{VDRCONFDIR} *= \)\"\$CONFIG{VIDEODIR}\";:\1\"${VDRCONF}\";:"
181
182		chmod a+x  $DESTDIR$BINDIR/vdradmind
183
184		if [ "$CONFIG" ]; then
185			echo "Configuring VDRAdmin-AM..."
186			$BINDIR/vdradmind -c
187		fi
188
189		if [ "$RESTART" ]; then
190			echo "Restarting VDRAdmin-AM..."
191			$BINDIR/vdradmind
192		fi
193
194		echo ""
195		if [ -e $DESTDIR$BINDIR/vdradmind.pl ]; then
196			echo "Removing ancient $DESTDIR$BINDIR/vdradmind.pl"
197			rm -f $DESTDIR$BINDIR/vdradmind.pl
198		fi
199		for man in man1/vdradmind.pl.1 man1/vdradmind.1; do
200			if [ -e $DESTDIR$MANDIR/$man ]; then
201				echo "Removing ancient $DESTDIR$MANDIR/$man"
202				rm -f $DESTDIR$MANDIR/$man
203			fi
204		done
205	else
206		echo "$BINDIR exists but is no directory!"
207		echo "Aborting..."
208		exit 1
209	fi
210
211	echo ""
212	echo ""
213	echo "VDRAdmin-AM has been installed!"
214	echo ""
215	if [ -z "$RESTART" ]; then
216		echo "Run \"$BINDIR/vdradmind\" to start VDRAdmin-AM."
217		echo ""
218	fi
219	echo "NOTE:"
220	echo "If you want to run VDRAdmin-AM in a different language you must set the LANG environment variable (see README)."
221	echo ""
222	echo "NOTE2:"
223	echo "If you would like VDRAdmin-AM to start at system's boot, please modify your system's init scripts."
224
225	local USED_DIRS="$(echo -e "$ETCDIR\n$LOGDIR\n$CACHEDIR\n$(dirname "$PIDFILE")" | sort -u)"
226	echo
227	echo "NOTE3:"
228	echo "VDRAdmin-AM needs to access some directories:"
229	echo "$USED_DIRS"
230	echo
231	echo "Please check that the user VDRAdmin-AM runs has enough permissions to access them!"
232	exit 0
233}
234
235function doUninstall()
236{
237	echo ""
238	echo "********* Uninstalling VDRAdmin-AM *************"
239	echo ""
240
241	killRunningVDRAdmin
242	if [ -d $DOCDIR ]; then
243		rm -rf $DOCDIR
244	fi
245	if [ -d $LIBDIR ]; then
246		rm -rf $LIBDIR
247	fi
248	if [ -d $CACHEDIR ]; then
249		rm -rf $CACHEDIR
250	fi
251	for man in man1/vdradmind.pl.1 man1/vdradmind.1 man8/vdradmind.8; do
252		if [ -e $MANDIR/$man ]; then
253			rm -f $MANDIR/$man
254		fi
255	done
256	if [ -e $BINDIR/vdradmind.pl ]; then
257		rm -f $BINDIR/vdradmind.pl
258	fi
259	if [ -e $BINDIR/vdradmind ]; then
260		rm -f $BINDIR/vdradmind
261	fi
262	rm -f $LOCDIR/*/LC_MESSAGES/vdradmin.mo
263
264	echo ""
265	echo "VDRAdmin-AM has been uninstalled!"
266	echo ""
267	if [ -d $ETCDIR ]; then
268		echo "Your configuration files located in $ETCDIR have NOT been deleted!"
269		echo "If you want to get rid of them, please delete them manually!"
270		echo ""
271	fi
272}
273
274UNINSTALL=
275CONFIG=
276PERL=
277while [ "$1" ]
278do
279	case $1 in
280		-u) UNINSTALL=1;;
281		-c) CONFIG=1;;
282		-p) PERL=1;;
283		-h) usage;;
284		*) echo "Ignoring param \"$1\$.";;
285	esac
286	shift
287done
288
289if [ $(basename $0) = "uninstall.sh" -o "$UNINSTALL" ]; then
290	doUninstall
291elif [ "$PERL" ]; then
292	echo ""
293	echo "Testing required Perl modules..."
294	perlModules
295	echo "...done."
296else
297	doInstall
298fi
299