"Call Completed Elsewhere" mit elastix

mts

Neuer User
Mitglied seit
18 Mrz 2007
Beiträge
100
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen,

habe die aktuelle elastix-version installiert (Asterisk Ver. 1.4.24).
Das ganze System ist mitlerweile konfiguriert und läuft gut.
Wenn da nicht diese eine Sache währe "Call Completed Elsewhere".

Wir haben bei uns Snom 3xx Telefone im Einsatz und diverse Siemens Gigasets (IP-Station).
Wie bekomme ich jetzt den asterisk dazu "Call Completed Elsewhere" richtig zu behandeln OHNE mein ganzes System wieder platt zu machen und selber nen Asterisk zu kompilieren.

Gibt es jemanden der mir da helfen kann?
 
Wir haben bei uns Snom 3xx Telefone im Einsatz und diverse Siemens Gigasets (IP-Station).
Wie bekomme ich jetzt den asterisk dazu "Call Completed Elsewhere" richtig zu behandeln OHNE mein ganzes System wieder platt zu machen und selber nen Asterisk zu kompilieren.

Gibt es jemanden der mir da helfen kann?

Gibt es nicht, da Asterisk das erst mit Version 1.6 kann (angeblich, bin selber auch noch bei 1.4).
Auf den Snoms habe ich das gelöst indem eingehende Anrufe, die potentiell von woanders angenommen werden, auf eine andere Identity gehen, deren Anrufe nicht in der Liste erscheinen (kann man beim Snom pro identity festlegen).
Für die Siemens-Geräte gibt es da keine Lösung.

Grüße

Matthias
 
ich hab momentan Ver. 1.4.24, wie sieht es denn damit aus?

hat denn jemand Erfahrung im Zusammenhang mit elastix?
Ich muss ja dann die Asterisk-sourcen laden, patchen und kompilieren.

Sind danach noch alle Einstellungen vorhanden und läuft alles über das Webinterface ohne komplikationen?
 
naja, ich sagte ich möchte nicht das ganze System wieder platt machen.

Wenn ich Asterisk selber kompilieren und patchen kann OHNE dass meine ganzen Konfigurationen etc. verlohren gehen, dann kann ich damit auch leben.
 
versuch es mal mit dem patch. ist für'n 1.4.27-rc1

Code:
Index: channels/chan_sip.c
===================================================================
--- channels/chan_sip.c (revision 219719)
+++ channels/chan_sip.c (working copy)
@@ -967,6 +967,10 @@
    ast_group_t pickupgroup;            /*!< Pickup group */
    int lastinvite;                             /*!< Last Cseq of invite */
    struct ast_flags flags[2];          /*!< SIP_ flags */
+
+   /* boolean or small integers that don't belong in flags */
+   char answered_elsewhere;            /*!< This call is cancelled due to answer on another channel */
+
    int timer_t1;                               /*!< SIP timer T1, ms rtt */
    unsigned int sipoptions;            /*!< Supported SIP options on the other end */
    struct ast_codec_pref prefs;                /*!< codec prefs */
@@ -3658,6 +3662,13 @@
    if (p->owner)
        p->hangupcause = p->owner->hangupcause;

+   if (ast_test_flag(ast, AST_FLAG_ANSWERED_ELSEWHERE)) {
+       if(option_debug)
+            ast_log(LOG_DEBUG, "This call was answered elsewhere\n");
+       append_history(p, "Cancel", "Call answered elsewhere");
+       p->answered_elsewhere = TRUE;
+   }
+
    if (ast_test_flag(&p->flags[0], SIP_DEFER_BYE_ON_TRANSFER)) {
        if (ast_test_flag(&p->flags[0], SIP_INC_COUNT) || ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD)) {
             if (option_debug && sipdebug)
@@ -8257,6 +8268,10 @@
        p->invitestate = INV_CONFIRMED;

    reqprep(&resp, p, sipmethod, seqno, newbranch);
+
+   if (sipmethod == SIP_CANCEL && p->answered_elsewhere)
+       add_header(&resp, "Reason", "SIP;cause=200;text=\"Call completed elsewhere\"");
+
    add_header_contentLength(&resp, 0);
    return send_request(p, &resp, reliable, seqno ? seqno : p->ocseq);
 }
Index: apps/app_dial.c
===================================================================
--- apps/app_dial.c     (revision 219719)
+++ apps/app_dial.c     (working copy)
@@ -322,14 +322,17 @@
 };


-static void hanguptree(struct dial_localuser *outgoing, struct ast_channel *exception)
+static void hanguptree(struct dial_localuser *outgoing, struct ast_channel *exception, int answered_elsewhere)
 {
    /* Hang up a tree of stuff */
    struct dial_localuser *oo;
    while (outgoing) {
        /* Hangup any existing lines we have open */
-       if (outgoing->chan && (outgoing->chan != exception))
+       if (outgoing->chan && (outgoing->chan != exception)) {
+            if (answered_elsewhere)
+               ast_set_flag(outgoing->chan, AST_FLAG_ANSWERED_ELSEWHERE);
             ast_hangup(outgoing->chan);
+       }
        oo = outgoing;
        outgoing=outgoing->next;
        free(oo);
@@ -1441,7 +1444,7 @@
        /* Ah ha!  Someone answered within the desired timeframe.  Of course after this
           we will always return with -1 so that it is hung up properly after the
           conversation.  */
-       hanguptree(outgoing, peer);
+       hanguptree(outgoing, peer, 1);
        outgoing = NULL;
        /* If appropriate, log that we have a destination channel */
        if (chan->cdr)
@@ -1644,7 +1647,7 @@
             ast_copy_string(peer->exten, chan->exten, sizeof(peer->exten));
             peer->priority = chan->priority + 2;
             ast_pbx_start(peer);
-            hanguptree(outgoing, NULL);
+            hanguptree(outgoing, NULL, 0);
             if (continue_exec)
                *continue_exec = 1;
             res = 0;
@@ -1818,7 +1821,7 @@
        ast_indicate(chan, -1);
    }
    ast_rtp_early_bridge(chan, NULL);
-   hanguptree(outgoing, NULL);
+   hanguptree(outgoing, NULL, 0);
    pbx_builtin_setvar_helper(chan, "DIALSTATUS", status);
    if (option_debug)
        ast_log(LOG_DEBUG, "Exiting with DIALSTATUS=%s.\n", status);
Index: include/asterisk/channel.h
===================================================================
--- include/asterisk/channel.h  (revision 219719)
+++ include/asterisk/channel.h  (working copy)
@@ -517,6 +517,11 @@
    AST_FLAG_BRIDGE_HANGUP_DONT = (1 << 17),
    /*! This flag indicates whether the channel is in the channel list or not. */
    AST_FLAG_IN_CHANNEL_LIST = (1 << 19),
+
+   AST_FLAG_ANSWERED_ELSEWHERE = (1 << 20),
+   /*! Flag to show channels that this call is hangup due to the fact that the call
+    *  was indeed anwered, but in another channel */
+
 };

 /*! \brief ast_bridge_config flags */


AST_FLAG_ANSWERED_ELSEWHERE = (1 << 20) <-- Hier bin ich mir nicht sicher. Ich finde keine C Doku wo beschrieben ist was genau der (1 << 20) Teil der enum Anweisung bedeutet, und ob man den beliebig hoch/runter setzen kann also, hier jetzt 20 damit es mit der 1.4.27 passt.

Asterisk selber kompilieren und patchen kann OHNE dass meine ganzen Konfigurationen etc. verlohren gehen

Wenn du nur den Asterisk im elastix neu baust, sollte der Rest der Umgebung (Freepbx GUI / config) davon unberührt bleiben.
 
werd ich am Wochenende mal ausprobieren (vorher mach ich auf jeden Fall eine Sicherung). :)

Nochmal zu der Versionskompatibilität: Ich hab momentan die *.24 laufen.
Der Patch ist ja für die *.27
Soll ich also die *.27 runterladen und kompilieren? Ist die konfigurationsmäßig immernoch kompatibel mit der *.24 (ich geh mal davon aus)?
 
Soll ich also die *.27 runterladen und kompilieren?
wenn Du eh schon dabei bist, ja nimm die aktuelle 1.4.27

Ist die konfigurationsmäßig immernoch kompatibel mit der *.24
Sollte, an der 1.4-Serie werden nur Bugfixe gemacht.

Ich hab den Patch jetzt mit 1.4.27 am laufen, und Call Completed Elsewhere funktioniert.
 
Super, vielen Dank für die Hilfe.
Am WE weiß ich mehr. In der Woche ist sowas zu riskant.
 
so, wollte mich jetzt mal an das kompilieren geben.
Hat da jemand ne gute Anleitung wie man vorgehen sollte?
Was muss ich alles installiert haben (die ganzen Devel-Tools etc.)?
 
Hi,
ich hab hier probleme mit dem patchen.

Ich habe die asterisk-1.4.27-rc1 runtergeladen und entpackt.
Dann habe ich ins asterisk Verzeichnis gewechselt und eine Datei myPatch angelegt. Darein den code von wildzero kopiert und das ganze mit einem:
patch -p0 <mypatch.diff
aufgerufen.
Aus irgendeinem Grund will der aber nicht davon patchen:
patching file channels/chan_sip.c
Hunk #1 FAILED at 967.
Hunk #2 FAILED at 3662.
Hunk #3 FAILED at 8268.
3 out of 3 hunks FAILED -- saving rejects to file channels/chan_sip.c.rej
patching file apps/app_dial.c
Hunk #1 FAILED at 322.
Hunk #2 FAILED at 1444.
Hunk #3 FAILED at 1647.
Hunk #4 FAILED at 1821.
4 out of 4 hunks FAILED -- saving rejects to file apps/app_dial.c.rej
patching file include/asterisk/channel.h
Hunk #1 FAILED at 517.
1 out of 1 hunk FAILED -- saving rejects to file include/asterisk/channel.h.rej
 
ok, folgendes Problem:
Habe den Patch per Hand übernommen.
dann ein
make clean
./configure
make all

alles ohne Fehler.
dann
make install
und ich hab folgenden Salat:
...
chan_iax2.c:11742: Fehler: »struct chan_iax2_pvt« hat kein Element namens »__begin_field«
chan_iax2.c:11742: Fehler: »struct chan_iax2_pvt« hat kein Element namens »__begin_field«
chan_iax2.c:11742: Fehler: »struct chan_iax2_pvt« hat kein Element namens »outkey«
chan_iax2.c:11742: Fehler: »struct chan_iax2_pvt« hat kein Element namens »__begin_field«
chan_iax2.c:11742: Fehler: »struct chan_iax2_pvt« hat kein Element namens »__field_mgr«
chan_iax2.c:11742: Fehler: »struct chan_iax2_pvt« hat kein Element namens »__begin_field«
chan_iax2.c:11742: Fehler: »struct chan_iax2_pvt« hat kein Element namens »__end_field«
chan_iax2.c:11742: Fehler: »struct chan_iax2_pvt« hat kein Element namens »__begin_field«
chan_iax2.c:11742: Fehler: »struct chan_iax2_pvt« hat kein Element namens »__begin_field«
chan_iax2.c:11742: Fehler: »struct chan_iax2_pvt« hat kein Element namens »outkey«
chan_iax2.c:11742: Fehler: »struct chan_iax2_pvt« hat kein Element namens »__begin_field«
chan_iax2.c: In function »find_cache«:
chan_iax2.c:11812: Fehler: »struct chan_iax2_pvt« hat kein Element namens »dpentries«
chan_iax2.c:11813: Fehler: »struct chan_iax2_pvt« hat kein Element namens »dpentries«
chan_iax2.c:11815: Fehler: »struct chan_iax2_pvt« hat kein Element namens »state«
chan_iax2.c:11815: Fehler: »struct chan_iax2_pvt« hat kein Element namens »state«
chan_iax2.c:11815: Warnung: in Vergleich verschiedener Zeigertypen fehlt Typkonvertierung
chan_iax2.c:11815: Fehler: »struct chan_iax2_pvt« hat kein Element namens »state«
chan_iax2.c: In function »pvt_cmp_cb«:
chan_iax2.c:12521: Fehler: »struct chan_iax2_pvt« hat kein Element namens »frames_received«
chan_iax2.c: In function »transfercallno_pvt_hash_cb«:
chan_iax2.c:12528: Fehler: »const struct chan_iax2_pvt« hat kein Element namens »transfercallno«
chan_iax2.c: In function »transfercallno_pvt_cmp_cb«:
chan_iax2.c:12538: Fehler: »struct chan_iax2_pvt« hat kein Element namens »transfer«
chan_iax2.c:12538: Fehler: »struct chan_iax2_pvt« hat kein Element namens »transfercallno«
chan_iax2.c:12539: Fehler: »struct chan_iax2_pvt« hat kein Element namens »frames_received«
make[1]: *** [chan_iax2.o] Fehler 1
make[1]: Leaving directory `/usr/src/asterisk-1.4.27-rc1/channels'
make: *** [channels-install] Fehler 2

Gott sei dank läuft astersik noch, aber ich trau mich nicht den neu zu starten.
KANN MIR JEMAND HELFEN??? BIIITTEE.
 
ok, folgendes Problem:
Habe den Patch per Hand übernommen.
dann ein
make clean
./configure
make all

alles ohne Fehler.
dann
make install
und ich hab folgenden Salat:
Gott sei dank läuft astersik noch, aber ich trau mich nicht den neu zu starten.
KANN MIR JEMAND HELFEN??? BIIITTEE.


EDIT: OK, hab den Fehler gefunden! Musste erst die iax Firmware ins Verzeichnus kopieren.
Hab aber gleich den nächsten fehler:
app_meetme.c: In function »sla_build_trunk«:
app_meetme.c:4760: Fehler: »ast_free_ptr« nicht deklariert (erste Benutzung in dieser Funktion)
app_meetme.c:4760: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal aufgeführt
app_meetme.c:4760: Fehler: für jede Funktion in der er auftritt.)
app_meetme.c: In function »sla_build_station«:
app_meetme.c:4899: Fehler: »ast_free_ptr« nicht deklariert (erste Benutzung in dieser Funktion)
make[1]: *** [app_meetme.o] Fehler 1
make[1]: Leaving directory `/usr/src/asterisk-1.4.27-rc1/apps'
make: *** [apps-install] Fehler 2


EDIT2:
Muss leider nochmal korrigieren. Der 1. Fehler ist doch nicht weg. Er tauchte lediglich beim 2. make install nicht mehr auf. Nach einem make clean ist er wieder da.
 
Zuletzt bearbeitet:
kann mir wirklich keiner helfen?
Das Problem besteht nachwievor. Kann doch nicht sein, dass das nur bei mir auftaucht.
 
Habe es jetzt geschafft den Asterisk zu kompilieren und er läuft jetzt.
Ein Problem gibt es jedoch noch.
Die gepatchte "Call-Compl..." Funktion klappt nicht in queues!
Warum nicht? Muss ich da noch was beachten?
 
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.