<html>
<head>
    <base href="https://wiki.asterisk.org/wiki">
            <link rel="stylesheet" href="/wiki/s/en/2171/18/9/_/styles/combined.css?spaceKey=TOP&amp;forWysiwyg=true" type="text/css">
    </head>
<body style="background: white;" bgcolor="white" class="email-body">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
    <h2><a href="https://wiki.asterisk.org/wiki/display/TOP/Hello+World+-+Asterisk+SCF+Style">Hello World - Asterisk SCF Style</a></h2>
    <h4>Page <b>edited</b> by             <a href="https://wiki.asterisk.org/wiki/display/~beagles">Brent Eagles</a>
    </h4>
        <div id="versionComment">
        <b>Comment:</b>
        Variety of formatting and wording changes as well as establishing links with other wiki content.<br />
    </div>
        <br/>
                         <h4>Changes (27)</h4>
                                 
    
<div id="page-diffs">
                    <table class="diff" cellpadding="0" cellspacing="0">
    
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >We will run the above components in separate icebox instances. It would be possible to run them in a single icebox instance, but doing it this way allows for the individual components&#39; configurations to be changed more easily. (TODO: why is that exactly? -beagles) <br> <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">The SIP Session Gateway and RTP Media Gateway require configuration. Once the components are all up and running we need to run component&#39;s respective [configurator script|Component Configuration] to configure relevant endpoints, transports, etc.. The configurator scripts are found in each component&#39;s source code repository in the config directory (e.g. sip/config/SIPConfigurator.py). <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">The SIP Session Gateway, RTP Media Gateway and Generic Media Format are configurable. Once the components are up and running we need to run component&#39;s respective [configurator script|Component Configuration] to configure relevant endpoints, transports, etc.. The configurator scripts are found in each component&#39;s source code repository in the config directory (e.g. sip/config/SIPConfigurator.py). In some cases, a component&#39;s default configuration is sufficient for basic operation. <br></td></tr>
            <tr><td class="diff-unchanged" > <br>{note} <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">The Generic Media Format component can also be configured if you are [adding a new media format]. Since the [built in supported media formats] are probably sufficient, we will skip that for now. <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">While the Generic Media Format and RTP Media components can be configured (e.g. if you are [adding a new media format]), the default configuration is fine for this example and we will skip them for now. <br></td></tr>
            <tr><td class="diff-unchanged" >{note} <br> <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >h1. Configuring the Components <br> <br></td></tr>
            <tr><td class="diff-changed-lines" >Once all of the components are up and running you are ready to configure them. <span class="diff-added-words"style="background-color: #dfd;">Since the default configuration works for most components, we only have to configure the SIP Session Gateway in order to handle calls. The SIP Session Gateway configurator script, {{SIPConfigurator.py}}, can be found in {{sip/config}}</span> <br></td></tr>
            <tr><td class="diff-unchanged" > <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">In this case, we need to configure the SIP component so that it will be able to handle calls. <br> <br>h2. Configuring the Generic Media Format Component <br> <br>You do not *really* have to do this, but it is good practice. Besides  <br> <br> <br>To do this, we will made use of the {{SIPConfigurator.py}} script in the {{config}} directory of the {{sip}} repository. <br> <br></td></tr>
            <tr><td class="diff-unchanged" >h3. Creating a configuration file <br> <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">The configurator reads in a .ini-style file with configuration options specified. Below is an example configuration file to use. <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">The configurator reads in a .ini-style file containing several sections that describe configuration items. Here is an example configuration file: <br></td></tr>
            <tr><td class="diff-unchanged" > <br>{noformat} <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >port=5060 <br> <br></td></tr>
            <tr><td class="diff-changed-lines" ># Now we need to configure endpoints. <span class="diff-deleted-words"style="color:#999;background-color:#fdd;text-decoration:line-through;">Endpoints each comprise their</span> <span class="diff-added-words"style="background-color: #dfd;">Each endpoint requires its own</span> <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;"># own section. <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;"># section <br></td></tr>
            <tr><td class="diff-unchanged" >[1000] <br># This tells the configurator that this section describes <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >{noformat} <br> <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">We will save this file in the {{sip}} repo&#39;s {{config}} directory as {{Sip.config}}. For your convenience, here is the file: <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">We will save this file as {{Sip.config}} in the {{config}} directory of the {{sip}} repository. To save typing (or cutting and pasting!) you can just download the file by clicking on the following link and saving it to the aforementioned location. <br></td></tr>
            <tr><td class="diff-unchanged" > <br>[Hello World - Asterisk SCF Style^Sip.config] <br> <br></td></tr>
            <tr><td class="diff-changed-lines" ><span class="diff-changed-words">h<span class="diff-deleted-chars"style="color:#999;background-color:#fdd;text-decoration:line-through;">3</span><span class="diff-added-chars"style="background-color: #dfd;">2</span>.</span> Running the configurator script <br></td></tr>
            <tr><td class="diff-unchanged" > <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">You&#39;ll now need to run the {{SipConfigurator.py}} script in order to apply the SIP configuration to the running SIP component. The configurator relies on some environment variables to be set, so let&#39;s go and do that! <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">Now we are ready to run the {{SipConfigurator.py}} script in order to apply the configuration to the running SIP Session Gateway. The configurator scripts are written in Python and use Ice for Python so there are some environment variables you may need to set. <br></td></tr>
            <tr><td class="diff-unchanged" > <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">First, you&#39;ll need to add a couple of items to your {{PYTHONPATH}}. You will need to add the path to Ice&#39;s python definitions (on Linux, this is /opt/Ice-3.4.2/python/ by default) and the path to the Asterisk SCF {{configurator}} repo. You will also need to set the {{ASTSCF_HOME}} environment variable. This is the path to the {{slice}} subdirectory of the Asterisk SCF {{slice}} repo. On Unix-like systems, this is done using the following command: <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">You need to modify the PYTHONPATH environment variable to get the python interpreter to find modules in locations other than its installation directories. Since Ice for Python is being used, we need to add the IcePy module&#39;s path for example: <br></td></tr>
            <tr><td class="diff-unchanged" > <br>{noformat} <br></td></tr>
            <tr><td class="diff-changed-lines" >$ export <span class="diff-deleted-words"style="color:#999;background-color:#fdd;text-decoration:line-through;">PYTHONPATH=/opt/Ice-3.4.2/python:/home/asteriskscf/gitall/configurator</span> <span class="diff-added-words"style="background-color: #dfd;">PYTHONPATH=/opt/Ice-3.4.2/python:$PYTHONPATH</span> <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">{noformat} <br> <br>The {{SIPConfigurator.py}} is built on the {{Configurator.py}} module found in the {{configurator}} source repository, so we need to add that too: <br>{noformat} <br>$ export PYTHONPATH=/home/asteriskscf/gitall/configurator:$PYTHONPATH <br>{noformat} <br> <br>{tip} <br>The PYTHONPATH modifications were split into two commands for clarity. You could easily combine them into a single command, e.g. {{export PYTHONPATH=/home/asteriskscf/gitall/configurator:/opt/Ice-3.4.2/python:$PYTHONPATH}} <br>{tip} <br> <br>The configurator scripts need to translate the Asterisk SCF Slice files so we need to specify an Asterisk SCF specific environment variable, {{ASTSCF_HOME}} that lets the scripts (and other Asterisk SCF tools) know where the Asterisk SCF installation is (or in this case, the sources).  <br> <br>{noformat} <br></td></tr>
            <tr><td class="diff-unchanged" >$ export ASTSCF_HOME=/home/asteriskscf/gitall/slice/slice <br>{noformat} <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >{noformat} <br> <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">This should successfully apply your configuration to the running SIP component. <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">{note} <br>The {{--wipe}} argument instructs the configurator script to invoke the appropriate commands to remove all existing configuration from the SIP Session Gateway&#39;s configuration object. <br>{note} <br></td></tr>
            <tr><td class="diff-unchanged" > <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">h3. Configuring the phones <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">This should successfully apply your configuration to the running SIP component.  <br></td></tr>
            <tr><td class="diff-unchanged" > <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">h2. Configuring the phones <br> <br></td></tr>
            <tr><td class="diff-unchanged" >With this setup, we&#39;ve named the phones {{1000}} and {{2000}}. Asterisk SCF&#39;s current endpoint matching scheme is to use the user part in the URI in the From header of an INVITE to determine which endpoint the message is originating from. This means that you will need to configure your phone to identify itself properly. The method will differ per phone. Options such as &quot;Caller ID number&quot; or &quot;Phone Number&quot; are generally good places to set the endpoint name. <br> <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >Now you should be able to place calls between the phones. You can dial each phone using the endpoint name for that phone. So for instance, if you wish to call phone {{2000}} then you can pick up phone {{1000}} and dial &quot;2000&quot;. <br> <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">With this base configuration in place, you can start to experiment with other configuration options, set up more advanced options like authentication, and maybe achieve inner peace...or inner peaches. <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">With the base configuration in place you can start experimenting with other configuration options, setting up more advanced options like authentication, multiple transports, and maybe achieve inner peace...or inner peaches. <br></td></tr>
    
            </table>
    </div>                            <h4>Full Content</h4>
                    <div class="notificationGreySide">
        <p>You've managed to get Asterisk SCF completely downloaded and compiled, so now what? In this tutorial, I will give a step-by-step set of instructions for getting two SIP phones to communicate with each other. We will be foregoing features such as registration and authentication for the sake of simplicity.</p>

<h1><a name="HelloWorld-AsteriskSCFStyle-AnOverview"></a>An Overview</h1>

<p>We will use the bare essentials for this. This will require the use of the following components:</p>

<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Component name </th>
<th class='confluenceTh'> Source code repository </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> Service Locator </td>
<td class='confluenceTd'> servicediscovery </td>
<td class='confluenceTd'> The other components use this to advertise themselves and to find components they rely upon to operate. </td>
</tr>
<tr>
<td class='confluenceTd'> SIP Session Gateway </td>
<td class='confluenceTd'> sip </td>
<td class='confluenceTd'> Handles SIP signaling. This is also where we configure SIP endpoints </td>
</tr>
<tr>
<td class='confluenceTd'> RTP Media Gateway </td>
<td class='confluenceTd'> media_rtp_pjmedia </td>
<td class='confluenceTd'> Handles RTP setup and media streams </td>
</tr>
<tr>
<td class='confluenceTd'> Basic Routing </td>
<td class='confluenceTd'> routing </td>
<td class='confluenceTd'> Endpoint lookup, call routing and bridging </td>
</tr>
<tr>
<td class='confluenceTd'> Bridge Manager </td>
<td class='confluenceTd'> bridging </td>
<td class='confluenceTd'> Connects Asterisk SCF and mediates signalling and under some circumstances media interconnection </td>
</tr>
<tr>
<td class='confluenceTd'> Generic Media Format </td>
<td class='confluenceTd'> mediaformatgeneric </td>
<td class='confluenceTd'> Hosts media format descriptor information </td>
</tr>
</tbody></table>
</div>


<p>We will run the above components in separate icebox instances. It would be possible to run them in a single icebox instance, but doing it this way allows for the individual components' configurations to be changed more easily. (TODO: why is that exactly? -beagles)</p>

<p>The SIP Session Gateway, RTP Media Gateway and Generic Media Format are configurable. Once the components are up and running we need to run component's respective <a href="/wiki/display/TOP/Component+Configuration" title="Component Configuration">configurator script</a> to configure relevant endpoints, transports, etc.. The configurator scripts are found in each component's source code repository in the config directory (e.g. sip/config/SIPConfigurator.py). In some cases, a component's default configuration is sufficient for basic operation.</p>

<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>While the Generic Media Format and RTP Media components can be configured (e.g. if you are <a href="/wiki/display/TOP/Adding+a+new+media+format" title="Adding a new media format">Adding a new media format</a>), the default configuration is fine for this example and we will skip them for now.</td></tr></table></div>

<p>The following examples are written with the assumption that you have a cloned the gitall repository into the <tt>/home/asteriskscf</tt> directory. For example, the SIP repository will be in <tt>/home/asteriskscf/gitall/sip</tt>. If gitall is in a different directory, then make the appropriate changes to the instructions below.</p>

<h1><a name="HelloWorld-AsteriskSCFStyle-StartingtheAsteriskSCFComponents"></a>Starting the Asterisk SCF Components</h1>

<p>The Asterisk SCF components are IceBox services so each component will require an <a href="/wiki/display/TOP/Common+Component+Icebox+Configuration" title="Common Component Icebox Configuration">icebox configuration</a> file to give it essential startup information such as the service entry point, the Service Locator proxy, what host/IP addresses and ports should be used and other component-specific options.</p>

<p>For your convenience, <a href="/wiki/display/TOP/Example+IceBox+Config+Files" title="Example IceBox Config Files">example icebox configuration files</a> are available that should work to get your components up and running. See the <a href="/wiki/display/TOP/Common+Component+Icebox+Configuration" title="Common Component Icebox Configuration">Common Component Icebox Configuration</a> page for more information on the contents of these files.</p>

<p>Once you have the IceBox configuration files, you can to start the components. Each component can be started by running IceBox with the path to the appropriate IceBox configuration file. The commands will have the general form of:</p>

<div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
<pre>$ icebox --Ice.Config=path/to/component/config/file
</pre>
</div></div>

<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>If you built a debug version on Windows (which you most likely did), you need to run iceboxd.exe not icebox.exe so that IceBox and your component both use the debug version of the Microsoft runtime libraries.</td></tr></table></div>

<p>For instance, if you have named the routing configuration file <tt>routing.icebox</tt> and saved it in the routing repository's config directory, then you would start the routing service using the command</p>

<div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
<pre>$ icebox --Ice.Config=/home/asteriskscf/gitall/routing/config/routing.icebox
</pre>
</div></div>

<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>It may be a good idea to start the components in a terminal window (console window on Windows) so you can see all of the output of the command. Unless you have set things up so all of the shared libraries, etc. are in default paths you are most likely doing this anyways.</td></tr></table></div>

<p>Since the example IceBox configuration files only load a single component, you need to run an <tt>icebox</tt> command for each one. A simple startup script is a good idea but left as an exercise for the reader (that is <b>you</b>!).</p>

<h1><a name="HelloWorld-AsteriskSCFStyle-ConfiguringtheComponents"></a>Configuring the Components</h1>

<p>Once all of the components are up and running you are ready to configure them. Since the default configuration works for most components, we only have to configure the SIP Session Gateway in order to handle calls. The SIP Session Gateway configurator script, <tt>SIPConfigurator.py</tt>, can be found in <tt>sip/config</tt> </p>

<h3><a name="HelloWorld-AsteriskSCFStyle-Creatingaconfigurationfile"></a>Creating a configuration file</h3>

<p>The configurator reads in a .ini-style file containing several sections that describe configuration items. Here is an example configuration file:</p>

<div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
<pre>
# First, we need to configure a transport for the SIP component to use.
# Feel free to give it whatever name you want.
[udp-transport]
# This tells the configurator what type of configuration
# section this is. In this case, we're configuring a
# UDP transport
type=transport-udp

# This tells the IP address and port to bind to for this transport.
# This can be an IPv4 or IPv6 address.
host=0.0.0.0
port=5060

# Now we need to configure endpoints. Each endpoint requires its own 
# section
[1000]
# This tells the configurator that this section describes
# an endpoint
type=endpoint

# The IP address or hostname and port of the endpoint.
targethost=&lt;IP address or hostname of endpoint 1000&gt;
targetport=5060

# The IP address and port that we tell the endpoint to
# send their SIP signaling to when we call it.
sourcehost=&lt;IP address of the Asterisk SCF server&gt;
sourceport=5060

# This specifies the allowable direction(s) for communications
# between Asterisk SCF and the endpoint. Setting this to "both"
# allows for both incoming and outgoing calls to be made with
# this endpoint.
direction=both

# This specifies what formats to offer in SDP offers and what
# formats to accept in an SDP answer. For our example, we will
# use 8000 Hz G.711 uLAW audio.
formats=ulaw/8000

# This endpoint will mostly be configured the same.
[2000]
type=endpoint
targethost=&lt;IP address or hostname of endpoint 2000&gt;
targetport=5060
sourceport=&lt;IP address of the Asterisk SCF server&gt;
sourceport=5060
direction=both
formats=ulaw/8000

</pre>
</div></div>

<p>We will save this file as <tt>Sip.config</tt> in the <tt>config</tt> directory of the <tt>sip</tt> repository. To save typing (or cutting and pasting!) you can just download the file by clicking on the following link and saving it to the aforementioned location.</p>

<p><a href="/wiki/download/attachments/19007195/Sip.config?version=2&amp;modificationDate=1323721147826">Sip.config</a></p>

<h2><a name="HelloWorld-AsteriskSCFStyle-Runningtheconfiguratorscript"></a>Running the configurator script</h2>

<p>Now we are ready to run the <tt>SipConfigurator.py</tt> script in order to apply the configuration to the running SIP Session Gateway. The configurator scripts are written in Python and use Ice for Python so there are some environment variables you may need to set.</p>

<p>You need to modify the PYTHONPATH environment variable to get the python interpreter to find modules in locations other than its installation directories. Since Ice for Python is being used, we need to add the IcePy module's path for example:</p>

<div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
<pre>$ export PYTHONPATH=/opt/Ice-3.4.2/python:$PYTHONPATH
</pre>
</div></div>

<p>The <tt>SIPConfigurator.py</tt> is built on the <tt>Configurator.py</tt> module found in the <tt>configurator</tt> source repository, so we need to add that too:</p>
<div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
<pre>$ export PYTHONPATH=/home/asteriskscf/gitall/configurator:$PYTHONPATH
</pre>
</div></div>

<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>The PYTHONPATH modifications were split into two commands for clarity. You could easily combine them into a single command, e.g. <tt>export PYTHONPATH=/home/asteriskscf/gitall/configurator:/opt/Ice-3.4.2/python:$PYTHONPATH</tt></td></tr></table></div>

<p>The configurator scripts need to translate the Asterisk SCF Slice files so we need to specify an Asterisk SCF specific environment variable, <tt>ASTSCF_HOME</tt> that lets the scripts (and other Asterisk SCF tools) know where the Asterisk SCF installation is (or in this case, the sources). </p>

<div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
<pre>$ export ASTSCF_HOME=/home/asteriskscf/gitall/slice/slice
</pre>
</div></div>

<p>Now that you have the appropriate environment variables set up, you can actually run the python script.</p>

<div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
<pre>$ cd /home/asteriskscf/gitall/sip/config
$ ./SipConfigurator.py --wipe --config=Sip.config --locator="LocatorService:tcp -p 4411"
</pre>
</div></div>

<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>The <tt>--wipe</tt> argument instructs the configurator script to invoke the appropriate commands to remove all existing configuration from the SIP Session Gateway's configuration object.</td></tr></table></div>

<p>This should successfully apply your configuration to the running SIP component. </p>

<h2><a name="HelloWorld-AsteriskSCFStyle-Configuringthephones"></a>Configuring the phones</h2>

<p>With this setup, we've named the phones <tt>1000</tt> and <tt>2000</tt>. Asterisk SCF's current endpoint matching scheme is to use the user part in the URI in the From header of an INVITE to determine which endpoint the message is originating from. This means that you will need to configure your phone to identify itself properly. The method will differ per phone. Options such as "Caller ID number" or "Phone Number" are generally good places to set the endpoint name.</p>

<h1><a name="HelloWorld-AsteriskSCFStyle-Placingthecall"></a>Placing the call</h1>

<p>Now you should be able to place calls between the phones. You can dial each phone using the endpoint name for that phone. So for instance, if you wish to call phone <tt>2000</tt> then you can pick up phone <tt>1000</tt> and dial "2000".</p>

<p>With the base configuration in place you can start experimenting with other configuration options, setting up more advanced options like authentication, multiple transports, and maybe achieve inner peace...or inner peaches.</p>
    </div>
        <div id="commentsSection" class="wiki-content pageSection">
        <div style="float: right;" class="grey">
                        <a href="https://wiki.asterisk.org/wiki/users/removespacenotification.action?spaceKey=TOP">Stop watching space</a>
            <span style="padding: 0px 5px;">|</span>
                <a href="https://wiki.asterisk.org/wiki/users/editmyemailsettings.action">Change email notification preferences</a>
</div>
        <a href="https://wiki.asterisk.org/wiki/display/TOP/Hello+World+-+Asterisk+SCF+Style">View Online</a>
        |
        <a href="https://wiki.asterisk.org/wiki/pages/diffpagesbyversion.action?pageId=19007195&revisedVersion=13&originalVersion=12">View Changes</a>
                |
        <a href="https://wiki.asterisk.org/wiki/display/TOP/Hello+World+-+Asterisk+SCF+Style?showComments=true&amp;showCommentArea=true#addcomment">Add Comment</a>
            </div>
</div>
</div>
</div>
</div>
</body>
</html>