.titleBar { margin-bottom: 5px!important; }

Existens eines Namens in sip.conf testen?

Dieses Thema im Forum "Asterisk Allgemein" wurde erstellt von allesOK, 19 Jan. 2005.

  1. allesOK

    allesOK Mitglied

    Registriert seit:
    24 Mai 2004
    Beiträge:
    732
    Zustimmungen:
    0
    Punkte für Erfolge:
    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
     
  2. allesOK

    allesOK Mitglied

    Registriert seit:
    24 Mai 2004
    Beiträge:
    732
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Keiner eine Idee?
     
  3. WrMulf

    WrMulf Mitglied

    Registriert seit:
    2 Okt. 2004
    Beiträge:
    553
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Stuttgart
    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
     
  4. allesOK

    allesOK Mitglied

    Registriert seit:
    24 Mai 2004
    Beiträge:
    732
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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?
     
  5. WrMulf

    WrMulf Mitglied

    Registriert seit:
    2 Okt. 2004
    Beiträge:
    553
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Stuttgart
    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
     
  6. allesOK

    allesOK Mitglied

    Registriert seit:
    24 Mai 2004
    Beiträge:
    732
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Bekommt man im Dialplan denn heraus, ob ein Provider connected ist?

    Rajo???

    Eric
     
  7. WrMulf

    WrMulf Mitglied

    Registriert seit:
    2 Okt. 2004
    Beiträge:
    553
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Stuttgart
    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.
     
  8. allesOK

    allesOK Mitglied

    Registriert seit:
    24 Mai 2004
    Beiträge:
    732
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  9. WrMulf

    WrMulf Mitglied

    Registriert seit:
    2 Okt. 2004
    Beiträge:
    553
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Stuttgart
    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.
     
  10. allesOK

    allesOK Mitglied

    Registriert seit:
    24 Mai 2004
    Beiträge:
    732
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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!