#!/bin/bash
###########################################
#### Ein Universeller OScam Watchdog ####
#### von Sagobal für das DEB ####
#### Verson 0.1 WIP ####
###########################################
#### Benötigte Progamme ####
# curl
# usbreset (falls Hardwarereset aktiv ist)
# bash
# grep
# cut
# oscam
# Ein init-Script für OScam (falls OScam (Re)start aktiv ist)
# dieses init-script muss den Befehl "restart" beherschen!
# pidof
# sudo (falls der Watchdog nicht als root läuft) (angepasste sudoers erforderlich, siehe unten!)
#### INFO ###
# Bitte beachtet, dass dieses Script zwar von mir schon seit einiger Zeit eingesetzt wird, es aber immernoch Fehler enthalten kann.
# Für Eventuelle Schäden, Ausfälle o.ä. übernehme ich keine Haftung!
# Damit dieses Script reibungslos funktionieren kann müssen ein paar vorausetzungen Erfüllt sein:
# - Die oben genannten Programme müssen vorhanden sein
# - Eigene udev Regeln (sollte der Hardware-Reset aktiv sein, da ansonsten Probleme mit der Readerzuordnung auftreten können!)
# - Grundlegende Linux Kenntnisse
# - Wissen wie man Kompiliert (für USBreset)
#
# Dieses Script sollte in der Lage sein belibig viele Reader zu überwachen.
# Bei meinem System braucht es zum Prüfen aller 5 Reader ca. 200ms also erzeugt es kaum CPU Last.
# Bei einem Fehler braucht dieses Script zwar deutlich mehr Zeit, jedoch wird diese Hauptsächlich beim "warten" erzeugt.
# Getestet ist das Script von einem bis zu 5 Readern, da mir einfach die Passenden Reader fehlen mehr zu testen ;)
#### Funktionen dieses Scriptes ####
# Dieses Script prüft im Webinterface des OScam ob alle Reader korrekt funktionieren.
# Dieses Script sollte als root oder als der oscam Benutzer ausgeführt werden.
# Sollte ein Reader auserhalb der Parameter liegen, wird je nach Konfiguration unterschiedlich vorgegangen.
# Es können global und pro Reader folgende Aktionen ausgeführt werden. Es wird außerdem nach dieser Reihenfolge vorgegangen.
# Nach jeder der Aktionen wird geprüft ob der Reader wieder OK ist. Sollte er OK sein, wird nichts weiter unternommen.
# Sollte der Reader nach wie vor nicht OK sein wird die Liste weiter abgearbeitet.
# Außerdem ist dieses Script so gebaut, dass es mit Nagios o.ä. zusammen arbeiten kann.
# Es hat folgende Exit Codes:
# Code 0 = Kein Fehler vorhanden / Fehler konnte behoben werden
# Code 1 = Fehler vorhanden, es wurde jedoch nicht versucht diesen zu beheben, da die passenden Optionen deaktiviert sind.
# Code 2 = Fehler vorhanden, er konnte jedoch nicht behoben werden.
# Code 3 = Konnte keine Verbindung zum OScam aufbauen.
# Bei jedem Code wird im Fehlerfall auch ausgegeben wo der Fehler liegt!
#### Erkennbare Fehler ####
# - OScam Erreichbarkeit
# Es wird geprüft ob OScam erreichbar ist! Aktuell kann unterschieden werden zwischen:
# a) Generell nicht erreichbar
# - bei einer lokalen OScam installation wird unterschieden zwischen OScam ist beendet und Falscher IP/Port Kombination
# - bei einem Remote OScam kann nur festgestellt werden, dass OScam nicht erreichbar ist.
# b) Benutzername/Passwort falsch
# c) Genereller Fehler beim Abruf des Webinterface
# Sollte OScam dann nicht laufen wird OScam auf wunsch selbstständig gestartet.
# !ACHTUNG! Dazu wird jedoch vorrausgesetzt, dass OScam auf dem gleichen Server läuft wie der Watchdog und
# der Watchdog entweder unter dem Benutzer "root" angelegt wurde oder aber entsprechende Einträge in der
# sudoers Datei gesetzt worden sind. (Siehe weiter unten)
#
# - Reader ist nicht vorhanden / nicht gestartet
# Es wird geprüft ob der Reader im Webinterface aktiv und somit in der Statusseite ist.
# Auf Wunsch werden nicht gestartete Reader dann gestartet.
#
# - ReaderStatus überprüfung
# Es wird geprüft ob der Status des Readers "CardOK" ist.
#
# - Entitlement Prüfung
# Es wird geprpüft ob der Reader die richtige Anzahl Entitlements hat.
# Es kann (global) ausgewählt werden ob Reader bei zu wenigen Entitlements neu gestartet werden sollen
# Es kann (global) ausgewählt werden ob Reader bei zu vielen Entitlements neu gestartet werden sollen
#### Ausführbare Aktionen ####
# - Reader Softreset
# Der Reader wird im OScam Webinterface neu gestartet.
# Dieser Vorgang betrifft nur den Reader direkt. Alle anderen Reader werden nicht beinflusst!
#
# - Reader Hardreset
# Es wird ermittelt, welche USB-Verbindung für diesen Reader zuständig ist. Dies geht jedoch NUR, wenn
# die Korrekte Seriennummer des Readers hinterlegt ist.
# Sobald dies erledigt wurde, wird der Reader im Webinterface angehalten und die USB-Verbindung
# dann mit dem Programm "usbreset" vom Betriebssystem komplett neu initialisiert.
# Im Anschluss wird der Reader wieder gestartet und geprüft ob der Fehler weiterhin vorhanden ist.
# Dieser Vorgang betrifft nur den Reader direkt. Alle anderen Reader werden nicht beinflusst!
# !ACHTUNG! Dazu wird jedoch wieder vorrausgesetzt, dass OScam auf dem gleichen Server läuft wie der Watchdog und
# der Watchdog entweder unter dem Benutzer "root" angelegt wurde oder aber entsprechende Einträge in der
# sudoers Datei gesetzt worden sind. (Siehe weiter unten)
#
# - OScam reset
# Sollte nach den vorherigen Aktionen KEIN Erfolg sein, wird über das init Script oscam komplett neu gestartet.
# !ACHTUNG! Dieser Vorgang betrifft alle Reader/User/etc, da das OScam selbst komplett beendet wird!
# !ACHTUNG! Auch hier wird wieder vorrausgesetzt, dass OScam auf dem gleichen Server läuft wie der Watchdog und
# der Watchdog entweder unter dem Benutzer "root" angelegt wurde oder aber entsprechende Einträge in der
# sudoers Datei gesetzt worden sind. (Siehe weiter unten)
#### Geplantes ####
# - Überprüfung auch von ProxyReadern
# - Überprüfung ob zur Zeit nutzer Aktiv sind und Sperren des OScam reset bei Aktiven Benutzen auf Wunsch
#### Allgemeine Konfiguration ####
# Serverdaten
strHostname="127.0.0.1"
strPort="17001"
strUser="admin"
strPass="*******"
strSSL="0"
#Readerdaten
# Erklärung:
# strReader[01]="G09"
# Name des Readers (exakt so wie im Webinterface!!)
#
#
# strReaderSerial[01]="A9WVNLXP"
# Serial der Mouse, leerlassen falls keine Mouse (also strReaderSerial[01]="") da die Zeile vorhanden sein muss!
#
# strReaderRestart[01]="3"
# Restartverhalten des Readers
# 0 = Kein Restart, 1 = Nur Software, 2 = Nur Hardware,
# 3 = Soft und Hardware, 4 = Nur OScam, 5 = Oscam und Software,
# 6 = OScam und Hardware, 7 = Oscam, Hardware und Software
#
# strReaderEnt[01]="7"
# Anzahl der Entitlements des Readers
# Reader 01
strReader[01]="G09"
strReaderSerial[01]="A9WVNLXP"
strReaderRestart[01]="3"
strReaderEnt[01]="7"
# Reader 02
strReader[02]="ORF_ICE"
strReaderSerial[02]="A94JVDTL"
strReaderRestart[02]="3"
strReaderEnt[02]="3"
# Reader 03
strReader[03]="HDPlus_HD02"
strReaderSerial[03]="A9CVZ1PX"
strReaderRestart[03]="3"
strReaderEnt[03]="1"
# Reader 04
strReader[04]="SkyV14"
strReaderSerial[04]="A9SRNHLT"
strReaderRestart[04]="3"
strReaderEnt[04]="12"
# Reader 05
strReader[05]="HuDo"
strReaderSerial[05]="A9UHDBFR"
strReaderRestart[05]="3"
strReaderEnt[05]="1"
# Konfiguration
temp="/root/test/" # Wichtig mit abschließendem "/"
WatchLocalCards="1" # Sollen Lokale Karten überwacht werden?
HighEntReset="1" # Sollen die Reader bei mehr als den Angegebenen Entitilements neu gestartet werden?
LowEntReset="1" # Sollen die Reader bei weniger als den Angegebenen Entitlements neu gestartet werden?
WatchProxy="0" # Sollen Proxys überwacht werden?
LowLocalCardReset="0" # Sollen die Proxys bei zu wenigen Hop1 Karten neu verbunden werden?
LowRemoteCardReset="0" # Sollen die Proxys bei zu wenigen HopX Karten neu verbunden werden?
HighLocalCardReset="0" # Sollen die Proxys bei zu vielen Hop1 Karten neu verbunden werden?
HighRemoteCardReset="0" # Sollen die Proxys bei zu vielen HopX Karten neu verbunden werden?
anzRestart="1" # Anzahl der Restarts die ausgeführt werden sollen (Wirkt sich auf alle Restarts aus!)
debug="0" # Sollen Alle Statusmeldungen ausgegeben werden?
startOScam="0" # Soll versucht werden OScam zu starten, wenn es nicht läuft?
startReader="1" # Soll versucht werden einen Reader/Proxy zu starten, falls dieser nicht Aktiviert ist?
localOScam="1" # Läuft der Watchdog auf dem selben Server wie OScam?
# ACHTUNG!!
# Für den HardRestart und den OScamrestart muss entweder dieses Script als "root" gestartet werden, oder aber ein entsprechender eintrag in der sudoers Datei vorhanden sein!
# z.b. "oscam ALL=NOPASSWD:/root/bin/usbreset,NOPASSWD:/etc/init.d/oscasm"
# Wenn ihr das Script nicht als root laufen lassen wollt und euch nicht mit den sudoers auskennt fragt bitte im Forum oder lasst den Wert "sudoers" auf "0"!!!
# Bei fehlern in den Sudoers kann man die kontrolle über das System verlieren oder sich dieses Script komplett aufhängen!
# Es wird NICHT von dem Script geprüft ob die Sudoers korrekt ist oder die Dateien am richtig Ort sind!
# Es darf auch nur eingesetzt werden, wenn das OScam auf dem gleichen Server läuft wie der Watchdog!
sudoers="0"
# Files
usbreset="/root/bin/usbreset" # Pfad zum USB Restart script
oscaminit="/etc/init.d/oscam" # Pfad zum Init Script von OScam
oscambinary="/bin/oscam" # Pfad zur OScam Binary
####################################
### Programmteil - NICHTS ÄNDERN ###
####################################
# Benötige Variablen
exitcode=0
if [ $strSSL -eq 1 ]; then
URL="https://$strHostname:$strPort"
else
URL="http://$strHostname:$strPort"
fi
if [ $localOScam -eq 0 ]; then
for i in "${!strReader[@]}"; do
if [ ${strReaderRestart[$i]} -gt 3 ]; then
strReaderRestart[$i]=$(( ${strReaderRestart[$i]} - 4 ))
fi
if [ ${strReaderRestart[$i]} -gt 1 ];then
strReaderRestart[$i]=$(( ${strReaderRestart[$i]} - 2 ))
fi
done
startOScam="0"
if [ $debug -eq 1 ]; then
echo "Keine Lokale OScam installation!"
echo "Deaktiviere Hardwarerestart und OScamrestart!"
fi
fi
if [ `whoami` != "root" ] && [ $sodoers -ne "1" ] ; then
for i in "${!strReader[@]}"; do
if [ ${strReaderRestart[$i]} -gt 3 ]; then
strReaderRestart[$i]=$(( ${strReaderRestart[$i]} - 4 ))
fi
if [ ${strReaderRestart[$i]} -gt 1 ];then
strReaderRestart[$i]=$(( ${strReaderRestart[$i]} - 2 ))
fi
done
startOScam="0"
if [ $debug -eq 1 ]; then
echo "sudoers wurde deaktiviert und ich laufe nicht als root!"
echo "Deaktiviere daher Hardwarerestart, OScamrestart und das starten von OScam!"
fi
fi
# Prüfen ob Schreibrechte für die Temp Dateien vorhanden sind.
touch "$temp/status.html" 1>/dev/null 2>/dev/null
touch "$temp/readers.html" 1>/dev/null 2>/dev/null
if [ ! -w "$temp/status.html" ] || [ ! -w "$temp/readers.html" ]; then
echo "Kann nicht in die temporären Dateien schreiben. Bitte Rechte überprüfen!" 1>&2
exit 3
fi
rm $temp/status.html 1>/dev/null 2>/dev/null
rm $temp/readers.html 1>/dev/null 2>/dev/null
# Zu OScam Verbinden
if [ $debug -eq 1 ]; then
echo -n "Verbinde zu URL: $URL... ";
fi
curl --connect-timeout 2 -vu ""$strUser":"$strPass"" --anyauth -o "$temp/status.html" "$URL/status.html" 1>> /dev/null 2>>/dev/null
# Prüfen ob Verbindung erfolgreich
if [ ! -f $temp/status.html ]; then
echo "Verbindung zu OScam nicht möglich!" 1>&2
if [ $localOScam -eq 1 ]; then
if [ "$(pidof $oscambinary)" == "" ]; then
echo "OScam läuft scheinbar nicht!" 1>&2
if [ $startOScam -eq 1 ]; then
restarts=0
while [ ! -f $temp/status.html ] && [ $restarts -lt $anzRestart ]; do
restarts=$(( $restarts + 1 ))
echo "Versuche OScam zu starten!" 1>&2
echo -n "Versuch $restarts von $anzRestart";
$oscaminit restart 1>> /dev/null 2>> /dev/null
curl --connect-timeout 2 -vu ""$strUser":"$strPass"" --anyauth -o "$temp/status.html" "$URL/status.html" 1>> /dev/null 2>> /dev/null
sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2;
done
if [ ! -f $temp/status.html ]; then
echo " Fehler!" 1>&2
echo "Konnte weiterhin keine Verbindung aufbauen!"
exit 3
else
echo " OK!"
fi
else
echo "OScam start ist deaktiviert!" 1>&2
exit 3
fi
else
echo "OScam IP/Port scheinbar fehlerhaft!" 1>&2
fi
else
echo "Bitte prüfen ob IP & Port stimmen!" 1>&2
echo "Eventuell läuft OScam auch nicht," 1>&2
echo "oder eine Firewall verhindert die Verbindung!" 1>&2
exit 3
fi
fi
# Prüfen ob es Probleme mit dem Passwort gab oder andere Übertragungsprobleme
if [ $(cat $temp/status.html | wc -l) -lt 2 ]; then
echo "ERROR!" 1>&2
if [ "$(cat $temp/status.html | grep "Access denied.")" != "" ]; then
echo "Benutzername oder Passwort falsch!" 1>&2
else
echo "Die Statusdatei hat weniger als 2 Zeilen." 1>&2
echo "Dies deutet auf einen Fehler im Verbindungsaufbau hin!" 1>&2
echo "Fehlermeldung: " 1>&2
echo "$(cat $temp/status.html)" 1>&2
fi
exit 3
fi
# Verbindung erfolgreich hergestellt!
if [ $debug -eq 1 ]; then
echo "OK"
fi
# Lokale Reader Prüfen
if [ $WatchLocalCards -eq 1 ]; then
if [ $debug -eq 1 ]; then
echo "Überprüfe lokale Reader..."
fi
for i in "${!strReader[@]}"; do
a=$(grep '<BR><A HREF="entitlements.html?label='${strReader[$i]} "$temp"/status.html)
dorestart="0"
readerstart="1"
restarts="0"
while [ $restarts -lt $anzRestart ] && [ "$a" == "" ] && [ $startReader -eq 1 ]; do
if [ $restarts -lt 1 ]; then
echo "" 1>&2
echo "Reader ${strReader[$i]} wurde nicht gefunden!" 1>&2
fi
restarts=$(( $restarts + 1 ))
echo -n "Versuch $restarts von $anzRestart den Reader zu starten" 1>&2
curl --connect-timeout 2 -vu ""$strUser":"$strPass"" --anyauth -o "$temp/readers.html" "$URL/readers.html?label=${strReader[$i]}&action=enable" 1>> /dev/null 2>> /dev/null
sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo "." 1>&2;
curl --connect-timeout 2 -vu ""$strUser":"$strPass"" --anyauth -o "$temp/status.html" "$URL/status.html" 1>> /dev/null 2>> /dev/null
a=$(grep '<BR><A HREF="entitlements.html?label='${strReader[$i]} "$temp"/status.html)
if [ "$a" != "" ]; then
echo "Reader wurde erfolgreich gestartet!" 1>&2
fi
done
if [ "$a" == "" ] && [ $startReader -eq 1 ]; then
echo "" 1>&2
echo "Reader ${strReader[$i]} konnte nicht gestartet werden!" 1>&2
if [ $exitcode -lt 2 ]; then
exitcode="2"
fi
elif [ "$a" == "" ] && [ $startReader -ne 1 ]; then
echo "" 1>&2
echo "Reader ${strReader[$i]} wurde nicht gestartet, StartReader ist deaktiviert!" 1>&2
if [ $exitcode -lt 2 ]; then
exitcode="1"
fi
else
# Reader ist schonmal vorhanden...
if [ $debug -eq 1 ]; then
echo ""
echo "Reader ${strReader[$i]} wurde gefunden!"
fi
status=$(echo $a | cut -d ">" -f 2 | cut -d "<" -f 1)
ent=$(echo $a | cut -d "(" -f 2 | cut -d " " -f 1)
if [ "$ent" == "" ] || [ "$ent" == "no" ] ; then
ent="0"
statusEnt="0"
elif [ $ent -eq "${strReaderEnt[$i]}" ]; then
statusEnt="1";
elif [ $ent -gt "${strReaderEnt[$i]}" ]; then
statusEnt="2"
else
statusEnt="0"
fi
if [ $debug -eq 1 ]; then
echo "Status: $status"
echo "Entitlements: $ent von ${strReaderEnt[$i]}"
echo -n "Status Entitlements: "
if [ $statusEnt -eq 1 ]; then
echo "OK"
elif [ $statusEnt -eq 0 ]; then
echo "LOW!"
else
echo "HIGH!"
fi
fi
# Es wurden Fehler gefunden...
if [ $statusEnt -ne 1 ] || [ $status != "CARDOK" ]; then
echo "In dem Reader ${strReader[$i]} wurden Fehler gefunden!" 1>&2
if [ $status != "CARDOK" ]; then
echo "Der Kartenstatus ist $status!" 1>&2
dorestart=1
fi
if [ $statusEnt -eq 0 ]; then
echo "Es gibt zu wenige Entitlements ($ent statt ${strReaderEnt[$i]})" 1>&2
if [ $LowEntReset -eq 1 ]; then
dorestart=1
else
echo "Neustart für diesen Grund deaktiviert!" 1>&2
if [ $exitcode -lt 1 ]; then
exitcode="1"
fi
fi
elif [ $statusEnt -eq 2 ]; then
echo "Es gibt zu viele Entitlements!" 1>&2
if [ $HighEntReset -eq 1 ]; then
dorestart=1
else
echo "Neustart für diesen Grund deaktiviert!" 1>&2
if [ $exitcode -lt 1 ]; then
exitcode="1"
fi
fi
fi
fi
# Es wird versucht die Fehler zu beheben
# Restart ist genrell deaktiviert!
if [ ${strReaderRestart[$i]} -eq 0 ] && [ $dorestart -eq 1 ] ; then
echo "Restart ist für diesen Reader genrell deaktiviert!" 1>&2
if [ $exitcode -lt 1 ]; then
exitcode="1"
fi
dorestart="0"
fi
# Ansonsten Erst mit Software Restart
restarts=0
if [ ${strReaderRestart[$i]} -ne 0 ] && [ ${strReaderRestart[$i]} -ne 2 ] && [ ${strReaderRestart[$i]} -ne 4 ] && [ ${strReaderRestart[$i]} -ne 6 ] && [ $dorestart -eq 1 ] ; then
while [ $dorestart -eq 1 ] && [ $restarts -lt $anzRestart ]; do
restarts=$(( $restarts + 1 ))
echo -n "Versuch $restarts von $anzRestart den Reader in Software neu zu Starten" 1>&2
curl --connect-timeout 2 -vu ""$strUser":"$strPass"" --anyauth -o "$temp/status.html" "$URL/status.html?action=restart&label=${strReader[$i]}" 1>> /dev/null 2>> /dev/null
sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo "." 1>&2;
curl --connect-timeout 2 -vu ""$strUser":"$strPass"" --anyauth -o "$temp/status.html" "$URL/status.html" 1>> /dev/null 2>> /dev/null
a=$(grep '<BR><A HREF="entitlements.html?label='${strReader[$i]} "$temp"/status.html)
status=$(echo $a | cut -d ">" -f 2 | cut -d "<" -f 1)
ent=$(echo $a | cut -d "(" -f 2 | cut -d " " -f 1)
if [ "$ent" == "" ] || [ "$ent" == "no" ] ; then
ent="0"
statusEnt="0"
elif [ $ent -eq "${strReaderEnt[$i]}" ]; then
statusEnt="1";
elif [ $ent -gt "${strReaderEnt[$i]}" ]; then
statusEnt="2"
else
statusEnt="0"
fi
if [ $status != "CARDOK" ]; then
dorestart="1"
echo "ERROR!" 1>&2
elif [ $statusEnt -eq 0 ] && [ $LowEntReset -eq 1 ]; then
dorestart="1"
echo "ERROR!" 1>&2
elif [ $statusEnt -eq 2 ] && [ $HighEntReset -eq 1 ]; then
dorestart="1"
echo "ERROR!" 1>&2
else
dorestart="0"
echo "OK!" 1>&2
fi
done
if [ $dorestart -eq 1 ]; then
echo "Fehler konnte nicht behoben werden!" 1>&2
fi
# Softwareneustart ist für diesen Reader deaktiviert!
elif [ ${strReaderRestart[$i]} -ne 0 ] && [ $dorestart -eq 1 ]; then
echo "Softwarerestart ist für diesen Reader deaktiviert!" 1>&2
if [ $exitcode -lt 1 ]; then
exitcode="1"
fi
fi
# Dann in Hardware...
restarts=0
device=""
if [ "${strReaderSerial[$i]}" == "" ]; then
if [ $debug -eq 1 ]; then
echo "Keine Seriennummer vorhanden!" 1>&2
echo "Hardwarereset wird deaktiviert!" 1>&2
fi
strReaderRestart[$i]=$(( ${strReaderRestart[$i]} - 2 ))
fi
if [ ${strReaderRestart[$i]} -ne 0 ] && [ ${strReaderRestart[$i]} -ne 1 ] && [ ${strReaderRestart[$i]} -ne 4 ] && [ ${strReaderRestart[$i]} -ne 5 ] && [ $dorestart -eq 1 ] ; then
while [ $dorestart -eq 1 ] && [ $restarts -lt $anzRestart ]; do
restarts=$(( $restarts + 1 ))
echo -n "Versuch $restarts von $anzRestart den Reader in Hardware neu zu starten" 1>&2
if [ "$device" == "" ]; then
if [ $debug -eq 1 ]; then
echo "" 1>&2
echo "Suche Reader..." 1>&2
fi
for bus in $(lsusb -d 0403:6001 | cut -d ":" -f 1 | cut -d " " -f 2,4 | tr ' ' '/'); do
bus="/dev/bus/usb/$bus"
serial=`udevadm info -a -p $(udevadm info -q path -n $bus) | grep ATTR{serial} | cut -d "\"" -f 2`
if [ "$serial" == "${strReaderSerial[$i]}" ]; then
device=$bus;
fi
done
if [ $debug -eq 1 ] && [ $device != "" ]; then
echo -n "USB-Device Gefunden ($device)" 1>&2
elif [ $reader == "" ]; then
echo "USB-Device konnte nicht gefunden werden!" 1>&2
fi
fi
if [ $device != "" ]; then
if [ $debug -eq 1 ]; then
echo "..." 1>&2
echo -n "Reader wird angehalten" 1>&2
fi
curl --connect-timeout 2 -vu ""$strUser":"$strPass"" --anyauth -o "$temp/readers.html" "$URL/readers.html?label=${strReader[$i]}&action=disable" 1>> /dev/null 2>> /dev/null
sleep 2; echo -n "." 1>&2; sleep 2; echo -n "." 1>&2; sleep 2; echo -n "." 1>&2; sleep 2; echo -n "." 1>&2; sleep 2; echo -n "." 1>&2;
if [ `whoami` == "root" ]; then
if [ $debug -eq 1 ]; then
echo "" 1>&2
echo "USB-Reset wird durchgefüht (bin root)" 1>&2
$usbreset $device
else
$usbreset $device 1>> /dev/null 2>> /dev/null
fi
else
if [ $debug -eq 1 ]; then
echo "" 1>&2
echo "USB-Reset wird durchgeführt (sudo)" 1>&2
sudo $usbreset $device
else
sudo $usbreset $device 1>> /dev/null 2>> /dev/null
fi
fi
if [ $debug -eq 1 ]; then
echo -n "Starte den Reader wieder und prüfe ob der Fehler behoben wurde" 1>&2
fi
curl --connect-timeout 2 -vu ""$strUser":"$strPass"" --anyauth -o "$temp/readers.html" "$URL/readers.html?label=${strReader[$i]}&action=enable" 1>> /dev/null 2>> /dev/null
sleep 2; echo -n "." 1>&2; sleep 2; echo -n "." 1>&2; sleep 2; echo -n "." 1>&2; sleep 2; echo -n "." 1>&2; sleep 2; echo -n "." 1>&2;
curl --connect-timeout 2 -vu ""$strUser":"$strPass"" --anyauth -o "$temp/status.html" "$URL/status.html" 1>> /dev/null 2>> /dev/null
a=$(grep '<BR><A HREF="entitlements.html?label='${strReader[$i]} "$temp"/status.html)
status=$(echo $a | cut -d ">" -f 2 | cut -d "<" -f 1)
ent=$(echo $a | cut -d "(" -f 2 | cut -d " " -f 1)
if [ "$ent" == "" ] || [ "$ent" == "no" ] ; then
statusEnt="0"
ent="0"
elif [ $ent -gt "${strReaderEnt[$i]}" ]; then
statusEnt="2"
elif [ $ent -eq "${strReaderEnt[$i]}" ]; then
statusEnt="1"
else
statusEnt="0"
fi
if [ $status != "CARDOK" ]; then
dorestart="1"
echo "ERROR!" 1>&2
elif [ $statusEnt -eq 0 ] && [ $LowEntReset -eq 1 ]; then
dorestart="1"
echo "ERROR!" 1>&2
elif [ $statusEnt -eq 2 ] && [ $HighEntReset -eq 1 ]; then
dorestart="1"
echo "ERROR!" 1>&2
else
dorestart="0"
echo "OK!" 1>&2
fi
fi
done
if [ $dorestart -eq 1 ]; then
echo "Fehler konnte nicht behoben werden!" 1>&2
fi
elif [ ${strReaderRestart[$i]} -ne 0 ] && [ $dorestart -eq 1 ]; then
echo "Hardwarerestart ist für diesen Reader deaktiviert!" 1>&2
if [ $exitcode -lt 1 ]; then
exitcode="1"
fi
fi
# Und in letzter Instanz mit einem Neustart des Kompletten OScam
if [ ${strReaderRestart[$i]} -ne 0 ] && [ ${strReaderRestart[$i]} -ne 1 ] && [ ${strReaderRestart[$i]} -ne 2 ] && [ ${strReaderRestart[$i]} -ne 3 ] && [ $dorestart -eq 1 ] ; then
while [ $dorestart -eq 1 ] && [ $restarts -lt $anzRestart ]; do
restarts=$(( $restarts + 1 ))
echo -n "Versuch $restarts von $anzRestart OScam komplett neu zu starten" 1>&2
if [ `whoami` == "root" ]; then
if [ $debug -eq 1 ]; then
echo "" 1>&2
echo "OScam restart wird durchgeführt (root)" 1>&2
$oscaminit restart
else
$oscaminit restart 1>> /dev/null 2>> /dev/null
fi
else
if [ $debug -eq 1 ]; then
echo "" 1>&2
echo "OScam restart wird durchgeführt (sudo)" 1>&2
$oscaminit restart
else
sudo $oscaminit restart 1>> /dev/null 2>> /dev/null
fi
fi
if [ $debug -eq 1 ]; then
echo "Prüfe ob der Fehler behoben ist" 1>&2
fi
sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo -n "." 1>&2; sleep 1; echo "." 1>&2;
curl --connect-timeout 2 -vu ""$strUser":"$strPass"" --anyauth -o "$temp/status.html" "$URL/status.html" 1>> /dev/null 2>> /dev/null
a=$(grep '<BR><A HREF="entitlements.html?label='${strReader[$i]} "$temp"/status.html)
status=$(echo $a | cut -d ">" -f 2 | cut -d "<" -f 1)
ent=$(echo $a | cut -d "(" -f 2 | cut -d " " -f 1)
if [ "$ent" == "" ] || [ "$ent" == "no" ] ; then
statusEnt="0"
ent="0"
elif [ $ent -gt "${strReaderEnt[$i]}" ]; then
statusEnt="2"
elif [ $ent -eq "${strReaderEnt[$i]}" ]; then
statusEnt="1"
else
statusEnt="0"
fi
if [ $status != "CARDOK" ]; then
dorestart="1"
echo "ERROR!" 1>&2
elif [ $statusEnt -eq 0 ] && [ $LowEntReset -eq 1 ]; then
dorestart="1"
echo "ERROR!" 1>&2
elif [ $statusEnt -eq 2 ] && [ $HighEntReset -eq 1 ]; then
dorestart="1"
echo "ERROR!" 1>&2
else
dorestart="0"
echo "OK!" 1>&2
fi
done
if [ $dorestart -eq 1 ]; then
echo "Fehler konnte nicht behoben werden!" 1>&2
fi
elif [ ${strReaderRestart[$i]} -ne 0 ] && [ $dorestart -eq 1 ]; then
echo "OScamrestart ist für diesen Reader deaktiviert!" 1>&2
if [ $exitcode -lt 1 ]; then
exitcode="1"
fi
fi
fi
if [ $dorestart -eq 1 ] && [ $exitcode -lt 2 ] && [ ${strReaderRestart[$i]} -ne 0 ]; then
exitcode="2"
fi
done
else
if [ $debug -eq 1 ]; then
echo "Überprüfung lokaler Reader deaktiviert!"
fi
fi
exit $exitcode