#!/usr/local/bin/php -q # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. #------------------------------------------------------------------------------ $debug = FALSE; include("/var/lib/asterisk/config/functions.php"); $lcrRoutingFile = "/etc/asterisk/lcr/tsblcr.routing"; $lcrSipConf = "/etc/asterisk/sip.conf"; list($vars, $all_vars) = read_vars("/etc/config.d/asterisk"); function writeIncoming($msns, $type) { global $vars, $dialtimeout, $optionsVbox, $optionsIncoming; foreach($msns as $msn) { unset($internal_numbers_dial); unset($internal_numbers_vbox); unset($exec_cmds); unset($keys); unset($extraDialAttrib); unset($redirectNumber); unset($vboxTimeout); unset($vbox_cmd); unset($dial_cmd); if($type == "sip") { $sipName = $msn["NAME"]; $sipUser = $msn["USER"]; $exten = $msn["CALLERID"]; $searchToken = $sipName; $searchIn = "RING_ON_SIP"; } else { $exten = $msn; $searchToken = $exten; $searchIn = "RING_ON_CAPI"; } $keys = multi_array_search($searchToken, $vars["ASTERISK_PHONES"], $searchIn); if($keys === FALSE) continue; # Falls eine MSN definiert wurde, der nicht in ASTERISK_PHONES_* vorkommt soll bersprungen werden foreach($keys as $key) { #if(!ereg("RING_ON", $value[0]) && !ereg("RING_ON", $value[1])) continue; # $value kann auch gleich OUTGOING_MSN sein, das darf hier nicht verwendet werden $internal_numbers_dial[] = getDialCmd($vars["ASTERISK_PHONES"][$key]["TYPE"], $vars["ASTERISK_PHONES"][$key]["MSN"], $key); if($vars["ASTERISK_PHONES"][$key]["TYPE"] == "disa" && $vars["ASTERISK_PHONES"][$key]["RING_ON_CAPI"] != "") { err("ASTERISK_PHONES_".$key."_RING_ON_CAPI must be empty if using DISA in ASTERISK_PHONES_".$key."_TYPE"); } if($vars["ASTERISK_PHONES"][$key]["TYPE"] == "disa" && $vars["ASTERISK_PHONES"][$key]["MSN"] == $exten && $type == "capi") return; if(!empty($vars["ASTERISK_PHONES"][$key]["EXEC_ON_RING"])) # Sammle alle Befehle aus EXEC_ON_RING wenn diese nicht leer ist und die aktuelle $msn in RING_ON_CAPI steht $exec_cmds[] = $vars["ASTERISK_PHONES"][$key]["EXEC_ON_RING"]; if($vars["ASTERISK_PHONES"][$key]["VBOX_ANSWER_AFTER"] != "" && $vars["ASTERISK_PHONES"][$key]["VBOX"] == "yes") { if(!isset($vboxTimeout)) $vboxTimeout = $vars["ASTERISK_PHONES"][$key]["VBOX_ANSWER_AFTER"]; # Falls auf eine interne MSN ein Sammelruf zutrifft, wird der erste ANSWER_AFTER-Wert als Timeout genommen $internal_numbers_vbox[] = $vars["ASTERISK_PHONES"][$key]["MSN"]; } } if(isset($internal_numbers_dial)) $dial_cmd = implode("&", $internal_numbers_dial); # Dial command zusammenstellen else continue; if(isset($internal_numbers_vbox)) { $vbox_cmd = implode("&", $internal_numbers_vbox); # VBOX command zusammenstellen $localdialtimeout = $vboxTimeout; } else { $localdialtimeout = $dialtimeout; } $e = new exten; $e->setExten($exten); if($type == "capi") echo "; Incoming calls over CAPI MSN $exten\n"; else echo "; Incoming calls over SIP-Account: $sipName ($sipUser)\n"; $e->setCmd("SetLanguage", $vars["ASTERISK_LANGUAGE"]); if($vars["ASTERISK_RESOLVE_NUMBERS"] == "yes") { # Wenn diese Var auf yes steht soll ber getName.php per Inverssuche der Name des Anrufers aufgel�t werden $e->setCmd("AGI", "getName.php"); $e->setCmd("SetCIDNum", "\${CID}"); $e->setCmd("SetCIDName", "\${NAME}"); } if($vars["ASTERISK_DIALPREFIX_CAPI"] != "" && $vars["ASTERISK_DIALPREFIX_SHOW_CAPI"] == "yes") { $tmpprio = $e->prio + 2; $e->setCmd("GotoIf", "\$[\"\${CALLERIDNUM}\" = \"\"]?$tmpprio"); $e->setCmd("SetCIDNum", $vars["ASTERISK_DIALPREFIX_CAPI"]."\${CALLERIDNUM}"); } if(isset($vars["ASTERISK_CAPI_EXTRA"]) && $type == "capi") # Soll nur ausgefhrt werden, wenn $vars["ASTERISK_CAPI_EXEC"] berhaupt vorhanden ist foreach($vars["ASTERISK_CAPI_EXTRA"] as $exec) { # Schreibe alle System-Befehle aus ASTERISK_CAPI_EXEC, die auf diese MSN zutreffen if($exec["MSN"] != $exten || empty($exec["EXEC_ON_RING"])) continue; $e->setCmd("System", $exec["EXEC_ON_RING"]); } if(isset($exec_cmds)) # Soll nur ausgefhrt werden, wenn $exec_cmds berhaupt vorhanden ist foreach($exec_cmds as $exec_cmd) { # Schreibe alle System-Befehle aus $exec_cmds $e->setCmd("System", $exec_cmd); } #$vboxTimeout = $localdialtimeout; if($vars["ASTERISK_CAPI_EXTRA_N"] > 0 && $type == "capi") { foreach($vars["ASTERISK_CAPI_EXTRA"] as $extra) { if($extra["REDIRECT_AFTER"] == "" || $extra["REDIRECT_TO"] == "" || $extra["REDIRECT"] != "yes" || $extra["MSN"] != $exten ) continue; $localdialtimeout = $extra["REDIRECT_AFTER"]; $redirectNumber = $extra["REDIRECT_TO"]; if($extra["MSN"] == $exten) break; } } $e->setCmd("Dial", "$dial_cmd,$localdialtimeout,$optionsIncoming$extraDialAttrib"); if(isset($redirectNumber)) { $e->setCmd("Goto", "outgoing-".$exten.",$redirectNumber,1"); } if(isset($vbox_cmd)) { $e->setCmd("Wait", "0.5", $e->prio); $e->setCmd("VoiceMail", $optionsVbox."u".$vbox_cmd, $e->prio+1); $tmpprio = $e->prio+100; $e->setCmd("Wait", "0.5", $tmpprio); $e->setCmd("VoiceMail", $optionsVbox."b".$vbox_cmd, $tmpprio+1); $tmpprio = $e->prio+200; $e->setCmd("Wait", "0.5", $tmpprio); $e->setCmd("VoiceMail", $optionsVbox."u".$vbox_cmd, $tmpprio+1); $e->prio++; } $e->setHangup(); } } function writeRedirects($var, $type) { global $vars, $dialprefix_capi, $dialprefix_sip, $dialtimeout, $lcrRoutingFile, $lcrSipConf; foreach($var as $key => $extra) { if($extra["REDIRECT_AFTER"] == "" || $extra["REDIRECT_TO"] == "" || $extra["REDIRECT"] != "yes") continue; ### Outgoing SIP calls echo "\n[outgoing-".$extra["MSN"]."]\n"; echo "include => incoming\n\n"; if($extra["REDIRECT_OUTGOING_SIP"] != "") { $sip = get_sip_by_varname($extra["REDIRECT_OUTGOING_SIP"], "NAME", "array"); # Anhand des Namens des Sipaccounts die Nummer (Username) herausfinden $sipuser = $sip["USER"]; if(!empty($sipuser) && $sip !== FALSE) { $e = new exten; $e->setExten("_$dialprefix_sip."); if($type == "sip") echo "; Outgoing calls over SIP ".$extra["REDIRECT_OUTGOING_SIP"]." (for redirection of SIP account ".$extra["NAME"].")\n"; else echo "; Outgoing calls over SIP ".$extra["REDIRECT_OUTGOING_SIP"]." (for redirection of MSN ".$extra["MSN"].")\n"; if(is_integer(strpos($extra["NAME"], "t-online")) && is_integer(strpos($extra["USER"], ":"))) { # Sonderbehandlung fr T-Offline list($tonlNummer) = explode(":", $extra["USER"]); $e->setCmd("SetCIDNum", $tonlNummer); } $e->setCmd("Dial", "SIP/\${EXTEN".$cut_sip."}@".$extra["REDIRECT_OUTGOING_SIP"].",$dialtimeout"); $e->setHangup(); } } ### Outgoing CAPI calls if($vars["ASTERISK_LOAD_CAPI"] == "yes" && $extra["REDIRECT_OUTGOING_MSN"] != "") { $e = new exten; if($type == "capi") echo "; Outgoing calls over CAPI ".$extra["REDIRECT_OUTGOING_MSN"]." (for redirection of MSN ".$extra["MSN"].")\n"; else echo "; Outgoing calls over CAPI ".$extra["REDIRECT_OUTGOING_MSN"]." (for redirection of SIP-Account ".$extra["NAME"].")\n"; $e->setExten("_".$dialprefix_capi."."); if($phone["OUTGOING_HFCS_GROUP"] == "") { $pstnTrunkLCR = "CAPI"; $pstnTrunkNorm = "CAPI/contr1/"; } else { $pstnTrunkLCR = "Zap/g".$phone["OUTGOING_HFCS_GROUP"]; $pstnTrunkNorm = $pstnTrunkLCR."/"; } if($vars["ASTERISK_LCR"] == "yes") { $e->setCmd("Macro", "tsblcr,\${EXTEN".$cut_capi."},$lcrRoutingFile,".$extra["REDIRECT_OUTGOING_MSN"].",,$pstnTrunkLCR,$lcrSipConf"); echo "\n"; } else { $e->setCmd("SetCIDName", ""); $e->setCmd("SetCIDNum", $extra["REDIRECT_OUTGOING_MSN"]); $e->setCmd("Dial", "$pstnTrunkNorm\${EXTEN".$cut_capi."},$dialtimeout"); $e->setHangup(); } } echo $errorExten; } } ######### Write extensions.conf if($_SERVER["argv"][1] == "--config=extensions") { $dialtimeout = 120; $optionsIncoming = "t"; # t: Calltransfer $optionsOutgoing = "TW"; # T: Calltransfer, W: allow to record if($vars["ASTERISK_VBOX_PLAY_INSTRUCTIONS"] != "yes") $optionsVbox = "s"; else $optionsVbox = ""; if($vars["ASTERISK_AREA_CODE"] != "") $areaCode = "\${areaCode}"; $errorExten = "include => error\n\n"; if($vars["ASTERISK_PHONES_N"] == 0) { err("You must have at least one local telephone defined (ASTERISK_PHONES_*). Aborting..."); exit; } echo "[general]\n\n"; echo "static=yes\n"; echo "writeprotect=no\n"; if($vars["ASTERISK_LCR"] == "yes") echo "#include /etc/asterisk/lcr/extensions.tsblcr\n\n"; echo "[globals]\n\n"; echo "[default]\n"; echo "include => user\n"; echo "include => test\n"; echo "include => outgoing\n"; echo $errorExten; echo "[test]\n"; $e = new exten; $e->setExten("#100"); $e->setCmd("Answer"); $e->setCmd("MP3Player", "/var/lib/asterisk/mohmp3/fpm-calm-river.mp3"); $e->setHangup(); $e = new exten; $e->setExten("#101"); $e->setCmd("Answer"); $e->setCmd("Milliwatt"); $e->setHangup(); $e = new exten; $e->setExten("#102"); $e->setCmd("Answer"); $e->setCmd("SayDigits", "\${CALLERIDNUM}"); $e->setHangup(); $e = new exten; $e->setExten("#103"); $e->setCmd("Answer"); $e->setCmd("Playback", "demo-echotest"); $e->setCmd("Echo"); $e->setCmd("Playback", "demo-echodone"); $e->setHangup(); $e = new exten; $e->setExten("#104"); $e->setCmd("Answer"); $e->setCmd("AGI", "date.sh"); $e->setCmd("SendText", "\${ADATE}"); #$e->setCmd("SayUnixTime", ",localtime,A 'digits/at' R"); $e->setCmd("sayPhonetic", "\${ADATE:5}"); $e->setHangup(); echo "[outgoing]\n"; ###### Outgoing context foreach($vars["ASTERISK_PHONES"] as $key => $phone) { # Contexte in outgoing inkludieren $all_internal_msns[] = array(); # declare var as an array for array_search below if(array_search($phone["MSN"], $all_internal_msns) != FALSE) { err("The internal MSN ".$phone["MSN"]." is specified twice in the configuration, but ASTERISK_PHONES_n_MSN has to be unique! Ignoring ASTERISK_PHONES_".$key."_MSN."); unset($vars["ASTERISK_PHONES"][$key]); } if($phone["OUTGOING_MSN"] != "") echo "include => ".$phone["MSN"]."\n"; $all_internal_msns[] = $phone["MSN"]; # Alle internen MSNs fr die Fehlerroutinen sammeln } echo "\ninclude => incoming\n"; # Bestimmen des Dialprefixes und wieviel abgeschnitten werden soll am anfang der Nummer if($vars["ASTERISK_DIALPREFIX_SIP"] == "") { # Wenn der Dialprefix leer ist, soll "x" eingefgt werden $dialprefix_sip = "x"; $cut_sip = ""; } else { $dialprefix_sip = $vars["ASTERISK_DIALPREFIX_SIP"]; $cut_sip = ":".strlen($dialprefix_sip); } if($vars["ASTERISK_DIALPREFIX_CAPI"] == "") { # Wenn der Dialprefix leer ist, soll "x" eingefgt werden $dialprefix_capi = "x"; $cut_capi = ""; } else { $dialprefix_capi = $vars["ASTERISK_DIALPREFIX_CAPI"]; $cut_capi = ":".strlen($dialprefix_capi); } if($vars["ASTERISK_DIALPREFIX_INTERNAL"] == "") { # Wenn der Dialprefix leer ist, soll "x" eingefgt werden $dialprefix_internal = "x"; $cut_internal = ""; } else { $dialprefix_internal = $vars["ASTERISK_DIALPREFIX_INTERNAL"]; $cut_internal = ":".strlen($dialprefix_internal); } foreach($vars["ASTERISK_PHONES"] as $key => $phone) { if($phone["OUTGOING_SIP"] == "" && $phone["OUTGOING_MSN"] == "") continue; unset($fallbackDialCmds); unset($sipfallback); echo "\n[".$phone["MSN"]."]\n"; echo ";;; Phone ".$phone["MSN"]." ;;;\n"; ### Outgoing SIP calls if($phone["OUTGOING_SIP"] != "") { echo "; Outgoing calls over SIP\n"; $sip = get_sip_by_varname($phone["OUTGOING_SIP"], "NAME", "array"); # Anhand des Namens des Sipaccounts die Nummer (Username) herausfinden $e = new exten; if($phone["OUTGOING_SIP"] != "" && !empty($sip)) { $sipnumber = $sip["CALLERID"]; $sipfallback = $sip["FALLBACK"]; if(isset($sipfallback)) { $fallbacks = explode(" ", $sipfallback); foreach($fallbacks as $fallback) { if(empty($fallback)) continue; list($type, $outgoing) = explode(":", $fallback); if($type == "sip" && $outgoing != "") { $sip2 = get_sip_by_varname($outgoing, "NAME", "array", FALSE); if($sip2 === FALSE) { err("The sipaccount \"".$outgoing."\" given in ASTERISK_SIP_".$sip["key"]."_FALLBACK doesn't exist"); $vars["ASTERISK_SIP"][$sip["key"]]["FALLBACK"] = ereg_replace("sip:$outgoing", "", $vars["ASTERISK_SIP"][$sip["key"]]["FALLBACK"]); # To avoid further error messages } } if($type == "sip") $fallbackDialCmds[] = "SIP/$areaCode\${EXTEN".$cut_sip."}@$outgoing"; elseif($type == "capi") { $fallbackDialCmds["No".$outgoing] = "CAPI/contr1/\${EXTEN".$cut_sip."}"; # $cut_sip ist korrekt $all_outgoing_msns[] = $outgoing; } elseif(ereg("hfcs", $type)) { $fallbackDialCmds["No".$outgoing] = "Zap/g".getHfcsGroup($type)."/\${EXTEN".$cut_sip."}"; # $cut_sip ist korrekt } else err("Fallbacktype ($fallback) unkown"); } } if(!empty($sipnumber) && $sip !== FALSE) { $e->setExten("_$dialprefix_sip."); $e->setCID($phone["MSN"]); if(is_integer(strpos($sip["NAME"], "t-online")) && is_integer(strpos($sip["USER"], ":"))) { # Sonderbehandlung fr T-Offline list($tonlNummer) = explode(":", $sip["USER"]); $e->setCmd("SetCIDNum", $tonlNummer); $e->setCID($sipnumber); $e->setCmd("SetCIDName", $tonlName); } else { $e->setCmd("SetCIDNum", $sipnumber); $e->setCID($sipnumber); $e->setCmd("SetCIDName", $phone["OUTGOING_NAME"]); } $priotmp = $e->prio + 2; if($vars["ASTERISK_AREA_CODE"] != "") { if(empty($cut_sip)) $cut_sip_tmp = ":0"; else $cut_sip_tmp = $cut_sip; $e->setCmd("GotoIf", "\$[\"\${EXTEN$cut_sip_tmp:1}\" = \"0\"]?$priotmp"); $e->setCmd("setVar", "areaCode=".$vars["ASTERISK_AREA_CODE"]); } $e->setCmd("Dial", "SIP/$areaCode\${EXTEN".$cut_sip."}@".$phone["OUTGOING_SIP"].",$dialtimeout,$optionsOutgoing"); if(isset($fallbackDialCmds)) { foreach($fallbackDialCmds as $key => $fallbackDialCmd) { if(ereg("CAPI|Zap", $fallbackDialCmd)) { # CID nur setzen, wenn die Gespräche nicht über SIP rausgehen $e->setCmd("SetCIDNum", substr($key, 2)); } $e->setCmd("Dial", $fallbackDialCmd.",$dialtimeout,$optionsOutgoing"); } } echo "\n"; } } else { $e = new exten; $e->setExten("_".$dialprefix_sip."."); $e->setCID($phone["MSN"]); $e->setCmd("SetLanguage", $vars["ASTERISK_LANGUAGE"]); $e->setCmd("Playback", "ss-noservice"); $e->setHangup(); } } ### Outgoing CAPI/HFCS calls echo "; Outgoing calls over CAPI\n"; if($vars["ASTERISK_LOAD_CAPI"] == "yes" && $phone["OUTGOING_MSN"] != "") { $e = new exten; $e->setExten("_".$dialprefix_capi."."); $e->setCID($phone["MSN"]); if($phone["OUTGOING_HFCS_GROUP"] == "") { $pstnTrunkLCR = "CAPI"; $pstnTrunkNorm = "CAPI/contr1/"; } else { $pstnTrunkLCR = "Zap/g".$phone["OUTGOING_HFCS_GROUP"]; $pstnTrunkNorm = $pstnTrunkLCR; } if($vars["ASTERISK_LCR"] == "yes") $e->setCmd("Macro", "tsblcr,\${EXTEN".$cut_capi."},$lcrRoutingFile,".$phone["OUTGOING_MSN"].",".$phone["OUTGOING_NAME"].",$pstnTrunkLCR,$lcrSipConf"); else { $e->setCmd("SetCIDNum", $phone["OUTGOING_MSN"]); $e->setCID($phone["OUTGOING_MSN"]); $e->setCmd("SetCIDName", ""); $e->setCmd("Dial", $pstnTrunkNorm."\${EXTEN".$cut_capi."},$dialtimeout,$optionsOutgoing"); } echo "\n"; } else { $e = new exten; $e->setExten("_".$dialprefix_capi."."); $e->setCID($phone["MSN"]); $e->setCmd("SetLanguage", $vars["ASTERISK_LANGUAGE"]); $e->setCmd("Playback", "ss-noservice"); $e->setHangup(); } $all_msns[] = $phone["RING_ON_CAPI"]; } if($vars["ASTERISK_CALLTHROUGH_N"] > 0) { foreach($vars["ASTERISK_CALLTHROUGH"] as $ct) { # ct = callthrough echo "\n[DISA-".$ct["MSN"]."]\n"; echo "include => incoming\n\n"; ### Outgoing SIP calls $e = new exten; $e->setExten("_".$dialprefix_sip."."); if($ct["ALLOW_SIP"] == "yes" && $ct["OUTGOING_SIP"] != "") { echo "; Outgoing calls over SIP\n"; $sip = get_sip_by_varname($ct["OUTGOING_SIP"], "NAME"); $sipuser = $sip["USER"]; if(is_integer(strpos($ct["OUTGOING_SIP"], "t-online")) && is_integer(strpos($sipuser, ":"))) { # Sonderbehandlung fr T-Offline list($tonlNummer) = explode(":", $sipuser); $e->setCmd("SetCIDNum", $tonlNummer); } $e->setCmd("Dial", "SIP/\${EXTEN".$cut_sip."}@".$ct["OUTGOING_SIP"].",$dialtimeout"); $e->setHangup(); } ### Outgoing CAPI calls if($ct["ALLOW_CAPI"] == "yes") { $e = new exten; $e->setExten("_".$dialprefix_capi."."); echo "; Outgoing calls over CAPI\n"; $e->setCmd("SetCIDName", ""); $e->setCmd("SetCIDNum", $ct["OUTGOING_MSN"]); if($ct["OUTGOING_HFCS_GROUP"] == "") $e->setCmd("Dial", "CAPI/contr1/\${EXTEN".$cut_capi."},$dialtimeout"); else $e->setCmd("Dial", "Zap/g".getHfcsGroup($ct["OUTGOING_HFCS_GROUP"])."/\${EXTEN".$cut_capi."},$dialtimeout"); $e->setHangup(); } } } ###### Incoming context echo "\n[incoming]\n"; echo "include => default\n\n"; ### incoming SIP calls if(isset($vars["ASTERISK_SIP"])) { # Ist z.b. nicht gesetzt, wenn keine SIP-Accounts defniert sind writeIncoming($vars["ASTERISK_SIP"], "sip"); } ### incoming CAPI calls if(isset($all_msns) && $vars["ASTERISK_LOAD_CAPI"] == "yes") { # $all_msns ist z.b. nicht gesetzt, wenn RING_ON_CAPI leer $all_msns = implode(" ", $all_msns); # Alle MSNs aus dem Array zusammenfhren, da ein Key auch mehrere MSNs getrennt durch Leerzeichen enthalten kann. $all_msns = explode(" ", $all_msns); # Es soll aber jede MSN in einem Keywert stehen, $all_msns = array_unique($all_msns); # weil man dann die Doubletten besser rausfiltern kann. writeIncoming($all_msns, "capi"); } ### incoming internal calls foreach($vars["ASTERISK_PHONES"] as $key => $phone) { #if($phone["TYPE"] == "disa") continue; $e = new exten; $e->setExten($vars["ASTERISK_DIALPREFIX_INTERNAL"].$phone["MSN"]); echo "; Incoming (internal) calls for number ".$phone["MSN"].". Type of phone: ".$phone["TYPE"]."\n"; foreach($vars["ASTERISK_PHONES"] as $phone2) { # Hier werden alle Telefone durchgegangen, um den CallerIDName korrekt zu setzen if($phone["MSN"] == $phone2["MSN"]) continue; # man braucht sich nicht selbst anzurufen $e->setCID($phone2["MSN"]); $e->setCmd("SetCIDName", $phone2["OUTGOING_NAME"]); $e->prio--; } $e->prio++; foreach($vars["ASTERISK_PHONES"] as $phone2) { # Hier werden alle Telefone durchgegangen, um die CallerID korrekt zu setzen if($phone["MSN"] == $phone2["MSN"]) continue; # man braucht sich nicht selbst anzurufen $e->setCID($phone2["MSN"]); $e->setCmd("SetCIDNum", $vars["ASTERISK_DIALPREFIX_INTERNAL"].$phone2["MSN"]); $e->prio--; } $e->setCID(""); $e->setCmd("NoOp", "", 1); $e->setCmd("NoOp", "", 2); $e->prio++; foreach($vars["ASTERISK_PHONES"] as $phone2 => $key) { if(empty($phone2["EXEC_ON_RING"])) continue; # Hier sollen nur die EXEC_ON_RING Variablen ausgewertet werden, wo auch etwas drin steht $e->setCmd("System", $phone2["EXEC_ON_RING"]); } if($phone["VBOX"] == "yes") $localdialtimeout = $phone["VBOX_ANSWER_AFTER"]; else $localdialtimeout = $dialtimeout; $e->setCmd("Dial", getDialCmd($phone["TYPE"], $phone["MSN"], $key, $localdialtimeout)); if($phone["VBOX"] == "yes") { $e->setCmd("VoiceMail", $optionsVbox."u".$phone["MSN"], $e->prio); $tmpprio = $e->prio+100; $e->setCmd("VoiceMail", $optionsVbox."b".$phone["MSN"], $tmpprio); $tmpprio = $e->prio+200; $e->setCmd("VoiceMail", $optionsVbox."u".$phone["MSN"], $tmpprio); $e->prio++; } $e->setHangup(); } ### incoming VBOX calls foreach($vars["ASTERISK_PHONES"] as $phone) { if($phone["VBOX"] != "yes") continue; $ext = $vars["ASTERISK_DIALPREFIX_VBOX"].$phone["MSN"]; $e = new exten; $e->setExten($ext); echo "; VBOX menu for the phone with the MSN ".$phone["MSN"]."\n"; $e->setCmd("SetLanguage", $vars["ASTERISK_LANGUAGE"]); $e->setCID($phone["MSN"]); $e->setCmd("VoicemailMain", "s".$phone["MSN"]); # Ohne Passwortabfrage $e->setCID(""); $e->prio--; $e->setCmd("VoicemailMain", $phone["MSN"]); $e->setHangup(); } ### incoming DISA calls foreach($vars["ASTERISK_PHONES"] as $phone) { if($phone["TYPE"] != "disa") continue; # Es sollen nur nur DISA Telefone bercksichtigt werden echo "; Incoming DISA calls for ".$phone["MSN"]."\n"; echo "exten => ".$vars["ASTERISK_DIALPREFIX_DISA"]."/".$phone["MSN"].",1,Answer\n"; echo "exten => ".$vars["ASTERISK_DIALPREFIX_DISA"]."/".$phone["MSN"].",2,Background(tt-weasels)\n"; echo "exten => ".$vars["ASTERISK_DIALPREFIX_DISA"]."/".$phone["MSN"].",3,DISA(no-password|outgoing)\n\n"; } ### incoming DISA callthoughs if($vars["ASTERISK_CALLTHROUGH_N"] > 0) { foreach($vars["ASTERISK_CALLTHROUGH"] as $key => $ct) { # ct = callthrough if($ct["MSN"] == $vars["ASTERISK_DIALPREFIX_DISA"]) err("ASTERISK_CALLTHROUGH_".$key."_MSN may not be equal to ASTERISK_DIALPREFIX_DISA!"); if($ct["ALLOW_N"] > 0) { # Wenn nur bestimmte Caller IDs erlaubt sind, muss fr jede Caller ID ein Block geschrieben werden, wenn nichts angegeben wurde, wird die ex-girlfriend-logic nicht verwendet. (empty funktioniert hier nicht, da auch 0 TRUE ergibt) foreach($ct["ALLOW"] as $allow) { $e = new exten; $e->setExten($ct["MSN"]); $e->setCID($allow["CALLERID"]); echo "; Incoming DISA callthroughs for ".$ct["MSN"]." by ".$allow["CALLERID"]."\n"; $e->setCmd("Answer"); $e->setCmd("SetLanguage", $vars["ASTERISK_LANGUAGE"]); if($allow["PIN"] != "") { $e->setCmd("DigitTimeout", 5); $e->setCmd("ResponseTimeout", 10); $e->setCmd("Authenticate", $allow["PIN"]); } $e->setCmd("DISA", "no-password|DISA-".$ct["MSN"]); echo "\n"; } } if($ct["ANONYMOUS_ACCESS"] == "yes") { if($ct["ANONYMOUS_PIN"] == "") { # Die PIN darf nicht leer sein, da sonst jeder callthrough machen kann, der die MSN kennt. warn("ASTERISK_CALLTHROUGH_".$key."_ANONYMOUS_PIN may not be empty. Security reasons! Skipping..."); continue; } $e = new exten; $e->setExten($ct["MSN"]); echo "; Incoming DISA callthroughs for ".$ct["MSN"]." by unkown callerids\n"; $e->setCmd("Answer"); $e->setCmd("SetLanguage", $vars["ASTERISK_LANGUAGE"]); $e->setCmd("DigitTimeout", 5); $e->setCmd("ResponseTimeout", 10); $e->setCmd("Authenticate", $ct["ANONYMOUS_PIN"]); $e->setCmd("DISA", "no-password|DISA-".$ct["MSN"]); } } } ### Outgoing context for redirects ### Redirection of CAPI_EXTRA (MSN) if($vars["ASTERISK_CAPI_EXTRA_N"] > 0) { writeRedirects($vars["ASTERISK_CAPI_EXTRA"], "capi"); } ### Redirection of SIP calls if($vars["ASTERISK_SIP_N"] > 0) { writeRedirects($vars["ASTERISK_SIP"], "sip"); } ### Error handling echo "[error]\n"; echo "exten => h,1,Hangup\n"; $e = new exten; $e->setExten("_[*#X]."); if($vars["ASTERISK_ADVANCED_ERROR_MSG"] == "yes") $e->setCmd("Playback", "error"); $e->setCmd("Playback", "pbx-invalid"); $e->setHangup(); } elseif($_SERVER["argv"][1] == "--config=skinny") { echo "[general]\n"; echo "port = 2000\n"; echo "bindaddr = ".$vars["ASTERISK_LISTEN_ADDR"]."\n"; echo "dateFormat = D-M-Y\n"; echo "keepAlive = 120\n"; echo "language = ".$vars["ASTERISK_LANGUAGE"]."\n\n"; if(isset($vars["ASTERISK_PHONES"])) foreach($vars["ASTERISK_PHONES"] as $phone) { if($phone["TYPE"] != "skinny") continue; echo "[cisco".$phone["MSN"]."]\n"; echo "device = SEP".$phone["MAC_ADDR"]."\n"; echo "callerid = \"".$phone["OUTGOING_NAME"]."\" <".$phone["MSN"].">\n"; echo "callwaiting = 1\n"; echo "transfer = 1\n"; echo "threewaycalling = 1\n"; echo "line => ".$phone["MSN"]."\n\n"; } } elseif($_SERVER["argv"][1] == "--config=unistim") { echo "[general] port=5000 ; UDP port ;keepalive=120 ; in seconds, default = 120 ;bindaddr= ; if asterisk is behind a nat, specify your public IP ;[black] ; name of the device ;device=000ae4012345 ; mac address of the phone ;rtp_port = 10000 ; RTP port used by the phone, default = 10000. RTCP = rtp_port+1 ;rtp_method=0 ; If you don't have sound, you can try 1 or 2, default = 0 ;titledefault=Asterisk ; default = \"TimeZone (your time zone)\". 12 characters max ;maintext0=\"you can insert\" ; default = \"Welcome\", 24 characters max ;maintext1=\"a custom text\" ; default = the name of the device, 24 characters max ;maintext2=\"(main page)\" ; default = the public IP of the phone, 24 characters max ;dateformat=1 ; 0 = month/day, 1 (default) = day/month ;timeformat=1 ; 0 = 0:00am ; 1 (default) = 0h00, 2 = 0:00 ;contrast=8 ; define the contrast of the LCD. From 0 to 15. Default = 8 ;nat=0 ; control ast_rtp_setnat, default = 0 ;callerid=\"Customer Support\" <555-234-5678> ;context=default ; context, default=\"default\" ;mailbox=1234 ; Specify the mailbox number. Used for Message Waiting Indication ;linelabel=\"Support\" ; Softkey label for the next line=> entry, 9 char max. ;line => 100 ; Only one line per device in this version ;bookmark=Hans C.@000 ; Use a softkey to dial 123. ;bookmark=Mailbox@011@54 ; 54 shows a mailbox icon. See #define FAV_ICON_ for other values (32 to 63) ;bookmark=Test@*@USTM/violet ; Display an icon if violet is connected (dynamic), only for unistim device\n\n"; if(isset($vars["ASTERISK_PHONES"])) foreach($vars["ASTERISK_PHONES"] as $phone) { if($phone["TYPE"] != "unistim") continue; echo "[unistim".$phone["MSN"]."]\n"; echo "device = ".$phone["MAC_ADDR"]."\n"; echo "line => ".$phone["MSN"]."\n\n"; } } elseif($_SERVER["argv"][1] == "--config=capi") { ######### Write capi.conf echo "[general]\n"; echo "nationalprefix=0\n"; echo "internationalprefix=00\n"; echo "rxgain=0.8\n"; echo "txgain=0.8\n\n"; echo "[interfaces]\n"; if(isset($vars["ASTERISK_SIP"])) { foreach($vars["ASTERISK_SIP"] as $sip) { $sipfallback = $sip["FALLBACK"]; if(isset($sipfallback)) { $fallbacks = explode(" ", $sipfallback); foreach($fallbacks as $fallback) { list($type, $outgoing) = explode(":", $fallback); if($type == "capi") $all_outgoing_msns[] = $outgoing; } } if($sip["REDIRECT"] == "yes") $all_outgoing_msns[] = $sip["REDIRECT_OUTGOING_MSN"]; } } foreach($vars["ASTERISK_PHONES"] as $phone) { $all_outgoing_msns[] = $phone["OUTGOING_MSN"]; $all_incoming_msns[] = $phone["RING_ON_CAPI"]; } if($vars["ASTERISK_CAPI_EXTRA_N"] != 0) { foreach($vars["ASTERISK_CAPI_EXTRA"] as $extra) { $all_outgoing_msns[] = $extra["REDIRECT_OUTGOING_MSN"]; $all_incoming_msns[] = $extra["MSN"]; } } if($vars["ASTERISK_CALLTHROUGH_N"] != 0) { foreach($vars["ASTERISK_CALLTHROUGH"] as $ct) { # ct = callthrough $all_outgoing_msns[] = $ct["OUTGOING_MSN"]; $all_incoming_msns[] = $ct["MSN"]; } } $all_incoming_msns = implode(" ", $all_incoming_msns); # Alle MSNs aus dem Array zusammenfhren, da ein Key auch mehrere MSNs getrennt durch Leerzeichen enthalten kann. $all_incoming_msns = explode(" ", $all_incoming_msns); # Es soll aber jede MSN in einem Keywert stehen, $all_incoming_msns = array_unique($all_incoming_msns); # weil man dann die Doubletten besser rausfiltern kann. $all_incoming_msns = implode(",", $all_incoming_msns); # Array zusammenfgen mit Komma als Trennzeichen $all_outgoing_msns = implode(" ", $all_outgoing_msns); # Alle MSNs aus dem Array zusammenfhren, da ein Key auch mehrere MSNs getrennt durch Leerzeichen enthalten kann. $all_outgoing_msns = explode(" ", $all_outgoing_msns); # Es soll aber jede MSN in einem Keywert stehen, $all_outgoing_msns = array_unique($all_outgoing_msns); # weil man dann die Doubletten besser rausfiltern kann. $all_outgoing_msns = implode(",", $all_outgoing_msns); # Array zusammenfgen mit Komma als Trennzeichen echo "msn=$all_outgoing_msns\n"; echo "incomingmsn=$all_incoming_msns\n"; echo "controller=1\n"; echo "softdtmf=1\n"; echo "context=incoming\n"; echo "devices=2\n"; echo "immediate=no\n"; echo "language=".$vars["ASTERISK_LANGUAGE"]."\n\n"; } elseif($_SERVER["argv"][1] == "--config=sip") { #if($vars["ASTERISK_SIP_N"] == 0) exit; echo "[general]\n"; echo "port=5060\n"; echo "bindaddr=0.0.0.0\n"; echo "srvlookup=yes\n"; echo "context=default\n"; echo "disallow=all\n"; if(!empty($vars["ASTERISK_CODECS"])) { $codecs = explode(" ", $vars["ASTERISK_CODECS"]); foreach($codecs as $codec) { echo "allow=$codec\n"; } } echo "Localnet=".$vars["ASTERISK_LOCALNET"]."\n"; echo "canreinvite=yes\n"; echo "tos=reliability\n"; echo "externip=".$vars["ASTERISK_EXTERNIP"]."\n"; echo "nat=no\n"; echo "dtmfmode=info\n"; echo "qualify=no\n"; echo "language=".$vars["ASTERISK_LANGUAGE"]."\n\n"; if(isset($vars["ASTERISK_SIP"])) { echo "; Write Registries\n"; foreach($vars["ASTERISK_SIP"] as $sip) { if(is_integer(strpos($sip["NAME"], "t-online")) && is_integer(strpos($sip["USER"], ":"))) { list($tonlNummer, $email) = explode(":", $sip["USER"]); $auth = $tonlNummer.":".$sip["PASSWORD"].":".$email; } else { $auth = $sip["USER"].":".$sip["PASSWORD"]; if(is_integer(strpos($sip["NAME"], "t-online"))) err("name"); if(is_integer(strpos($sip["USER"], ":"))) err("user"); } echo "register => ".$auth."@".$sip["HOST"]."/".$sip["CALLERID"]."\n"; } echo "\n; Write SIP-Proxy accounts\n"; foreach($vars["ASTERISK_SIP"] as $sip) { if(is_integer(strpos($sip["NAME"], "t-online")) && is_integer(strpos($sip["USER"], ":"))) { list($fromuser, $username) = explode(":", $sip["USER"]); } else { $fromuser = $sip["USER"]; $username = $fromuser; } echo "[".$sip["NAME"]."]\n"; echo "type=friend\n"; echo "host=".$sip["HOST"]."\n"; echo "fromuser=$fromuser\n"; echo "username=$username\n"; echo "secret=".$sip["PASSWORD"]."\n"; echo "fromdomain=".$sip["HOST"]."\n"; echo "context=incoming\n"; echo "insecure=very\n"; echo "disallow=all\n"; $codecs = explode(" ", $vars["ASTERISK_CODECS"]); foreach($codecs as $codec) { echo "allow=$codec\n"; } echo "nat=yes\n\n"; } } echo "; Write SIP-Client accounts\n"; if(isset($vars["ASTERISK_PHONES"])) { foreach($vars["ASTERISK_PHONES"] as $phone) { if($phone["TYPE"] != "sip") continue; # Hier sollen nur SIP-Clients geschrieben werden echo "[".$phone["MSN"]."]\n"; echo "type=friend\n"; echo "secret=".$phone["PIN"]."\n"; echo "auth=md5\n"; echo "host=dynamic\n"; echo "reinvite=no\n"; echo "canreinvite=no\n"; echo "qualify=1000\n"; echo "dtmfmode=inband\n"; echo "disallow=all\n"; $codecs = explode(" ", $vars["ASTERISK_CODECS"]); foreach($codecs as $codec) { echo "allow=$codec\n"; } echo "context=outgoing\n"; } } } elseif($_SERVER["argv"][1] == "--config=rtp") { list($start, $end) = explode("-", $vars["ASTERISK_RTP_PORTS"]); echo "[general]\n"; echo "rtpstart=$start\n"; echo "rtpend=$end\n"; } elseif($_SERVER["argv"][1] == "--config=manager") { if($vars["ASTERISK_START_TAPI"] == "yes") { echo "[general]\n"; echo "enabled=yes\n"; echo "port=5038\n"; echo "bindaddr=0.0.0.0\n"; if(isset($vars["ASTERISK_TAPI_USER"])) { foreach($vars["ASTERISK_TAPI_USER"] as $user) { echo "\n[".$user["NAME"]."]\n"; echo "secret=".$user["PASS"]."\n"; echo "deny=0.0.0.0/0.0.0.0\n"; echo "permit=".$user["ACCESS"]."\n"; echo "read=system,call,log,verbose,command,agent,user\n"; echo "write=system,call,log,verbose,command,agent,user\n"; } } else { err("No TAPI users were set. You'll be unable to log into the TAPI interface"); } } else { echo "[general]\n"; echo "enabled=no\n"; echo "port=5038\n"; echo "bindaddr=0.0.0.0\n\n"; } } else echo "Usage: ./asterisk.php --config=extensions Write extensions.conf --config=capi Write capi.conf --config=sip Write sip.conf --config=rtp Write rtp.conf\n"; ?>