#!/bin/ash
# Installieren/Deinstallieren von Fritz!Load GUI in debug.cfg oder rc.custom
################################ Einstellungen ANFANG ################################
##
#
# Installationstyp:
# default: Installieren: USB-Speicher"
# small : Installieren: RAM-SMALL (nur GUI)"
# medium : Installieren: RAM-MEDIUM (GUI+CURL)"
# large : Installieren: RAM-LARGE (GUI+CURL+BIN)"
itype=default
# Freetz-Mod installiert (0=Nein/Auto, 1=Ja)
freetz=0
# Welche Dateien sollen nicht bei itype=medium im RAM abgelegt werden:
remove_medium="gocr pngtopnm smbclient tcpdump unrar null.bin wget"
#
##
################################# Einstellungen ENDE #################################
# bootloader-version
blver=3
# debug.cfg
filed=/var/flash/debug.cfg
# backup_debug.cfg
filedbk=/var/tmp/backup_debug.cfg
exit=0
sizeDir(){
if [ ! -e "$1" -o -z "$BBox" ];then
echo -n 0
return 1
fi
local size="$(${BBox} du -ks $1 | sed -e 's,[^0-9]*\([0-9]*\).*,\1,')"
[ -z "$size" ] && size=0
echo -n $size
}
helpmsg(){
sizeLarge=0 sizeSmall=0 sizeMedium=0
for f in bin cgi html lib; do
s=$(sizeDir $pdir/$f)
sizeLarge=$(($sizeLarge+$s))
done
for f in bin/busybox24; do
s=$(sizeDir $pdir/$f)
sizeLarge=$(($sizeLarge-$s))
done
sizeSmall=$sizeLarge
sizeMedium=$sizeLarge
for f in bin; do
s=$(sizeDir $pdir/$f)
sizeSmall=$(($sizeSmall-$s))
done
sizeMedium=$sizeLarge
for f in $remove_medium; do
s=$(sizeDir $pdir/bin/$f)
sizeMedium=$(($sizeMedium-$s))
done
[ "$sizeSmall" = 0 ] && sizeSmall="?"
[ "$sizeMedium" = 0 ] && sizeMedium="?"
[ "$sizeLarge" = 0 ] && sizeLarge="?"
echo "Aufruf: $0 PFAD [-g|-u|-i|-iRS|-iRM|-iRL|-d|-cu|-?] [-freetz]"
echo
echo " PFAD - Die Pfadangabe ist optional, falls nicht angegeben:"
echo " $(pwd)"
echo
echo " -g - Starte GUI (Fritz!Load funktioniert nur bis zum naechsten Neustart,"
echo " kein Eintrag in debug.cfg -> Prima zum Testen)."
echo " -u - Halte GUI an (Fritz!Load wird aus dem Speicher entfernt)."
echo " -i - Installieren : USB-Speicher"
echo " -iRS - Installieren : RAM-SMALL (nur GUI ca. $sizeSmall Kbyte)"
echo " -iRM - Installieren : RAM-MEDIUM (GUI+CURL ca. $sizeMedium Kbyte)"
echo " -iRL - Installieren : RAM-LARGE (GUI+CURL+BIN ca. $sizeLarge Kbyte)"
echo " -d - Deinstallieren: Eintrag aus debug.cfg / rc.custom entfernen."
echo " -cu - Den Bootloader aktualisieren - wenn noetig."
echo " -freetz - Erzwinge Installation in freetz mod."
echo " -? - Diese Hilfe anzeigen, dann beenden."
echo
echo " Beispiele:"
echo " $0 -i -freetz (Installiere Fritz!Load im freetz mod)"
echo " $0 -d -freetz (Deinstalliere Fritz!Load im freetz mod)"
echo " $0 -iRS (Installiere im Ram-Small)"
echo
}
check(){
#Pruefe ob freetz-mod auf der FritzBox drauf ist, falls ja, dann wird /var/tmp/flash/rc.custom statt ins debug.cfg eingetragen
if [ -e "/var/tmp/flash/rc.custom" ]; then
filed=/var/tmp/flash/rc.custom
filedbk=/var/tmp/backup_rc.custom
freetz=1
elif [ -e /var/tmp/flash/mod -o "$freetz" = 1 ]; then
filed=/var/tmp/flash/mod/rc.custom
filedbk=/var/tmp/backup_rc.custom
freetz=1
fi
# Datei existiert noch nicht?
[ ! -e "$filed" ] && echo -n >$filed
return 0
}
checkBlUpdate() {
echo "Pruefe Fritz!Load-Bootloader..."
inst_fl=$(grep "#>> \(Apache-\)\?Fritzload" $filed)
[ -z "$inst_fl" ] && echo "Fritz!Load ist nicht installiert." && return 1
inst_blver=$(grep "fritzload_blver=" $filed | sed 's,.*fritzload_blver=\([^;]*\).*,\1,')
[ -z "$inst_blver" ] && inst_blver=0
if [ "${blver:-0}" -gt $inst_blver ]; then
# update bootloader
echo "Aktualisiere den Fritz!Load-Bootloader v$inst_blver -> v$blver ..."
itype=$(grep "fritzload_itype=" $filed | sed 's,.*fritzload_itype=\([^;]*\).*,\1,')
exit=1
install
return $?
fi
echo "Der Fritz!Load-Bootloader ist auf dem neuesten Stand."
return 0
}
delete() {
echo "Entferne Zeilen aus $filed..."
# NEUE FORMAT
echo -n >$filedbk
sed -n '/^#>> \(Apache-\)\?Fritzload/,/^#<< \(Apache-\)\?Fritzload/!p' $filed >$filedbk
# ALTES FORMAT
grep -v "\(/var/tmp/apache\|# Apache-1\)" $filedbk >$filedbk.2
cat $filedbk.2 >$filed
[ "${freetz:-0}" -eq 1 ] && modsave flash
rm -f $filedbk*
echo "Eintraege wurden aus $filed entfernt."
return 0
}
is_installed(){
if [ $(grep -c "\(# Apache\|#>> Fritzload\|#>> Apache\)" $filed) -eq 1 ]; then
echo "Der Installations-Eintrag ist bereits vorhanden!"
return 0
fi
return 1
}
add_debug(){
add_file=$1
cat $filed >$filedbk
cat $add_file >>$filedbk
cat $filedbk >$filed
[ "${freetz:-0}" -eq 1 ] && modsave flash
echo -n >$signaldir/flblupdated
echo "Eintraege in $filed gespeichert."
echo "--------------------------------------"
if [ "$exit" = 1 ];then
exit 0
fi
echo "Starte die Einrichtung von Fritz!Load..."
# Background Installation entfernen und Installer ausfuehren:
sed -e '/^\( {\| } &\)$/d' $add_file >$add_file.exe
rm -f $add_file
sh $add_file.exe -exit
rm -f $add_file.exe
}
install() {
is_installed && delete
cat <<'EOF' >/var/install.tmp
#>> Fritzload
EOF
echo "fritzload_blver=$blver; USB_dir=$pdir; fritzload_itype=$itype; remove_medium=\"$remove_medium\";" >>/var/install.tmp
cat <<'EOF' >>/var/install.tmp
while !($USB_dir/bin/install.sh $USB_dir -g); do
sleep 5
done
#<< Fritzload
EOF
add_debug /var/install.tmp
}
unload() {
if [ -e /var/fritzload ];then
echo "Entferne die GUI-Verzeichnisstruktur..."
/var/fritzload/bin/guiinit.sh /var/fritzload -u
echo "Entferne Fritz!Load..."
killall autorunfl.sh 2>/dev/null
#kill FritzLoad Webserver
kill $(ps ww | grep 'h /var/tmp/www-fritzload/' | grep -v 'grep' | awk '{print $1}') 2>/dev/null
# kill stunnel
kill $(ps ww | grep 'stunnel.*config/stunnel_conf' | grep -v 'grep' | awk '{print $1}') 2>/dev/null
if [ -L /var/fritzload ];then
# remove default install
rm -f /var/fritzload
else
# remove non-default install
rm -rf /var/fritzload
fi
fi
}
instWait() {
itype=$(grep "fritzload_itype=" $filed | sed 's,.*fritzload_itype=\([^;]*\).*,\1,')
echo -n >/var/tmp/flInstWait.exe
echo "USB_dir=$pdir; fritzload_itype=$itype; d1=$1; d2=$2;" >>/var/tmp/flInstWait.exe
cat <<-'EOF' >>/var/tmp/flInstWait.exe
USB_dir="${USB_dir%/${USB_dir#/var/media/ftp/*/}}"
installed=0
{
while true; do
if mount | grep " on $USB_dir" >/dev/null; then
echo "Warte auf das Aushaengen des USB-Speichers..."
while true; do
sleep 11
if mount | grep " on $USB_dir" >/dev/null; then
continue
fi
echo "Der USB-Speicher wurde ausgehaengt."
sleep 3
break
done
fi
while true; do
if mount | grep " on /var/media/ftp/" >/dev/null; then
echo "Der USB-Speicher wurde gefunden."
sleep 3
break
fi
sleep 11
done
for USBDEVICE in $(mount | grep /var/media/ftp/ | sed -e "s,^.*ftp/,,g" -e "s/ .*$//"); do
# Verzeichnis vorhanden?
for fldir in "fritzload|FritzLoad|Fritzload"; do
pdir=/var/media/ftp/$USBDEVICE/$fldir
if [ -d "$pdir" ];then
break
fi
done
if [ -f "$pdir/bin/install.sh" ];then
echo "Fritz!Load wurde in $pdir gefunden."
#cd $pdir/bin
./install.sh $pdir -i$fritzload_itype $d1 $d2
installed=1
break
fi
done
[ "$installed" = 1 ] && break
echo "Fritz!Load wurde nicht gefunden!"
done
} &
EOF
echo "Start der Warteschleife fuer die Fritz!Load-Installation."
chmod 0777 /var/tmp/flInstWait.exe
/var/tmp/flInstWait.exe
}
# Pfad vom Fritz!Load-Root Verzeichnis
pdir="$1"
# Erster Parameter ist Pfadangabe oder Kommando?
if [ -z "${pdir##-*}" ];then
pdir="$(pwd)"
else
shift
[ "$pdir" = "." -o ! -d "$pdir" ] && pdir="$(pwd)"
fi
pdir="${pdir%/bin}"
[ "$pdir" = "/var/fritzload" -a -L /var/fritzload ] && pdir=$(ls -l /var/fritzload | sed 's,.*-> \(.*\),\1,')
if [ ! -d "$pdir/bin/" -o ! -d "$pdir/html/" -o ! "$pdir/cgi/" ];then
echo "!!!!!!"
echo "Der ermittelte Pfad ist nicht Fritz!Load-Root."
echo "Die Unterverzeichnisse /bin, /html oder /cgi wurden nicht"
echo "in $pdir gefunden."
echo "Bitte in das Verzeichnis /fritzload/bin wechseln"
echo "und den Installer erneut starten."
echo "!!!!!!"
helpmsg
exit 0
fi
if [ "${pdir#/var/media/ftp}" = "$pdir" ];then
echo "!!!!!!"
echo "Fehler! Der Pfad ist kein absoluter Pfad zum USB-Speicher."
echo "Der Pfad muss auf den USB-Speicher ueber /var/media/ftp/... verweisen - und nicht ueber einen Link!"
echo "Bitte in das Fritz!Load-Verzeichnis auf dem USB-Speicher wechseln!"
cd /var/media/ftp
echo "/var/media/ftp/$(ls)"
echo
echo "Und von dort ./install.sh erneut aufrufen."
echo "!!!!!!"
helpmsg
exit 0
fi
. $pdir/bin/BBox
if [ "$2" = "-freetz" ];then
freetz=1
fi
if [ "$3" = 'exit' ];then
exit=1
fi
case "$1" in
-d|--del)
check
delete
;;
-p|-i|--ins|-ideafult)
check
itype=default
install
;;
-iRS|-ismall)
check
itype=small
install
;;
-iRM|-imedium)
check
itype=medium
install
;;
-iRL|-ilarge)
check
itype=large
install
;;
-A) # AUTO: via Installations-TAR!
check
install
;;
-g)
$pdir/bin/guiinit.sh $pdir install
[ ! -e /var/fritzload ] && ln -s $pdir /var/fritzload
;;
-u)
unload
;;
-cu)
check
checkBlUpdate
;;
-?|--help)
helpmsg
exit 0
;;
*)
helpmsg >&2
exit 1
;;
esac