โมดูล mod_xml_curl ทำให้ freeswitch server สามารถดึงคอนฟิกไฟล์จากที่เก็บไว้บน web server มาใช้งานได้ทันทีทันใด โดยไม่ต้อง restart freeswitch server หรือ reloadxml   โมดูล mod_xml_curl สามารถทำงานกับคอนฟิกต่างๆ ดังนี้

  • configuration: เช่น คอนฟิกสำหรับ mod_sofia (SIP stack)
  • directory: เช่น user directory คอนฟิกของ extensions
  • IVR: IVR menu ต่างๆ
  • dialplan: dialplan สำหรับ call routing
  • phrases: วลีต่างๆ ที่ใช้กับ say API

บทความในตอนนี้ เราจะคอนฟิกเฉพาะส่วน directory เท่านั้น โดยจะใช้ freeswitch-1.10.x บน Debian-11.x ที่เราติดตั้งในบทความตอนที่ 7 ที่ผ่านมา

 

1. เปิดใช้งาน mod_xml_curl   ไปที่ folder /etc/freeswitch/autoload_configs

edit ไฟล์ modules.conf.xml   เปิดใช้งาน module โดยการตัด comment ด้านหน้า (<!--) และ comment ด้านหลัง (-->) ออก เหลือดังนี้

<load module="mod_xml_curl"/>

 

2. คอนฟิกโมดูล mod_xml_curl   ไปที่ folder /etc/freeswitch/autoload_configs 

edit ไฟล์ xml_curl.conf.xml (ให้ดึงคอนฟิกจาก local web server)

======================================================================

<configuration name="xml_curl.conf" description="cURL XML Gateway">

  <bindings>

       <binding name="directory">

             <param name="method" value="GET"/>

             <param name="gateway-url" value="http://localhost/xml_curl/get_directory.php" bindings="directory"/>                 

       </binding>

  </bindings>

</configuration>

=====================================================================

แล้ว restart freeswitch

#systemctl restart freeswitch

 

3. ติดตั้ง web server, php (บน server เดียวกับ fressswitch)

#apt install apache2 libapache2-mod-php7.4 php7.4-fpm

#mkdir /var/www/html/xml_curl

edit ไฟล์ /var/www/html/xml_curl/get_directory.php ดังนี้

=====================================================================

<?php

 

    $users = [

        [

            'number' => '2000',

            'password' => 'ASDF2000',

            'name' => 'User 2000',

            'myVar' => '1234',

        ],

        [

            'number' => '2001',

            'password' => 'ASDF2001',

            'name' => 'User 2001',

            'myVar' => '1234',

        ],

        [

            'number' => '2002',

            'password' => 'ASDF2002',

            'name' => 'User 2002',

            'myVar' => '1234',

        ],

        [

            'number' => '2003',

            'password' => 'ASDF2003',

            'name' => 'User 2003',

            'myVar' => '1234',

        ],

        [

            'number' => '2004',

            'password' => 'ASDF2004',

            'name' => 'User 2004',

            'myVar' => '1234',

        ]

    ];

 

?>

 

<document type="freeswitch/xml">

    <section name="directory">

        <domain name="192.168.1.54">

            <params>

                <param name="dial-string" value="{presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}"/>

            </params>

            <groups>

                <group name="default">

                    <users>

                        <?php

                            foreach($users as $user) {

                        ?>

                        <user id="<?php echo $user['number']; ?>">

                            <params>

                                <param name="password" value="<?php echo $user['password']; ?>"/>

                            </params>

                            <variables>

                                <variable name="accountcode" value="<?php echo $user['number']; ?>"/>

                                <variable name="user_context" value="default"/>

                                <variable name="effective_caller_id_name" value="<?php echo $user['name']; ?>"/>

                                <variable name="effective_caller_id_number" value="<?php echo $user['number']; ?>"/>

                                <variable name="outbound_caller_id_name" value="<?php echo $user['name']; ?>"/>

                                <variable name="outbound_caller_id_number" value="<?php echo $user['number']; ?>"/>

                                <variable name="mySuperVariable" value="<?php echo $user['myVar']; ?>" />

                            </variables>

                        </user>

                        <?php } ?>

                    </users>

                </group>

            </groups>

        </domain>

    </section>

</document>

====================================================================

 

4. แก้ไข dialplan 

แก้ไข dialplan เพื่อรองรับ extensions กลุ่มใหม่ ที่เราเพิ่มผ่าน web server (ไฟล์ get_directory.php)

edit ไฟล์ /etc/freeswitch/dialplan/default.xml

แก้ส่วน Local_Extension

จาก "^(10[01][0-9])$"

เป็น "^(2[0-9][0-9][0-9])$"

แล้ว reloadxml (เข้า fs_cli แล้ว relaodxml)

หลังจากนั้นเราสามารถเพิ่ม extension 2000 ถึง 2999 ได้ทันทีทันใดโดยไม่ต้อง restart freeswitch หรือ reloadxml เลย

 

5. ทดสอบ 

คอนฟิก IP phone 2 ตัว แล้วลองโทรหากัน

 

6. เชื่อมต่อกับ database

เราจะเห็นว่าไฟล์ get_directory.php นั้นสามารถเขียนโปรแกรมเพิ่มเติมให้ดึงข้อมูล users จาก database ได้ ซึ่งจะมีประโยชน์มากในการจัดการระบบที่มี users จำนวนมากๆ แล้วเราจะทำในตอนต่อๆ ไป