Nachtschaltung für einzelne VoIP-Accounts!?

So, habe mir mal was ganz einfaches zusammen gebastelt,
hätte aber gerne, dass mal jemand meine Fehler korrigiert,
bevor ich mir wegen irgend einem blöden Syntax-, Logik- oder sonstigen Fehler die Box still lege. ;)

Die await()-Funktion habe ich komplett von buehrmann übernommen. Danke!

Code:
sleep 60; await() { 
local day=$((60*60*24))
sleep $(( ($(date -d $(date +%m%d$1%Y) +%s) - $(date +%s) + $day) % $day )) 
} 
(await 0400; reboot) &

# ausser Samstag und Sonntag 
if [ date +%w ne (0,6) ]; then 

# ua1 um 8:00 Uhr registrieren
   (await 0800; 
      echo "voipcfg { ua1 { enabled = yes; } }" | allcfgconv -C voip -M -; 
      voipcfgchanged
   ) &

# ua1 um 20:00 Uhr abmelden
   (await 2000; 
      echo "voipcfg { ua1 { enabled = no; } }" | allcfgconv -C voip -M -; 
      voipcfgchanged
   ) &
fi

Mir ist klar, dass ich damit um 8:00 und 20:00 Uhr leider jedes VoIP-Gespräch unterbreche!
 
RudatNet schrieb:
hätte aber gerne, dass mal jemand meine Fehler korrigiert,
bevor ich mir wegen irgend einem blöden Syntax-, Logik- oder sonstigen Fehler die Box still lege. ;)
Ich würde mir in dem Fall die kritischen Teile (z.B. reboot) durch etwas anderes ersetzen und dann einfach mal ausprobieren; ein fehlerhaftes Shellskript kann ohne gefährliche Befehle ja nichts anrichten.

# ausser Samstag und Sonntag
if [ date +%w ne (0,6) ]; then
Das wird so nicht funktionieren, weil "date" nicht aufgerufen wird, sondern ein Argument von "[" ist, weil der Integervergleich "-ne" und nicht "ne" heißt und außerdem nicht mit einer Menge oder Liste vergleichen kann. Ich hätte (ungetestet) folgende Alternativen anzubieten:
Code:
dow=$(date +%w)
if [ $dow -ne 0 -a $dow -ne 6 ]; then ...

if [ $(date +%u) -lt 6 ]; then ...

case $(date +%a) in
  Mon|Tue|Wed|Thu|Fri) ... ;;
  Sat|Sun) ... ;;
esac

Viele Grüße.
 
Ok, es funktioniert im Grunde!

Code:
sleep 60; await() {
local day=$((60*60*24))
sleep $(( ($(date -d $(date +%m%d$1%Y) +%s) - $(date +%s) + $day) % $day ))
}
(await 0400; reboot) &

# ausser samstag und Sonntag
dow=$(date +%w)
if [ $dow -ne 0 -a $dow -ne 6 ]; then

# um 8:00 Uhr registrieren
   (await 0800;
         echo "voipcfg { ua7 { enabled = yes; } }" | allcfgconv -C voip -M -;
         voipcfgchanged;
   ) &

# um 20:00 Uhr abmelden
   (await 2000;
         echo "voipcfg { ua7 { enabled = no; } }" | allcfgconv -C voip -M -;
         voipcfgchanged;
   ) &
fi

Nur: Wie kann ich das für jeden Tag so programmieren,
dass nicht immer ein "reboot" ausgeführt werden muß?

Ohne "reboot" funktioniert das ganze ja genau einmal!?
 
RudatNet schrieb:
Nur: Wie kann ich das für jeden Tag so programmieren,
dass nicht immer ein "reboot" ausgeführt werden muß?
Lass doch einfach die 7- und 20-Uhr-Aufgaben sich gegenseitig einplanen (die ganze Woche lang) und prüf dann in den Aufgaben, ob es ein Werktag ist. Skizziert etwa so:
Code:
morgens() {
  (await 2000; abends) &
  if werktag; then ...; fi
}
abends() {
  (await 0700; morgens) &
  if werktag; then ...; fi
}
abends # (oder morgens) um in den Zyklus reinzukommen
 
He he, ich wußte ja gleich, dass es auch einfach geht! ;)

Besten Dank! Komme der Sache immer näher! :)

Bis später
 
So, es funktioniert! Danke euch sehr! :D

Hier wird der Account *127# = ua7 = sip6 gesteuert!
Code:
# Nachtschaltung für einen VoIP-Account
sleep 120; await() {
local day=$((60*60*24))
sleep $(( ($(date -d $(date +%m%d$1%Y) +%s) - $(date +%s) + $day) % $day ))
}
doit() {
case $(date +%a) in
  Mon|Tue|Wed|Thu|Fri)
export REQUEST_METHOD="POST"
export REMOTE_ADDR="127.0.0.1"
export CONTENT_TYPE="application/x-www-form-urlencoded"
POST_DATA="sip:settings/sip$1/activated=$2"
export CONTENT_LENGTH=${#POST_DATA}
echo -n "$POST_DATA" | /usr/www/html/cgi-bin/webcm > /dev/null
;;
esac
}
morgens() {
  (await 2000; abends) &
  doit 6 1
}
abends() {
  (await 0800; morgens) &
  doit 6 0
}
abends; # Aktion beim ersten Start

Habe doch die webcm-Methode von fritzchen gewählt,
weil so der VoIP-Account normal über das Webinterface bedienbar bleibt.
Bei dem Vorschlag von buehmann mit 'allcfgconv' gibt es Probleme,
wenn ein anderer Account manuell geändert wird!

Wichtig: Um 8:00 Uhr und um 20:00 Uhr werden radikal alle VoIP-Verbindungen unterbrochen!
(Das konnte ich mittlerweile auch unterbinden! :) Siehe neues Script weiter unten.)
 
RudatNet schrieb:
Bei dem Vorschlag von buehmann mit 'allcfgconv' gibt es Probleme,
wenn ein anderer Account manuell geändert wird!
Ah, gut zu wissen, dass es da Nebenwirkungen gibt. Aus Interesse: Was genau waren denn die Probleme?
 
Bei deinem Vorschlag bleibt das Aktivierung-Häkchen unter Internet-Telefonie IMMER gesetzt.
Und zwar auch dann, wenn "enabled=no;" in der voip.cfg aktiv ist!
Einzig in der Übersicht steht statt "registriert" dann "deaktiviert".

Wenn ich also jetzt irgendeinen anderen Account per WI de-/aktiviere,
dann wird der eigentlich deaktivierte Account automatisch wieder aktiviert,
weil eben das gesetzte Häkchen ausschlaggebend ist!

Das passier bei der webcm-Methode natürlich nicht,
weil da auch das Häkchen gesetzt und auch wieder entfernt wird!

Dadurch kann man auch egal in welcher Phase man gerade ist
den Account beliebig zwischendurch aktivieren und deaktivieren,
ohne die programmierte Nachtschaltung irgendwie zu beeinflussen.

Bei deiner Methode wäre das Häkchen wie schon erwähnt immer gesetzt,
was mir etwas zu verwirrend ist, und eben zu den o.a. Problemen führen kann.

Trotzdem vielen Dank, dass ich einiges dazu lernen konnte! :)
 
RudatNet schrieb:
Bei deinem Vorschlag bleibt das Aktivierung-Häkchen unter Internet-Telefonie IMMER gesetzt.
Ah, dann scheint wohl die Konfiguration irgendwo gecachet zu werden; so wie es aussieht, vom ctlmgr (ist ja auch kein Problem, er kann ja davon ausgehen, dass er als einziger auf die Dateien zugreift; wenn nur wir da nicht wären ;-)). Wenn man den ctlmgr neustartet, passt auch das Webinterface wieder zur Konfiguration in der Datei. Wieder was über die Box gelernt. :) Danke.
 
erik schrieb:
Ich finde die Idee weniger gut, denn bei jeder Veränderung der voip.cfg trennt die Box doch alle Verbindungen und registriert die Provider neu. Damit wird die Telefonie ja noch unzuverlässiger, als sie ohnehin schon ist (im Vergleich zum Festnetz). Oder irre ich da? Wäre ja schön, aber ich glaub nicht dran.

Ok, habe es mittlerweile mit tatkräftiger Unterstützung von buehmann und sascha geschafft,
dass die FBF keine laufende Verbindung mehr trennt.

Wenn sie jetzt ein laufendes Gespräch findet,
wartet sie und prüft alle 20sek erneut auf bestehende VoIP-Verbindungen.

Erst wenn wirklich alle Accounts nicht "verbunden" sind
de-/aktiviert sie den gewünschten Account!

Hier der komplette Code:
Code:
sleep 120;
###############################################################
# Start- und End-Zeit der Nachtschaltung(!):                  #
von=2000  # Format: 'hhmm'  (Format wird nicht geprüft!)      #
bis=0800  # Format: 'hhmm'  (Format wird nicht geprüft!)      #
sip=6     # zu schaltender Account (*121# entspricht Wert: 0) #
###############################################################
await() {
  local day=$((60*60*24))
  sleep $(( ($(date -d $(date +%m%d$1%Y) +%s) - $(date +%s) + $day) % $day ))
}
TestIt () {
case $(date +%a) in
  Mon|Tue|Wed|Thu|Fri)
    SipS=`ParseWebsite` # Daten einlesen
    SipState $SipS      # Ist irgend ein Sip-Acount verbunden?
    if [ $verbunden -eq 1 ]
      then
      (sleep 20; TestIt $1 $2) &
    else
      DoIt $1 $2
    fi
  ;;
esac
}
ParseWebsite() {
  export REQUEST_METHOD="GET"
  export REMOTE_ADDR="127.0.0.1"
  export QUERY_STRING="getpage=../html/de/menus/menu2.html&var:lang=de&var:menu=home&var:pagename=home"
  cd /usr/www/html/cgi-bin
  ./webcm |
  sed -n 's/^.*sip:status.sip[0-9].connect.*value="\([0-9]\).*/\1/p'
}
SipState() {
  local i
  verbunden=0
    for i in $*
  do
    if [ $i -eq 3 ]
    then
      verbunden=1
    fi
  done
}
DoIt() {
  export REQUEST_METHOD="POST"
  export REMOTE_ADDR="127.0.0.1"
  export CONTENT_TYPE="application/x-www-form-urlencoded"
  POST_DATA="sip:settings/sip$1/activated=$2"
  export CONTENT_LENGTH=${#POST_DATA}
  echo -n "$POST_DATA" | /usr/www/html/cgi-bin/webcm > /dev/null
}
#################################################
# Hauptschleife. Einstieg automatisch über init()
NS_start() {
  (await $bis; NS_ende) &
  TestIt $sip 0  
}
NS_ende() {
  (await $von; NS_start) &
  TestIt $sip 1 
}
#################################################
# autom. richtigen Einstieg finden
init() {
  local now=$(date +%H%M)
  if [ $now -ge $2 ] && [ $now -lt $1 ]
  then
    NS_ende 
  else
    NS_start
  fi
}
#################################################
init $von $bis  # Dauerschleife initialisieren

Edit (28.11.05):
- Erweitert um Prüfroutine für automatischen richtigen Einstieg
(Ist schon wichtig, wenn die FBF mal neu gestartet werden muß.)
 
Hi

Ich hab da mal ne Frage ich bin in linux da nicht so bewandert, aber wo muss denn der code hin? in die debug.cfg oder vom mod in die crontab ??

MFG Matthias
 
ok danke werde es dann mal ausprobieren, gibt es nw möglichkeit das ganze nich zu tippen sondern irgendwie anderes das rein zu bekommen, als ich etwas bei vi über telnet das letzte mal einfügen wollte is die box abgestürzt.

Edit: hab ja nen ftp auf der box, ordner hab ich auch gefunden

mfg Matthias
 
Zuletzt bearbeitet:
Kann es sein das die Box extrem lange zum starten brauch und irgendwie auch langsamer ist?
Das avm Webmenu is gleich da aber der ds mod bzw das Webinterface brauch ewig lange, und auch die ganzen mod Dienste.

Und kann ich einfach vorher in der debug noch was reinschreiben oder wird das dann auch immer mit ausgeführt?

MFG Matthias
 
3dfxatwork schrieb:
Kann es sein das die Box extrem lange zum starten brauch und irgendwie auch langsamer ist?
Das avm Webmenu is gleich da aber der ds mod bzw das Webinterface brauch ewig lange, und auch die ganzen mod Dienste.
Ja.
Das bewirkt der erste Befehl "sleep 120".
Der wartet beim jedem Neustart 120 Sekunden bevor es weitergeht, um auch sicher zu gehen, dass die FBF inzwischen die richtige Uhrzeit hat.
Ohne richtige Uhrzeit nützt das ganze nämlich gar nichts!

Langsamer dürfte die Box aber dadurch nicht sein!?

Und kann ich einfach vorher in der debug noch was reinschreiben oder wird das dann auch immer mit ausgeführt?

MFG Matthias
Alles was vorher in der debug.cfg steht, wird auch ohne Verzögerung sofort abgearbeitet.
 
Danke für die Hilfe, vielleicht hat sie ja noch gestartet und war deshalb so langsam, werd mal sehen ob es funktioniert.

mfg matthias
 
ich hab es mal ausprobiert, jedoch funktioniert es bei mir nicht, habe für sip = 0 eingetraten (meine nummer is *121#) start und endzeit richtig eingetragen, aber der Account versucht sich immer zu registriren, kann das mit dem webinterface passwort zu tun haben?
Wenn ja könnte ich das da irgendwo mit übergeben?

mfg matthias
 
kann das mit dem webinterface passwort zu tun haben?
Kannst du ja leicht prüfen, indem du das Passwort mal testweise deaktivierst!

Wenn es daran liegen sollte,
gibt es imho hier irgendwo eine Lösung dazu!?
 
ok es liegt am passwort, mal sehen ob ich im forum was finde

mfg matthias
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.