คือ อยากทราบว่า พอมีวิธีหรือ Script
ในการเช็คว่า เครื่อง SIP Server ของเราสามารถ register กับทาง SIP Trunk ได้อยู่หรือป่าวครับ
แบบเช็คได้ทั้ง IP Authentication กับ Username/Password ครับ ขอบคุณครับ
nuiz เขียน:โปรแกรม MonAst น่าจะพอใช้งานได้นะครับ ผมเอาไว้มอนิเตอร์ User และ Trunk โดยเฉพาะ Trunk มีแสดงสถานะด้วยว่า Registered/UnRegistered
nuiz เขียน:สำหรับ SIP Trunk แบบไม่รีจิสเตอร์ เวลาเราเช็คด้วยคำสั่ง sip show registy ก็จะไม่เห็นครับ แต่เช็คด้วย sip show peers ก็จะมองเห็น และถ้าตอนคอนฟิก SIP Trunk นั้นใส่บรรทัด qualify=yes เข้าไปด้วย ก็จะมองเห็นคอลัมน์ Status ที่แสดงเวลาหน่วง (Rount Tip Time) ด้วย แต่นั่นก็เช็คได้แค่ว่า SIP Trunk นั้นตายหรือไม่ตาย (ลิ้งค์ดาวน์ เซอร์เวอร์เจ้ง อันนี้รู้ แต่ปัญหาอื่นๆบอกไม่ได้) แม้ว่าจะโชว์เวลา Status แต่ก็ไม่ได้บ่งบอกว่าเวลาโทรออกจะได้หรือไม่ได้ อย่างในกรณี Account ของเราเงินหมดมันก็จะโทรออกไม่ได้
สำหรับ SIP Trunk แบบไม่รีจิสเตอร์ (หรือแบบ Register ก็ตาม) ต้องมอนิเตอร์ค่า ASR (Answer Seizured Ratio) หรือไม่ก็ค่า ACD (Average Call Duration) หรือค่า ALoC (Average Length Of Call) ของ SIP Trunk นั้นครับ ว่าต่ำกว่าที่กำหนดไว้หรือเปล่า
ใน A2Billing มีฟีเจอร์อย่างว่านี้อยู่ ลองแกะๆดูครับ อยู่ในเมนู Maintenance -> Alarm ถ้าค่าต่ำกว่าที่กำหนด มันจะส่งเมล์แจ้ง มันส่งได้จริงๆนะครับ ลองแล้ว
แกะได้แล้ว เอาโค๊ดมาฝากด้วยนะครับ
#!/usr/bin/php
<?
$form = "name@domain.com";
$report_email = 'contact@domain.com';
$state = wots_up();
//echo "Status : [$state]\n";
if ($state == 'ok')
{
//grace, usually should go this route
exit;
}
else
{
//keep cool for 10 seconds, we try again.
sleep(10);
$state = wots_up();
$have_done = "We have retried in 10 seconds.\r\n";
}
if ($state == 'ok')
{
//lucky we tried
exit;
}
else
{
$have_done .= "Trying to reload the sip channels.\r\n";
$have_done .= shell_exec('/usr/sbin/asterisk -rx "module reload chan_sip"');
sleep(10);
$have_done .= "Reloaded sip channels and waited 10 seconds.\r\n";
$state = wots_up();
}
if ($state == 'ok')
{
//wipes the sweat
exit;
}
$status = "$have_done\r\n=====================have done above, the current status: =====================\r\n\r\n$status";
$status = str_replace("\n",'<br>',$status);
if($state=='requesting'){
$msg_err = 'Request Sent';
}elseif($state=='no_auth'){
$msg_err = 'No Authentication';
}elseif($state=='unregistered'){
$msg_err = 'Unregistered';
}elseif($state=='failed'){
$msg_err = 'Failed';
}elseif($state=='auth_sent'){
$msg_err = 'Auth. Sent';
}elseif($state=='rejected'){
$msg_err = 'Rejected';
}elseif($state=='timeout'){
$msg_err = 'Timeout';
}elseif($state=='unknown'){
$msg_err = 'Unknown';
}
$err = array("Request Sent","No Authentication","Unregistered","Failed","Auth. Sent","Rejected","Timeout","Unknown");
$status = str_replace($err,"<b style='color:red;'>$msg_err</b>",$status);
if ($state == 'requesting')
{
send_alert_email('Trunk has been sending registrating requests', $status);
}
elseif ($state == 'empty')
{
send_alert_email('Voip trunk registration status is empty', $status);
}
elseif ($state == 'no_auth')
{
send_alert_email('No Authentication is reported, wrong password?', $status);
}
elseif ($state == 'unregistered')
{
send_alert_email('We have Unregistered trunk', $status);
}
elseif ($state == 'failed')
{
send_alert_email('We have Registration failed trunk', $status);
}
elseif ($state == 'auth_sent')
{
send_alert_email('We have trunk with Auth. Sent status', $status);
}
elseif ($state == 'rejected')
{
send_alert_email('We have trunk with Rejected status', $status);
}
else
{
send_alert_email('Trunk status is not registered', "$state\r\n\r\n$status");
}
function wots_up()
{
global $status;
//Prob the trunk registration.
$status = shell_exec('/usr/sbin/asterisk -rx "sip show registry"');
if (strlen(trim($status)) == 0)
{
return 'empty';
}
$lines = explode("\n", str_replace("\r\n", "\n", trim($status)));
for ($i = 1; $i < count($lines); $i++)
{
echo "line $i : " . $lines[$i] . "\n";
if (strpos($lines[$i], 'Request Sent') !== false)
{
return 'requesting';
}
elseif(strpos($lines[$i], 'No Authentication') !== false)
{
return 'no_auth';
}
elseif(strpos($lines[$i], 'Unregistered') !== false)
{
return 'unregistered';
}
elseif (strpos($lines[$i], 'Failed') !== false)
{
return 'failed';
}
elseif (strpos($lines[$i], 'Auth. Sent') !== false)
{
return 'auth_sent';
}
elseif (strpos($lines[$i], 'Rejected') !== false)
{
return 'rejected';
}
elseif (strpos($lines[$i], 'Timeout') !== false)
{
return 'timeout';
}
elseif (strpos($lines[$i], 'Unknown') !== false)
{
return 'unknown';
}
$temp = preg_split('/\s+/', $lines[$i]);
if (!isset($temp[3]))
{
return "Can not extract Reg State for this line: " . $lines[$i];
}
elseif ($temp[3] <> "Registered")
{
return "Unknown Reg state for this line: " . $lines[$i];
}
}
return 'ok';
}
function send_alert_email($subject, $msg = '')
{
global $report_email,$from;
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= "X-Priority: 1 (Higuest)\n";
$headers .= "X-MSMail-Priority: High\n";
$headers .= "Importance: High\n";
$headers .= "From: $from\r\n";
mail($report_email, $subject, $msg, $headers);
}
?>
nuiz เขียน:สำหรับ SIP Trunk แบบไม่รีจิสเตอร์ เวลาเราเช็คด้วยคำสั่ง sip show registy ก็จะไม่เห็นครับ แต่เช็คด้วย sip show peers ก็จะมองเห็น และถ้าตอนคอนฟิก SIP Trunk นั้นใส่บรรทัด qualify=yes เข้าไปด้วย ก็จะมองเห็นคอลัมน์ Status ที่แสดงเวลาหน่วง (Rount Tip Time) ด้วย แต่นั่นก็เช็คได้แค่ว่า SIP Trunk นั้นตายหรือไม่ตาย (ลิ้งค์ดาวน์ เซอร์เวอร์เจ้ง อันนี้รู้ แต่ปัญหาอื่นๆบอกไม่ได้) แม้ว่าจะโชว์เวลา Status แต่ก็ไม่ได้บ่งบอกว่าเวลาโทรออกจะได้หรือไม่ได้ อย่างในกรณี Account ของเราเงินหมดมันก็จะโทรออกไม่ได้
สำหรับ SIP Trunk แบบไม่รีจิสเตอร์ (หรือแบบ Register ก็ตาม) ต้องมอนิเตอร์ค่า ASR (Answer Seizured Ratio) หรือไม่ก็ค่า ACD (Average Call Duration) หรือค่า ALoC (Average Length Of Call) ของ SIP Trunk นั้นครับ ว่าต่ำกว่าที่กำหนดไว้หรือเปล่า
ใน A2Billing มีฟีเจอร์อย่างว่านี้อยู่ ลองแกะๆดูครับ อยู่ในเมนู Maintenance -> Alarm ถ้าค่าต่ำกว่าที่กำหนด มันจะส่งเมล์แจ้ง มันส่งได้จริงๆนะครับ ลองแล้ว
แกะได้แล้ว เอาโค๊ดมาฝากด้วยนะครับ
nuiz เขียน:คอลั่มน์ Status เวลาเราใช้คำสั่ง sip show peers หน่ะครับ มันได้จากการส่ง OPTIONS ออกไป แล้วมี REPLY กลับมา (จะ REPLY กลับมาอีท่าไหนนั้นมันไม่สนใจครับ สนใจว่าได้กลับมาหรือเปล่า) แล้วคำนวณเวลานับแต่ส่ง OPTIONS จนได้ REPLY กลับมา เหมือนกับที่เราใช้คำสั่ง ping นั่นแหล่ะครับ
Status เกิดขึ้นได้เพราะเราใส่บรรทัด qualify=yes (หรือตัวเลข) ไว้ในตอนที่เราสร้าง SIP Trunk ครับ ถ้าเราคอมเมนต์บรรทัดนี้ไว้ คอลัมน์ Status จะกลายเป็น Unmonitored หน่ะครับ
ไม่เกี่ยวอะไรกับ Register ครับ
และสถานะ Status นี้มันใช้มอนิเตอร์ SIP Trunk ว่ายังทำงานอยู่เหรือเปล่า (หรือว่าดาวน์ไปแล้ว) ก็อาจจะใช้ Status นี้เช็คว่าดาวน์หรือไม่ดาวน์ก็ได้ครับ แต่ถึงแม้ว่าจะไม่ดาวน์ก็ไม่ได้บ่งบอกว่ามันจะใช้งานได้ อย่างเช่นกรณีของ True NetTalk ตอนนี้บน Server ผม เช็คอะไรก็ดีไปหมดทั้ง sip show registry, sip show peers แต่โทรไม่ออก เพราะ Server ของ True NetTalk เดี้ยงไปซะแล้ว
เช็คจาก Status ก็ดูได้ระดับหนึ่ง แต่ถ้าเช็คจาก ASR, ALOC ร่วมด้วย จะดีมากขึ้นไปอีกครับ
เขียน Script ม่ายเปนครับ เลยช่วยอะไรไม่ได้ กำลังๆๆ
ย้อนกลับไปยัง Asterisk SIP Server
กำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และ บุคคลทั่วไป 16 ท่าน