# Alle funktionen sind hier deklariert
BIN=oscam-bin
LOGFILE=/tmp/oscam.log
WLOGFILE=/tmp/oscam_watchdog.log
OPT=-b
Na=Oscam
OSCAM_SERVER=/etc/config/oscam/oscam.server
OSCAM_CONF=/etc/config/oscam/oscam.conf
OSCAM_WATCHDOG=/etc/config/oscam/oscam.watchdog
#######################################################################
## Get Config from File ##
#######################################################################
WATCHDOG_ENABLE=$(grep watchdog_enable $OSCAM_WATCHDOG | grep -v '#' | awk '{print $3}')
REBOOT_ENABLE=$(grep -w reboot $OSCAM_WATCHDOG | grep -v '#' | awk '{print $3}')
PANIC_REBOOT_ENABLE=$(grep panicreboot $OSCAM_WATCHDOG | grep -v '#' | awk '{print $3}')
PANIC_REBOOT_COUNT=$(grep -v "#" $OSCAM_WATCHDOG | awk '/panic_reboot_count/ {print $3}')
#LOCALHOST=$(/sbin/ifconfig br-lan | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}')
MON_USR=$(grep watchdog_user $OSCAM_WATCHDOG | grep -v '#' | awk '{print $3}')
MON_PWD=$(grep watchdog_pass $OSCAM_WATCHDOG | grep -v '#' | awk '{print $3}')
MON_PORT=$(grep watchdog_port $OSCAM_WATCHDOG | grep -v '#' | awk '{print $3}')
DEF_ERROR_READER='The reader was disabled|Cannot open device|Error getting card status|read failed with error|IO: Read timeout'
if test $(grep nocrypt $OSCAM_CONF | grep "127.0.0.1" | wc -l) -ge 1; then
LOCALHOST="127.0.0.1"
else
LOCALHOST=$(/sbin/ifconfig br-lan | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}')
fi
call_start() {
if test -e /etc/init.d/pcscd;then
/etc/init.d/pcscd start
sleep 1
fi
if test -e /festplatte/swapfile;then
swapon /festplatte/swapfile
fi
if test -e /overlay/swapfile;then
swapon /overlay/swapfile
fi
if test $(ps | grep $BIN | grep -v grep | grep -v sh | grep -v ash | wc -l) -ge 2; then
printf "\nVersuch des Starts abgebrocken! Ist $Na bereits aktiv?\n\n"
logger "Versuch des Starts abgebrochen! ISt $Na bereits aktiv?"
else
call_clear_log
printf "\n$Na wird gestartet!\n\n"
if test $(ps | grep $BIN | grep -v grep | grep -v sh | grep -v ash | wc -l) -lt 2; then
$BIN $OPT
fi
if test $(ps | grep usbwatch | grep -v grep | wc -l) -lt 1; then
nohup /usr/bin/usbwatch > /dev/null & sleep 2
fi
if test $WATCHDOG_ENABLE -ge 1; then
if test $(ps | grep oscam_watchdog | wc -l) -lt 2; then
nohup sh /usr/bin/oscam_watchdog > /dev/null & exit
fi
else
echo "Watchdog: Watchdog ist deaktiviert in $OSCAM_WATCHDOG. ( watchdog = 1 zum aktivieren )"
exit
fi
fi
}
call_stop() {
if test $(ps | grep $BIN | grep -v grep | grep -v sh | grep -v ash | wc -l) -ge 2; then
printf "\n$Na wird beendet!\n\n"
logger "$Na wird beendet!"
for i in $(ps | grep $BIN | grep -v /bin/ash | grep -v awk | grep -v sh | grep -v grep | awk '{print $1}'); do
kill -9 $i > /dev/null
done
for i in $(ps | grep oscam_watchdog | grep -v grep | awk '{print $1}'); do
kill -9 $i > /dev/null
done
for i in $(ps | grep ncat | grep -v grep | awk '{print $1}'); do
kill -9 $i > /dev/null
done
else
printf "\n$Na inaktiv ! Kann nicht beendet werden!\n\n"
logger "$Na inaktiv ! Kann nicht beendet werden!"
fi
}
call_restart() {
call_stop
sleep 1
call_start
}
call_update() {
if test $(grep ar71xx /etc/opkg.conf | wc -l) -ge 1;then
arch=ar71xx
fi
if test $(grep brcm63xx /etc/opkg.conf | wc -l) -ge 1;then
arch=brcm63xx
fi
if test $(grep brcm47xx /etc/opkg.conf | wc -l) -ge 1;then
arch=brcm47xx
fi
srcurl=$(awk '/http:/ {print $3}' /etc/opkg.conf)
printf "\nWillkommen beim Oscam Installservice!"
printf "\nDu hast hier die Möglichkeit Oscam oder den Watchdog upzudaten oder downzugraden."
printf "\nSobald die Installation gestartet wird, wird Oscam beendet. Du kannst jederzeit mit strg+c abbrechen.\n"
printf "\nWelches Paket möchtest du modifizieren? 1 = Oscam , 2 = Watchdog [1 oder 2] : "
read updateart
if [ "$updateart" = "1" -o "$updateart" = "1" ];then
call_stop
nohup opkg update > /dev/null
installed=$(opkg list_installed | grep oscam | grep svn)
new_aviable=$(opkg list | grep oscam | grep -v watchdog)
printf "\nDerzeit ist folgende Version installiert:\n"
printf "\n$installed\n"
printf "\nInstallierbare Versionen sind:\n"
printf "\n$new_aviable\n"
printf "\nWelche Version möchtest du installieren? [z.b. 7991] : "
read svnver
printf "Bist du dir sicher das du jetzt $Na - 1.20-svn-$svnver installieren willst? [J/N]"
read sicher1
if [ "$sicher1" = "J" -o "$sicher1" = "j" ];then
opkg remove oscam-*
opkg install oscam-$svnver --force-downgrade --nodeps
rm /tmp/oscam.ipk 2>/dev/null
fi
printf "\nInstallation ist beendet! Nun kannst du 'oscam start' eingeben oder 'oscam test' um die Version zu testen!\n"
fi
if [ "$updateart" = "2" -o "$updateart" = "2" ];then
call_stop
nohup opkg update > /dev/null
w_installed=$(opkg list_installed | grep oscam_watchdog)
w_new_aviable=$(opkg list | grep oscam_watchdog)
printf "\nDerzeit ist folgende Version installiert:\n"
printf "\n$w_installed\n"
printf "\nInstallierbare Versionen sind:\n"
printf "\n$w_new_aviable\n"
printf "\nWelche Version möchtest du installieren? [z.b. 1.00] : "
read wver
printf "Bist du dir sicher das du jetzt oscam_watchdog - $wver installieren willst? [J/N]"
read sicher2
if [ "$sicher2" = "J" -o "$sicher2" = "j" ];then
opkg remove oscam_watchdog
wget $srcurl/oscam'_'watchdog'_'$wver'_'$arch.ipk -O /tmp/watchdog.ipk
opkg install /tmp/watchdog.ipk --nodeps --force-downgrade
rm /tmp/watchdog.ipk
fi
printf "\nInstallation ist beendet.\n"
fi
}
call_status() {
call_monitor status > /tmp/status.tmp
if test $(grep '|s|' /tmp/status.tmp | wc -l) -ge 1;then
printf "\n$Na ist aktiv. Hole Details ein......\n"
sleep 1
if test $(grep '|r|' /tmp/status.tmp | wc -l) -ge 1;then
printf "\nFolgende Hardwarereader sind aktiv:\n\n"
grep '|r|' /tmp/status.tmp | sed 's/|/ /g' | awk '{print $5}'
else
printf "\nEs sind keine Hardwarereader aktiv.\n"
fi
usleep
if test $(grep '|p|' /tmp/status.tmp | wc -l) -ge 1;then
printf "\nFolgende Lines sind aktiv:\n\n"
grep '|p|' /tmp/status.tmp | sed 's/|/ /g' | awk '{print $5}'
else
printf "\nEs sind keine Lines aktiv.\n"
fi
printf "\nFolgende Benutzer sind aktiv:\n"
grep '|m|' /tmp/status.tmp | sed 's/|/ /g' | awk '{print $5}'
rm /tmp/status.tmp
else
printf "\n$Na ist inaktiv! Kein Prozess gefunden oder Monitor deaktiviert.\n"
fi
if test $WATCHDOG_ENABLE -ge 1; then
if test $(ps | grep oscam_watchdog | grep -v grep | awk '{print $1}' | wc -l) -ge 1;then
printf "\nWatchdog ist aktiv!\n"
else
printf "\nWatchdog ist inaktiv jedoch in der Config aktiviert!\n"
fi
else
printf "\nWatchdog ist deaktiviert!\n"
fi
}
call_clear_log() {
echo "------------------------------------------------------------------------------------" >> $LOGFILE.old
tail -30 $LOGFILE >> $LOGFILE.old
tail -300 $LOGFILE.old > $LOGFILE.tmp
cat $LOGFILE.tmp > $LOGFILE.old
rm $LOGFILE.tmp
echo "-" > $LOGFILE
}
call_check_reboot() {
curr_day=$(date | cut -c1-3 | grep Mon | wc -l)
curr_hou=$(date | cut -c12-13)
boot_hou=$(uptime | cut -c15)
boot_min=$(uptime | cut -c17-18)
if test -n $boot_hou;then
echo "Zeitpunkt für reboot ist nicht erreicht!"
else
boot_stmp=$(expr $boot_hou \* $boot_min)
if test $boot_stmp -ge 1 -o $curr_day -ge 1; then
reboot
fi
fi
}
call_setup() {
new_overlay=0
old_overlay=0
swap_on=0
new_hdd=0
old_hdd=0
osc_inst=0
printf "\n\n Willkommen beim Setup!"
printf "\n Du hast hier die Möglichkeit den Speicher deines Routers zu erweitern(usb-stick),"
printf "\n Festplatten ein zu binden oder ein vorher verwendeten Stick wieder herzustellen."
printf "\n Die Festplatte/der Stick wird/muss ext4 formatiert werden/sein."
printf "\n Die Festplatte/der Stick sollte spätestens jetzt angeschlossen werden."
printf "\n Das Gerät wird später mittels uuid gemountet. Dadurch kann der Stick auch mal am anderen Port stecken."
printf "\n Was möchtest du tun?\n"
printf "\n (1) - Neue Erweiterung einrichten? (2) - Alten Stick wiederherstellen?\n"
printf "\n (3) - Neue Festplatte einbinden? (4) - Alte Festplatte wiederherstellen?\n"
printf "\n (5) - Swap Speicher einrichten? (6) - Oscam und Watchdog installieren?\n"
printf "\n (Eingabe 1,2,3,4,5 oder 6):"
read case
if [ "$case" = "1" ];then
let new_overlay=$new_overlay+1
fi
if [ "$case" = "2" ];then
let old_overlay=$old_overlay+1
fi
if [ "$case" = "3" ];then
let new_hdd=$new_hdd+1
fi
if [ "$case" = "4" ];then
let old_hdd=$old_hdd+1
fi
if [ "$case" = "5" ];then
space1=$(df -m | awk '/overlayfs:/ {print $2}')
space2=$(df -m | awk '/festplatte/ {print $2}')
if test -z $space1;then
space1=129
fi
if test -z $space2;then
space2=129
fi
if test $space1 -lt 128 -o $space1 -lt 128;then
printf "\n Dein Massenspeicher ist noch nicht erfolgreich eingebunden wurden!"
else
let swap_on=$swap_on+1
fi
fi
if [ "$case" = "6" ];then
let osc_inst=$osc_inst+1
fi
if test $new_hdd = 1;then
label=festplatte
fi
if test $new_overlay = 1;then
label=overlay
fi
if test $(opkg list_installed | grep e2fsprogs | wc -l) -lt 1; then
printf "\n\n Installiere erforderliche Pakete\n\n"
nohup opkg update >> /dev/null
nohup opkg install blkid kmod-fs-ext4 kmod-usb-storage block-mount e2fsprogs >> /dev/null
sleep 5
fi
if test "$new_overlay" = "1" -o "$new_hdd" = "1" -o "$old_overlay" = "1" -o "$old_hdd" = "1";then
printf "\n\n Es sind folgende Massenspeicher angeschlossen:\n\n"
blkid
printf "\n Welcher dieser soll eingebunden werden? (Eingabe z.b. sda1) : "
read din
device=/dev/$din
if test "$old_overlay" = "1" -o "$old_hdd" = "1";then
device=$(blkid | sed 's/"/ /g' | awk '/'$device'/ {print $3}')
fi
fi
if test "$new_overlay" = "1" -o "$new_hdd" = "1" ;then
printf "\n $device wird formatiert! Bist du dir sicher? J/N :"
read sicher1
if [ "$sicher1" = "J" -o "$sicher1" = "j" ];then
printf "\n Datenträger wird formatiert.......\n"
nohup mkfs.ext4 -L $label $device > /dev/null
fi
fi
if test "$new_overlay" = "1" -o "$new_hdd" = "1" -o "$old_overlay" = "1" -o "$old_hdd" = "1";then
printf "\n Datenträger wird nun eingebunden\n"
uuid=$(blkid | grep $label | sed 's/"/ /g' | awk '{print $5}')
echo " " >> /etc/config/fstab
echo "config mount" >> /etc/config/fstab
echo " option target /$label" >> /etc/config/fstab
echo " option uuid $uuid" >> /etc/config/fstab
echo " option fstype ext4" >> /etc/config/fstab
echo " option options rw,sync" >> /etc/config/fstab
echo " option enabled 1" >> /etc/config/fstab
echo " option enabled_fsck 0" >> /etc/config/fstab
sleep 2
sync
if test $new_overlay = 1;then
mkdir /tmp/new_overlay
mkdir /tmp/old_overlay
mount $device /tmp/new_overlay
mount -o bind /overlay /tmp/old_overlay
cp -r /tmp/old_overlay/* /tmp/new_overlay -a
usleep
umount /tmp/old_overlay
umount /tmp/new_overlay
fi
printf "\n Der Vorgang ist abgeschlossen, starte Router in 10 Sekunden neu!\n"
printf "\n Du kannst nach dem Neustart deinen Swapspeicher einrichten.\n\n"
sleep 10
reboot
fi
if test $swap_on = 1;then
printf "\n Welche Größe, in MB, soll dein Swapfile haben? (Empfehlung 256) : "
read swin
sw_size=$(expr $swin \* 1024)
if test $(df -m | awk '/overlayfs:/ {print $2}') -gt 128;then
if test -e /festplatte;then
swapfile=/festplatte/swapfile
if test -e /festplatte/swapfile;then
mkswap /festplatte/swapfile
swapon /festplatte/swapfile
else
printf "\n\n Erstelle nun das Swapfile. Anhängig vom Stick kann das bis zu 20 Minuten dauern!\n\n\n"
dd if=/dev/
zero of=/festplatte/swapfile bs=1024 count=$sw_size
mkswap /festplatte/swapfile
swapon /festplatte/swapfile
fi
else
swapfile=/overlay/swapfile
if test -e /overlay/swapfile;then
mkswap /overlay/swapfile
swapon /overlay/swapfile
else
printf "\n\n Erstelle nun das Swapfile. Anhängig vom Stick kann das bis zu 20 Minuten dauern!\n\n\n"
dd if=/dev/
zero of=/overlay/swapfile bs=1024 count=$sw_size
mkswap /overlay/swapfile
swapon /overlay/swapfile
fi
fi
else
printf "Du hast noch kein funktionierende Speichererweiterung eingerichtet oder dieser schlug fehl.\n\n"
fi
uci set fstab.@swap[-1].device=$swapfile
uci set fstab.@swap[-1].enabled=1
uci commit fstab
printf "\n Swap Speicher sollte nun bereit stehen. Testen mit free .\n"
fi
if test $osc_inst = 1;then
if test $(grep ar71xx /etc/opkg.conf | wc -l) -ge 1;then
arch=ar71xx
fi
if test $(grep brcm63xx /etc/opkg.conf | wc -l) -ge 1;then
arch=brcm63xx
fi
if test $(grep brcm47xx /etc/opkg.conf | wc -l) -ge 1;then
arch=brcm47xx
fi
srcurl=$(awk '/http:/ {print $3}' /etc/opkg.conf)
nohup opkg update > /dev/null
printf "\n Folgende Versionen sind derzeit am Server Verfügbar:\n\n"
opkg list | grep oscam | grep -v watchdog
printf "\nSVN 6089 ist Oscam 1.10 welche als '"stable"' anzusehen ist!\n\n"
printf "\nWelche Version möchtest du installieren? [z.b. 6089] : "
read svnver
if test $svnver = 6089;then
ver=1.10
else
ver=1.20
fi
wget $srcurl/oscam_$ver-svn-$svnver'_'$arch.ipk -O /tmp/oscam.ipk
nohup opkg --nodeps --force-downgrade install /tmp/oscam.ipk > /dev/null
rm /tmp/oscam.ipk
nohup opkg install oscam_watchdog > /dev/null
/etc/init.d/oscam enable
nohup /etc/init.d/oscam start > /dev/null
printf "\n\n Oscam wurde gestartet und startet ab jetzt beim booten automatisch."
printf "\n Das Oscam Webinterface ist nun unter $(/sbin/ifconfig br-lan | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'):8888 erreichbar. Viel Spaß!\n\n"
fi
}
call_monitor() {
command=$1
time=$2
if test $(ps | grep $BIN | grep -v /bin/ash | grep -v awk | grep -v sh | grep -v grep | wc -l) -ge 2;then
if test -z $time;then
(echo -e "login $MON_USR $MON_PWD";
usleep;
echo -e "$command";
usleep;
echo -e "exit") | ncat -i 1 -u $LOCALHOST $MON_PORT 2>/dev/null
else
(echo -e "login $MON_USR $MON_PWD";
usleep;
echo -e "$command";
usleep;
echo -e "exit") | ncat -i $time -u $LOCALHOST $MON_PORT 2>/dev/null
killall -s SIGINT ncat 1>/dev/null 2>/dev/null
fi
else
sleep 1
call_monitor & exit
fi
}
call_watchdog_reader_detect () {
runde=1
call_monitor status | grep -v "logged in" > /tmp/watchdog.oscam.status
grep '|r|' /tmp/watchdog.oscam.status | sed 's/|/ /g' | awk '{print $2,$5}' > /tmp/watchdog.detect.readers
reader_count=$(grep '|r|' /tmp/watchdog.oscam.status| wc -l)
reader_count_config=0
logger "Watchdog: Es wurden $reader_count Hardware Reader erkannt:"
while test $runde -le $reader_count;do
reader_name=$(awk 'NR=='$runde'{print $2}' /tmp/watchdog.detect.readers)
reader_PPID=$(awk 'NR=='$runde'{print $1}' /tmp/watchdog.detect.readers)
reader_kind=$(grep -C 8 -i $reader_name $OSCAM_SERVER | grep -iEv "'#'|Device" | awk '/Protocol|protocol/ {print $3}')
logger "Watchdog: Reader '"$reader_name"' mit PID '"$reader_PPID"' ist bereit! ($reader_kind)"
let runde=$runde+1
done
for line in $(grep -iE "mouse|
smartreader|smargo|pcsc" $OSCAM_SERVER | grep -iEv "label|smargopatch|Device|'#'|description|Description" | awk '{print $1}'); do
let reader_count_config=$reader_count_config+1
done
for line in $(grep -C 8 -iE "mouse|
smartreader|smargo|pcsc" $OSCAM_SERVER | grep "enable" | grep "0" | awk '{print $1}'); do
let reader_count_config=$reader_count_config-1
done
if test $reader_count_config != $reader_count;then
logger "Watchdog: Die erkannte Readeranzahl stimmt nicht mit der in deiner Config überein!"
logger "Watchdog: Ich prüfe in deinem logfile ob währen des Statrts einer abgeschmiert ist!"
if test -e $LOGFILE;then
call_watchdog_check_logfile & exit
else
logger "Watchdog: Du hast kein Logfile welches ich prüfen kann! Überwachung der erkannten Reader startet dennoch!"
rm /tmp/oscam.try 2>/dev/null
rm /root/reboot.try 2>/dev/null
call_watchdog_shitstorm & exit
fi
else
logger "Watchdog: Readererkennung erfolgreich abgeschlossen! Überwachung beginnt!"
rm /tmp/oscam.try 2>/dev/null
rm /root/reboot.try 2>/dev/null
call_watchdog_shitstorm & exit
fi
}
call_watchdog_check_logfile () {
if test -e /tmp/oscam.try;then
reader_try=$(grep try /tmp/oscam.try | wc -l)
panic_reboot_count=$(grep panic_reboot_count $OSCAM_WATCHDOG | grep -v '#' | awk '{print $3}')
if test $reader_try -ge $panic_reboot_count;then
logger "Watchdog: Das Starten aller Reader schlug $reader_try x fehl! Die Überwachung wird Abgebrochen oder der Panikreboot wird eingeleitet!"
if test $(grep panic_reboot $OSCAM_WATCHDOG | grep -vE '#|count' | awk '{print $3}') -ge 1;then
if test -e /root/reboot.try;then
if test $(grep reboot /root/reboot.try | wc -l) -ge 3;then
logger "Watchdog: Es wurden 3 Reboots absolviert ohne Erfolg! Ich gebe auf -> EXIT."
exit
fi
else
echo reboot >> /root/reboot.try
/sbin/reboot
fi
else
exit
fi
fi
fi
if test $(grep -iE "$DEF_ERROR_READER" $LOGFILE | wc -l) -ge 1;then
logger "Watchdog: Mindestens einer deiner Reader ist nicht erfolgreich gestartet. Versuche Oscam neu zu starten!"
call_clear_log
for i in $(ps | grep $BIN | grep -v /bin/ash | grep -v awk | grep -v sh | grep -v grep | awk '{print $1}'); do
kill -9 $i 1>/dev/null 2>/dev/null
done
usleep
$BIN $OPT
usleep
echo "try" >> /tmp/oscam.try
call_watchdog_init & exit
else
rm /tmp/oscam.try 2>/dev/null
rm /root/reboot.try 2>/dev/null
if test -z $1;then
logger "Watchdog: Im Logfile finde ich nichts auffälliges! Überwachung beginnt nun!"
logger "Watchdog: Gib mal derdigge bescheid, wir müssen da wahrscheinlich was patchen! Danke!"
call_watchdog_shitstorm & exit
elif test $1 = loop;then
call_watchdog_init & exit
fi
fi
}
call_watchdog_deadreader () {
sleep 1
let cws=$cws+1
for i in $(ps | grep ncat | awk '{print $1}'); do
kill -9 $i 1>/dev/null 2>/dev/null
usleep
kill -9 $i 1>/dev/null 2>/dev/null
done
call_clear_log
$BIN $OPT
echo "try" >> /tmp/oscam.try
sleep 5
call_watchdog_check_logfile loop & exit
}
call_watchdog_deadoscam () {
sleep 1
let cws=$cws+1
for i in $(ps | grep ncat | awk '{print $1}'); do
kill -9 $i 1>/dev/null 2>/dev/null
usleep
kill -9 $i 1>/dev/null 2>/dev/null
done
for i in $(ps | grep $BIN | grep -v /bin/ash | grep -v awk | grep -v sh | grep -v grep | awk '{print $1}'); do
kill -9 $i 1>/dev/null 2>/dev/null
done
call_clear_log
$BIN $OPT
echo "try" >> /tmp/oscam.try
sleep 5
call_watchdog_check_logfile loop & exit
}
call_watchdog_shitstorm () {
cws=1
(echo -e "login $MON_USR $MON_PWD";
usleep;
while [ $cws -le 1 ]; do
echo -e "login $MON_USR $MON_PWD";
usleep;
echo -e "log on";
usleep;
echo -e "keepalive";
usleep;
done
echo -e "exit") \
| ncat -u $LOCALHOST $MON_PORT 2>/dev/null \
| while [ $cws -le 1 ]; do
if grep -q -iE "$DEF_ERROR_READER";then
logger "Watchdog: Einer deiner Reader hat sich soeben verabschiedet! Details : cat /tmp/oscam.log.old "
usleep
call_watchdog_deadreader & exit
elif test -z $(grep keepalive_ack);then
logger "Watchdog: Oscam hat sich soeben verabschiedet oder neugestartet vom Benutzer!"
usleep
call_watchdog_deadoscam & exit
fi
done
}