Existens eines Namens in sip.conf testen?

allesOK

Mitglied
Mitglied seit
24 Mai 2004
Beiträge
732
Punkte für Reaktionen
0
Punkte
0
Hallo!

Gibt es die Moeglichkeit, die Existens eines Names in der sip.conf zu testen?

Also wenn ich von extern deine Variable SIPPROVIDER gesetzt bekomme, will ich bevor ich Dial(SIP/${EXTEN}@${SIPPROVIDER},60,Tt) wissen, ob es diesen Provider auch in sip.conf gibt. Ansonsten sollte irgendwie eine Fehlermeldung kommen (GotoIf).

Eric
 
Keiner eine Idee?
 
allesOK schrieb:
Keiner eine Idee?

Leider nein - aber wäre es nicht auch viel interessanter, zu wissen, ob der Provider "connected" ist? Ansonsten könnte man dein Problem relativ leicht mit einem Script (AGI) lösen.

Code:
#!/bin/bash

# code komplett ungetestet ;-)

tmp=`cat /etc/asterisk/sip.conf | grep $SIPPROVIDER | wc -l | sed "s/ //g"`

if [ $tmp -gt 0 ]
then
  echo "provider $SIPPROVIDER existiert"
fi

Gruß,
Robert/WrMulf
 
Oh ja, danke, da haette man auch selbst drauf kommen koennen. Wobei man wahrscheinlich eher noch nach 'register'/$SIPPROVIDER und nochmal nach '[$SIPPROVIDER]' sucht. Also, nur wenn beides gefunden wird. Ob er connected ist sollte man mit Dialstatus oder durch das CLI herausbekommen.

Danke!

btw. wie setzt man im bash-agi-skript dialplan-variablen?
 
allesOK schrieb:
Oh ja, danke, da haette man auch selbst drauf kommen koennen. Wobei man wahrscheinlich eher noch nach 'register'/$SIPPROVIDER und nochmal nach '[$SIPPROVIDER]' sucht. Also, nur wenn beides gefunden wird. Ob er connected ist sollte man mit Dialstatus oder durch das CLI herausbekommen.

Danke!

btw. wie setzt man im bash-agi-skript dialplan-variablen?

Wenn du nur rauswählen willst, spielt das register keine Rolle (es sei denn, du nutzt Sipgate). Ich habe so gut wie keine Erfahrung mit Agi-Scripten, wenn ich es aber richtig verstanden habe, liest Asterisk die Ausgabe von STDOUT. Alles, was du innerhalb des scripts mit "echo" ausgibst, würde Asterisk interpretieren, also auch evtl. dialplan-variablen. voip-info.org scheint im Moment auch down zu sein, daher kann ich nicht weiter recherchieren.

Gruß,
Robert/WrMulf
 
Bekommt man im Dialplan denn heraus, ob ein Provider connected ist?

Rajo???

Eric
 
allesOK schrieb:
Bekommt man im Dialplan denn heraus, ob ein Provider connected ist?
Du könntest versuchen, zu wählen "Dial()" und anschließend den DIALSTATUS auf bestimmte Werte überprüfen und ggf. entsprechende Fallbacks einbauen.

Das ist in meinen Augen sicherer, als auf "sip show peers" oder "sip show registry" zu überprüfen.
 
Ja magst recht haben. Ich habe momentan eine Loesung, die auf sip show peer baut:

Code:
#!/usr/bin/php -q
<?php

// argv[1] contains sip.conf 
// argv[2] contains sip-peer

if ($argc != 3) {
    execute_agi("VERBOSE \"Wrong number of arguments\" 0"); 
    exit;
}

$output = "no";

$filename = $argv[1];
$sippeer = $argv[2];

$stream = fopen($filename,'r');

if ($stream) {
    while ($stream && $line = fgets($stream)) {
        if (preg_match("/\[$sippeer\]/", $line, $regs)) {
            exec("asterisk -rx \"sip show peer $sippeer\"", $status);
            for ($i = 0; $i < count($status); $i++) {
		if (preg_match("/Status/",$status[$i])) {
		    if (preg_match("/OK/",$status[$i])) {
                        $output = "yes";
		    }
                    break;
		}
	    }
        }
    }
    
    fclose($stream);
}

execute_agi("SET VARIABLE SIPOK $output 1");

function execute_agi( $command )
{
    $stdin = STDIN;
    $stdout = STDOUT;
    $stdlog = STDERR;
    $parm_debug_on = false;
    
    fputs( $stdout, $command . "\n" );
    fflush( $stdout );
    if ($parm_debug_on)
        fputs( $stdlog, $command . "\n" );
    
    $resp = fgets( $stdin, 4096 );
    
    if ($parm_debug_on)
        fputs( $stdlog, $resp );
    
    if ( preg_match("/^([0-9]{1,3}) (.*)/", $resp, $matches) ) 
    {
        if (preg_match('/result=([-0-9a-zA-Z]*)(.*)/', $matches[2], $match)) 
        {
            $arr['code'] = $matches[1];
            $arr['result'] = $match[1];
            if (isset($match[3]) && $match[3])
                $arr['data'] = $match[3];
            return $arr;
        } 
        else 
        {
            if ($parm_debug_on)
                fputs( $stdlog, "Couldn't figure out returned string, Returning code=$matches[1] result=0\n" );
            $arr['code'] = $matches[1];
            $arr['result'] = 0;
            return $arr;
        }
    } 
    else 
    {
        if ($parm_debug_on)
            fputs( $stdlog, "Could not process string, Returning -1\n" );
        $arr['code'] = -1;
        $arr['result'] = -1;
        return $arr;
    }
} 
?>

${SIPOK} sagt dir danmn "yes" wenn der provider existiert und 'connected' ist.
 
allesOK schrieb:
Ich habe momentan eine Loesung, die auf sip show peer baut
Soweit ich weiß sagt ein "sip peer connected" im Falle von Sipgate gar nichts aus, solange nicht auch ein "registered" vorliegt, denn nur dann kann wirklich abgehend telefoniert werden.
 
Danke fuer den Tip! Ob man sowas nicht gleich in * integrieren kann? Oder gibt es das schon und ich habs auf voip-info.org nur noch nicht entdeckt!
 

Statistik des Forums

Themen
244,690
Beiträge
2,216,596
Mitglieder
371,307
Neuestes Mitglied
ELVEON
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.