<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Main</title>
    <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283</link>
    <description />
    <item>
      <title>Admin - Networking 5.2</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Admin+-+Networking</link>
      <description>&lt;p&gt;Admin - Networking&lt;/p&gt;</description>
      <pubDate>Tue, 25 Sep 2012 09:29:47 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Admin+-+Networking</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:29:47Z</dc:date>
    </item>
    <item>
      <title>Creating Virtual and VLAN Interfaces 4.8</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Creating+Virtual+and+VLAN+Interfaces</link>
      <description>&lt;h3&gt;&lt;span style="color: black;"&gt;Creating Virtual ethernet and Vlan interfaces&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="color: black;"&gt;-&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;Virtual and Vlan interfaces can only be created on a configured and non-virtual interface.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: black;"&gt;-&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;The  syntax for virtual interface is eth&amp;lt;#&amp;gt;:&amp;lt;#&amp;gt; e.g. eth0:200  where 200 is a locally significant number to distinguish within the  blade.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: black;"&gt;-&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;The syntax for vlan interface is eth&amp;lt;#&amp;gt;.&amp;lt;#&amp;gt; e.g. eth1.100 where 100 is the VLAN ID tag used to send traffic.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a name="CreatingVirtualandVLANinterfaces-"&gt;&lt;/a&gt;&lt;span style="color: black;"&gt;Creating Virtual Ethernet Interface&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="color: black;"&gt;se-1-100-50-127&amp;gt; configure t&lt;/span&gt;&lt;br /&gt; &lt;span style="color: black;"&gt;Enter configuration commands, one per line. End with CNTL/Z.&lt;/span&gt;&lt;br /&gt; &lt;span style="color: black;"&gt;se-1-100-50-127(config)&amp;gt; interface eth0:200&lt;/span&gt;&lt;br /&gt; &lt;span style="color: black;"&gt;se-1-100-50-127(config-interface)&amp;gt; ip address 12.12.13.10 255.255.255.0&lt;/span&gt;&lt;br /&gt; &lt;span style="color: black;"&gt;se-1-100-50-127(config-interface)&amp;gt; end&lt;/span&gt;&lt;br /&gt; &lt;span style="color: black;"&gt;se-1-100-50-127&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: black;"&gt;-&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;Make sure on the IOS side a appropriate route is setup to direct traffic to this new network&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a name="CreatingVirtualandVLANinterfaces-"&gt;&lt;/a&gt;&lt;span style="color: black;"&gt;Creating VLAN interface&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="color: black;"&gt;se-1-100-50-127&amp;gt; configure t&lt;/span&gt;&lt;br /&gt; &lt;span style="color: black;"&gt;Enter configuration commands, one per line. End with CNTL/Z.&lt;/span&gt;&lt;br /&gt; &lt;span style="color: black;"&gt;se-1-100-50-127(config)&amp;gt; interface eth0.10&lt;/span&gt;&lt;br /&gt; &lt;span style="color: black;"&gt;se-1-100-50-127(config-interface)&amp;gt; ip address 10.7.8.9 255.255.255.0&lt;/span&gt;&lt;br /&gt; &lt;span style="color: black;"&gt;se-1-100-50-127(config-interface)&amp;gt; end&lt;/span&gt;&lt;br /&gt; &lt;span style="color: black;"&gt;se-1-100-50-127&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: black;"&gt;-&lt;/span&gt; &lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;On  top of making sure that the IOS side has the appropriate route to setup  traffic to the VLAN interface. Need to configure the IOS interface to  the DOT1Q mode (causes the interface to inject 802.1q VLAN tag)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: black;"&gt;-&lt;/span&gt; &lt;span style="color: black;"&gt;Note the DOT1Q mode  only affects the traffic flowing to and from this interface and not  injecting the VLAN tag for end to end traffic.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: black;"&gt;interface Integrated-Service-Engine1/0.1&lt;/span&gt;&lt;br /&gt; &lt;span style="color: black;"&gt;encapsulation dot1Q 10&lt;/span&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 25 Sep 2012 09:29:02 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Creating+Virtual+and+VLAN+Interfaces</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:29:02Z</dc:date>
    </item>
    <item>
      <title>CLI Service API 4.3</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;CLI+Service+API</link>
      <description>&lt;h2&gt;What is the CLI Service API?&lt;/h2&gt;
&lt;p&gt;The CLI service API allows your application to interact with the  underlying CLI server on the host.  Your application code can issue EXEC  mode commands or configuration mode CLI commands to dynamically query  and modify the AXP module configuration.  Multiple CLI commands of the  same type, exec or configuration, can be submitted as long as they are  separated by the comma delimiter.&lt;/p&gt;
&lt;h2&gt;&lt;a name="CLIServiceAPI-Whatpackagemustmyapplicationdependupontousethisapi?"&gt;&lt;/a&gt;What package must my application depend upon to use this api?&lt;/h2&gt;
&lt;p&gt;No package dependency is needed.  This functionality is built into the AXP Guest OS.&lt;/p&gt;
&lt;h2&gt;&lt;a name="CLIServiceAPI-DoIneedtoconfiguretheISRorAXPModuleforthisAPItowork?"&gt;&lt;/a&gt;Do I need to configure the ISR or AXP Module for this API to work?&lt;/h2&gt;
&lt;p&gt;No additional configuration is required.&lt;/p&gt;
&lt;h2&gt;&lt;a name="CLIServiceAPI-PleaseprovideasourcecodeexampleofthisAPI."&gt;&lt;/a&gt;Please provide a source code example of this API.&lt;/h2&gt;
&lt;div class="code panel" style="border-style: solid; border-width: 1px;"&gt;
&lt;div class="codeHeader panelHeader" style="border-bottom-width: 1px; border-bottom-style: solid;"&gt;&lt;strong&gt;CliServiceTest.java&lt;/strong&gt;&lt;/div&gt;
&lt;div class="codeContent panelContent"&gt;
&lt;pre class="code-java"&gt;&lt;span class="code-keyword"&gt;import&lt;/span&gt; com.cisco.aesop.apphosting.appreapi.*;&lt;br /&gt;&lt;span class="code-keyword"&gt;import&lt;/span&gt; java.io.*;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*Sample CliServiceTest class to query and configure the service module with *netconf over beep protocol. In a production level program,the *&lt;span class="code-object"&gt;System&lt;/span&gt;.out.println commands should be replaced by logging.&lt;br /&gt;*Be sure to replace the [router-ip] [port] strings in the configureSM *method with your router IP and the matching port number you set up on the *router &lt;span class="code-keyword"&gt;for&lt;/span&gt; netconf communication.&lt;br /&gt;*/&lt;br /&gt;&lt;span class="code-keyword"&gt;public&lt;/span&gt; class CliServiceTest{&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*Constructor&lt;br /&gt;*/&lt;br /&gt;&lt;span class="code-keyword"&gt;public&lt;/span&gt; CliServiceTest(){}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Checks &lt;span class="code-keyword"&gt;if&lt;/span&gt; netconf is already configured on the Service Module&lt;br /&gt;* @&lt;span class="code-keyword"&gt;return&lt;/span&gt; &lt;span class="code-keyword"&gt;true&lt;/span&gt; &lt;span class="code-keyword"&gt;if&lt;/span&gt; netconf configured, otherwise &lt;span class="code-keyword"&gt;false&lt;/span&gt;.&lt;br /&gt;* @&lt;span class="code-keyword"&gt;throws&lt;/span&gt; Exception&lt;br /&gt;*/&lt;br /&gt;&lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-object"&gt;boolean&lt;/span&gt; isNetconfConfiguredOnSM() &lt;span class="code-keyword"&gt;throws&lt;/span&gt; Exception{&lt;br /&gt;  &lt;span class="code-keyword"&gt;final&lt;/span&gt; &lt;span class="code-object"&gt;String&lt;/span&gt; cmd                = &lt;span class="code-quote"&gt;"show run | include netconf"&lt;/span&gt;;&lt;br /&gt;  &lt;span class="code-object"&gt;boolean&lt;/span&gt; result                  = &lt;span class="code-keyword"&gt;false&lt;/span&gt;;&lt;br /&gt;  CommonServiceImpl apiCall       = &lt;span class="code-keyword"&gt;new&lt;/span&gt; CommonServiceImpl();&lt;br /&gt;  AppreMessage msg                = &lt;span class="code-keyword"&gt;new&lt;/span&gt; AppreMessage();&lt;br /&gt;&lt;br /&gt;  &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(&lt;span class="code-quote"&gt;"Entering isNetconfConfiguredOnSM"&lt;/span&gt;);&lt;br /&gt;  msg.setRequest(cmd);&lt;br /&gt;  &lt;span class="code-keyword"&gt;if&lt;/span&gt;(apiCall.exec(msg) != AppreAPI.FAIL){&lt;br /&gt;    &lt;span class="code-object"&gt;String&lt;/span&gt; response = msg.getResponse();&lt;br /&gt;    &lt;span class="code-keyword"&gt;if&lt;/span&gt;(response.length()&amp;gt;0 &amp;amp;&amp;amp; response.indexOf(&lt;span class="code-quote"&gt;"netconf"&lt;/span&gt;)!=-1){&lt;br /&gt;      result = &lt;span class="code-keyword"&gt;true&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;span class="code-keyword"&gt;else&lt;/span&gt;{&lt;br /&gt;    &lt;span class="code-keyword"&gt;throw&lt;/span&gt; &lt;span class="code-keyword"&gt;new&lt;/span&gt; Exception(&lt;span class="code-quote"&gt;"Command failed "&lt;/span&gt; + cmd);&lt;br /&gt;  }&lt;br /&gt;  &lt;span class="code-keyword"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Copies the running configuration to the startup configuration&lt;br /&gt;* on the Service Module.&lt;br /&gt;* @&lt;span class="code-keyword"&gt;throws&lt;/span&gt; Exception&lt;br /&gt;*/&lt;br /&gt;&lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-object"&gt;boolean&lt;/span&gt; saveConfigurationOnSM() &lt;span class="code-keyword"&gt;throws&lt;/span&gt; Exception{&lt;br /&gt;  &lt;span class="code-keyword"&gt;final&lt;/span&gt; &lt;span class="code-object"&gt;String&lt;/span&gt; cmd                = &lt;span class="code-quote"&gt;"copy run start"&lt;/span&gt;;&lt;br /&gt;  &lt;span class="code-object"&gt;boolean&lt;/span&gt; result                  = &lt;span class="code-keyword"&gt;false&lt;/span&gt;;&lt;br /&gt;  CommonServiceImpl apiCall       = &lt;span class="code-keyword"&gt;new&lt;/span&gt; CommonServiceImpl();&lt;br /&gt;  AppreMessage msg                = &lt;span class="code-keyword"&gt;new&lt;/span&gt; AppreMessage();&lt;br /&gt;&lt;br /&gt;  &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(&lt;span class="code-quote"&gt;"Entering saveConfigurationOnSM"&lt;/span&gt;);&lt;br /&gt;  msg.setRequest(cmd);&lt;br /&gt;  &lt;span class="code-keyword"&gt;if&lt;/span&gt;(apiCall.exec(msg) != AppreAPI.FAIL){&lt;br /&gt;    result = &lt;span class="code-keyword"&gt;true&lt;/span&gt;;&lt;br /&gt;  }&lt;br /&gt;  &lt;span class="code-keyword"&gt;else&lt;/span&gt;{&lt;br /&gt;    &lt;span class="code-keyword"&gt;throw&lt;/span&gt; &lt;span class="code-keyword"&gt;new&lt;/span&gt; Exception(&lt;span class="code-quote"&gt;"Command failed "&lt;/span&gt; + cmd);&lt;br /&gt;  }&lt;br /&gt;  &lt;span class="code-keyword"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Configures netconf over beep on the service module&lt;br /&gt;* @&lt;span class="code-keyword"&gt;throws&lt;/span&gt; Exception&lt;br /&gt;*/&lt;br /&gt;&lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-object"&gt;boolean&lt;/span&gt; configureSM() &lt;span class="code-keyword"&gt;throws&lt;/span&gt; Exception {&lt;br /&gt;  &lt;span class="code-keyword"&gt;final&lt;/span&gt; &lt;span class="code-object"&gt;String&lt;/span&gt; cmd          = &lt;span class="code-quote"&gt;"netconf beep initiator [router-ip] [port],netconf max-sessions 16"&lt;/span&gt;;&lt;br /&gt;  &lt;span class="code-object"&gt;boolean&lt;/span&gt; result            = &lt;span class="code-keyword"&gt;false&lt;/span&gt;;&lt;br /&gt;  CommonServiceImpl apiCall = &lt;span class="code-keyword"&gt;new&lt;/span&gt; CommonServiceImpl();&lt;br /&gt;  AppreMessage msg          = &lt;span class="code-keyword"&gt;new&lt;/span&gt; AppreMessage();&lt;br /&gt;&lt;br /&gt;  &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(&lt;span class="code-quote"&gt;"Entering configureSM"&lt;/span&gt;);&lt;br /&gt;  msg.setRequest(cmd);&lt;br /&gt;  &lt;span class="code-keyword"&gt;if&lt;/span&gt;(apiCall.config(msg) != AppreAPI.FAIL){&lt;br /&gt;    result = &lt;span class="code-keyword"&gt;true&lt;/span&gt;;&lt;br /&gt;  }&lt;br /&gt;  &lt;span class="code-keyword"&gt;else&lt;/span&gt;{&lt;br /&gt;    &lt;span class="code-keyword"&gt;throw&lt;/span&gt; &lt;span class="code-keyword"&gt;new&lt;/span&gt; Exception(&lt;span class="code-quote"&gt;"Command failed "&lt;/span&gt; + cmd);&lt;br /&gt;  }&lt;br /&gt;  &lt;span class="code-keyword"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; void main(&lt;span class="code-object"&gt;String&lt;/span&gt;[] args){&lt;br /&gt;  &lt;span class="code-keyword"&gt;try&lt;/span&gt;{&lt;br /&gt;    &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(&lt;span class="code-quote"&gt;"Starting application."&lt;/span&gt;);&lt;br /&gt;    CliServiceTest IOS = &lt;span class="code-keyword"&gt;new&lt;/span&gt; CliServiceTest();&lt;br /&gt;    &lt;span class="code-keyword"&gt;if&lt;/span&gt;(!IOS.isNetconfConfiguredOnSM()){&lt;br /&gt;      &lt;span class="code-keyword"&gt;if&lt;/span&gt;(IOS.configureSM()){&lt;br /&gt;        IOS.saveConfigurationOnSM();&lt;br /&gt;        &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(&lt;span class="code-quote"&gt;"Configured service module."&lt;/span&gt;);&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="code-keyword"&gt;else&lt;/span&gt;{&lt;br /&gt;      &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(&lt;span class="code-quote"&gt;"Service module has already been configured."&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;span class="code-keyword"&gt;catch&lt;/span&gt;(Exception e){&lt;br /&gt;    &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(e.getMessage());&lt;br /&gt;  }&lt;br /&gt;  &lt;span class="code-keyword"&gt;finally&lt;/span&gt;{&lt;br /&gt;    &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(&lt;span class="code-quote"&gt;"Application done."&lt;/span&gt;);&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;&lt;a name="CLIServiceAPI-HowdoIcompilethesourcecodeexample?"&gt;&lt;/a&gt;How do I compile the source code example?&lt;/h2&gt;
&lt;p&gt;To compile this java source code you'll need the jar file  appreapi.jar. This jar file is provided in the AXP sdk.&amp;nbsp; So to compile  this code you command line would like something like:&lt;/p&gt;
&lt;p&gt;javac -classpath appreapi.jar CliServiceTest.java&lt;/p&gt;
&lt;h2&gt;&lt;a name="CLIServiceAPI-DoIneedtoincludetheappreapi.jarfileinmypackage?"&gt;&lt;/a&gt;Do I need to include the appreapi.jar file in my package?&lt;/h2&gt;
&lt;p&gt;No.  The jar file is included in the AXP Guest OS of your application and resides in the directory /usr/lib/java.&lt;/p&gt;
&lt;h2&gt;&lt;a name="CLIServiceAPI-WherearethelibraryfileslocatedinthesdkandGuestOSforotherlanguagesupportsuchasC,C\andPython?"&gt;&lt;/a&gt;Where are the library files located in the sdk and Guest OS for other language support such as C, C++ and Python?&lt;/h2&gt;
&lt;p&gt;The files for support of these languages in the sdk are located in  the directory axp-sdk.&amp;lt;version&amp;gt;.  In the AXP module Guest OS,  you'll find files supporting these languages in the /lib directory and  child directories below it.&lt;/p&gt;</description>
      <pubDate>Tue, 25 Sep 2012 09:27:52 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;CLI+Service+API</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:27:52Z</dc:date>
    </item>
    <item>
      <title>AXP Triggering API 3.9</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;AXP+Triggering+API</link>
      <description>&lt;h2&gt;What is the AXP Triggering API?&lt;/h2&gt;
&lt;p&gt;The AXP Triggering API allows your application to listen and respond  to real time events which occur on the system.  The API leverages the  Embedded Event Manager - EEM for event detection and tracking.&lt;/p&gt;
&lt;h2&gt;&lt;a name="AXPTriggeringAPI-ArethereanyspecialIOSimagesthatmyroutermustusetosupportthisAPI?"&gt;&lt;/a&gt;Are there any special IOS images that my router must use to support this API?&lt;/h2&gt;
&lt;p&gt;Yes.  You can use any of these these IOS image types.  Please also assure that the router and IOS version are supported by AXP.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;adventerpris&lt;/li&gt;
&lt;li&gt;advsecurity&lt;/li&gt;
&lt;li&gt;ipvoice&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a name="AXPTriggeringAPI-Whatpackagemustmyapplicationdependupontousethisapi?"&gt;&lt;/a&gt;What package must my application depend upon to use this api?&lt;/h2&gt;
&lt;p&gt;Your application must depend upon the package axp-eemapi.&amp;lt;platform&amp;gt;&amp;lt;version&amp;gt;.pkg&lt;/p&gt;
&lt;h2&gt;&lt;a name="AXPTriggeringAPI-HowwouldIpackagemyapplicationwiththisdependency?"&gt;&lt;/a&gt;How would I package my application with this dependency?&lt;/h2&gt;
&lt;p&gt;When you are creating your command line arguments to run the  packaging script pkg_build.sh, you must include the parameter --deps  '&amp;lt;dependency package ssid&amp;gt;,&amp;lt;dependency version&amp;gt;'. An example  is given below. Be sure to get your dependency package ssid by using  the script pkg_info.sh.&lt;/p&gt;
&lt;p&gt;--deps '6aee7d85-980a-4e20-b15a-c8ac882a968d,all'&lt;/p&gt;
&lt;h2&gt;&lt;a name="AXPTriggeringAPI-DoIhavetoinstallthisdependencypackageseparatelyontotheAXPmodule?"&gt;&lt;/a&gt;Do I have to install this dependency package separately onto the AXP module?&lt;/h2&gt;
&lt;p&gt;No, you can bundle it with your packaged application using the bundling script pkg_bundle.sh&lt;/p&gt;
&lt;h2&gt;&lt;a name="AXPTriggeringAPI-DoIneedtoconfiguretheISRorAXPModuleforthisAPItowork?"&gt;&lt;/a&gt;Do I need to configure the ISR or AXP Module for this API to work?&lt;/h2&gt;
&lt;p&gt;Yes, on the AXP Module you must configure the IOS user.  The IOS user  must have the same username/password that you assigned to your ISR for  tty log in.. An example is below.  The assumption below is that the ISR  has for tty login the username cisco and password cisco123 assigned to  it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;config t&lt;/em&gt;&lt;br /&gt; username ios cisco password cisco123&lt;br /&gt; &lt;em&gt;end&lt;/em&gt;&lt;br /&gt; &lt;em&gt;copy run start&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In addition, to track ios_config event types, you must set up netconf  over beep on the both the ISR and the AXP module. On the ISR you'll  type the commands below. Be sure to replace &amp;lt;port number&amp;gt; with  your actual port number. You can also use ACLs to limit communication,  but they're not shown here.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;config t&lt;/em&gt;&lt;br /&gt; &lt;em&gt;sasl profile SASL_PROFILE&lt;/em&gt;&lt;br /&gt; &lt;em&gt;mechanism anonymous&lt;/em&gt;&lt;br /&gt; &lt;em&gt;netconf beep listener &amp;lt;port number&amp;gt; sasl SASL_PROFILE&lt;/em&gt;&lt;br /&gt; &lt;em&gt;netconf max-sessions 16&lt;/em&gt;&lt;br /&gt; &lt;em&gt;end&lt;/em&gt;&lt;br /&gt; &lt;em&gt;copy run start&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;On the AXP service module, you can either manually add the netconf  over beep protocol or include it in your source code for you  application. The manual steps are shown below. The 'ISR IP address' must  match the ip of your ISR, and the 'port number' must also match the  chosen port number specified in the net conf beep commands on your ISR.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;config t&lt;/em&gt;&lt;br /&gt; &lt;em&gt;netconf beep initiator &amp;lt;ISR IP address&amp;gt; &amp;lt;port number&amp;gt;&lt;/em&gt;&lt;br /&gt; &lt;em&gt;netconf max-sessions 16&lt;/em&gt;&lt;br /&gt; &lt;em&gt;end&lt;/em&gt;&lt;br /&gt; &lt;em&gt;copy run start&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To track syslog events you must turn on the logging buffer on the router&lt;/p&gt;
&lt;p&gt;&lt;em&gt;config t&lt;/em&gt;&lt;br /&gt; &lt;em&gt;logging buffered &amp;lt;size&amp;gt;&lt;/em&gt;&lt;br /&gt; &lt;em&gt;end&lt;/em&gt;&lt;br /&gt; &lt;em&gt;copy run start&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/AXP%20Triggering%20API?#AXPTriggeringAPI-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return to top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="AXPTriggeringAPI-HowdoIregistereventstobetracked?"&gt;&lt;/a&gt;How do I register events to be tracked?&lt;/h2&gt;
&lt;p&gt;Event registration and tracking is a two step process.  The first  step is to define the events by either creating and packaging them in an  XML file or by entering the events via the CLI. The two methods to  define the events is shown below.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Method 1&lt;/strong&gt; - Create an xml file called eem_config.xml  and place it into your build source directory usr/eemapi.  For example  if you wanted to track ios_config, syslog and timer event types, your  eem_config.xml might look like the example shown below.&lt;br /&gt; &lt;em&gt;&amp;lt;Events&amp;gt;&lt;/em&gt;&lt;br /&gt; &lt;em&gt;&amp;lt;event name="myiosevent" type="ios_config" /&amp;gt;&lt;/em&gt;&lt;br /&gt; &lt;em&gt;&amp;lt;event name="mysyslogevent" type="syslog" parameters="pattern Ethernet" /&amp;gt;&lt;/em&gt;&lt;br /&gt; &lt;em&gt;&amp;lt;event name="mytimerevent" type="timer" parameters="watchdog name dog time 10" /&amp;gt;&lt;/em&gt;&lt;br /&gt; &lt;em&gt;&amp;lt;/Events&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Method 2&lt;/strong&gt; - Define your events via the CLI.  This  definition must be configured within the guest environment of your  packaged application. Note that you could do this same process  programmatically using the CLI Service API - not shown below.  After  defining a new event you must reset your virtual instance so that the  new event will be received.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;config t&lt;/em&gt;&lt;br /&gt; &lt;em&gt;app-service eemapi_app&lt;/em&gt;&lt;br /&gt; &lt;em&gt;event myiosevent register ios_config&lt;/em&gt;&lt;br /&gt; &lt;em&gt;event mysyslogevent register syslog "pattern Ethernet"&lt;/em&gt;&lt;br /&gt; &lt;em&gt;event mytimerevent register timer "watchdog name dog time 10"&lt;/em&gt;&lt;br /&gt; &lt;em&gt;end&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;copy run start&lt;/em&gt;&lt;br /&gt; &lt;em&gt;app-service eemapi_app&lt;/em&gt;&lt;br /&gt; &lt;em&gt;reset&lt;/em&gt;&lt;br /&gt; &lt;em&gt;end&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt;&lt;br /&gt; In the second step, your application must register these events with the  EventManager. Assuming you have a class called MyEventHandler that is a  child of class EventHandler, here is a snippet below.&lt;/p&gt;
&lt;div class="code panel" style="border-style: solid; border-width: 1px;"&gt;
&lt;div class="codeHeader panelHeader" style="border-bottom-width: 1px; border-bottom-style: solid;"&gt;&lt;strong&gt;snippet.txt&lt;/strong&gt;&lt;/div&gt;
&lt;div class="codeContent panelContent"&gt;
&lt;pre class="code-java"&gt;MyEventHandler eh = &lt;span class="code-keyword"&gt;new&lt;/span&gt; MyEventHandler();&lt;br /&gt;EventManager em = EventManager.getInstance();&lt;br /&gt;em.Register(eh,&lt;span class="code-quote"&gt;"ios_config syslog timer"&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/AXP%20Triggering%20API?#AXPTriggeringAPI-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return to top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="AXPTriggeringAPI-PleaseprovideasourcecodeexampleofthisAPI."&gt;&lt;/a&gt;Please provide a source code example of this API.&lt;/h2&gt;
&lt;div class="code panel" style="border-style: solid; border-width: 1px;"&gt;
&lt;div class="codeHeader panelHeader" style="border-bottom-width: 1px; border-bottom-style: solid;"&gt;&lt;strong&gt;MyEventHandler.java&lt;/strong&gt;&lt;/div&gt;
&lt;div class="codeContent panelContent"&gt;
&lt;pre class="code-java"&gt;&lt;span class="code-keyword"&gt;import&lt;/span&gt; com.cisco.aesop.apphosting.eemapi.*;&lt;br /&gt;&lt;span class="code-keyword"&gt;import&lt;/span&gt; com.cisco.aesop.apphosting.appreapi.*;&lt;br /&gt;&lt;span class="code-keyword"&gt;import&lt;/span&gt; java.io.*;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*Sample MyEventHandler class to configure the service module and modify the router&lt;br /&gt;*&lt;span class="code-keyword"&gt;interface&lt;/span&gt;. Uses the IOS Service API &lt;span class="code-keyword"&gt;for&lt;/span&gt; router modification and the CLI Service API to *configure the Service Module.&lt;br /&gt;*Be sure to replace the [router-ip] [port] strings in the configureSM method&lt;br /&gt;*with your router IP and the matching port number you set up on the router &lt;span class="code-keyword"&gt;for&lt;/span&gt;&lt;br /&gt;*netconf communication.&lt;br /&gt;*/&lt;br /&gt;class MyEventHandler &lt;span class="code-keyword"&gt;extends&lt;/span&gt; EventHandler{&lt;br /&gt;  &lt;span class="code-keyword"&gt;private&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; &lt;span class="code-keyword"&gt;final&lt;/span&gt; &lt;span class="code-object"&gt;String&lt;/span&gt; appName = &lt;span class="code-quote"&gt;"[eemapi_test] "&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;  MyEventHandler(){&lt;br /&gt;    &lt;span class="code-keyword"&gt;super&lt;/span&gt;(&lt;span class="code-keyword"&gt;null&lt;/span&gt;);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * callback method where detected event is reported to the application.  Use &lt;span class="code-keyword"&gt;this&lt;/span&gt;&lt;br /&gt;   * &lt;span class="code-keyword"&gt;for&lt;/span&gt; start of business logic.&lt;br /&gt;   * @param eventName  the name of the event&lt;br /&gt;   * @param eventType  the type of the event&lt;br /&gt;   * @param eventInfo  the event detail&lt;br /&gt;   */&lt;br /&gt;  &lt;span class="code-keyword"&gt;public&lt;/span&gt; void callback(&lt;span class="code-object"&gt;String&lt;/span&gt; eventName, &lt;span class="code-object"&gt;String&lt;/span&gt; eventType, &lt;span class="code-object"&gt;String&lt;/span&gt; eventInfo){&lt;br /&gt;     log(&lt;span class="code-quote"&gt;"callback got event "&lt;/span&gt; + eventName + &lt;span class="code-quote"&gt;"type "&lt;/span&gt; + eventType + &lt;span class="code-quote"&gt;" info "&lt;/span&gt; + eventInfo);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Prints the message to the screen and logs it to the application's&lt;br /&gt;   * /&lt;span class="code-keyword"&gt;var&lt;/span&gt;/log/messages.log file.&lt;br /&gt;   * @param data the message to be printed&lt;br /&gt;   */&lt;br /&gt;  &lt;span class="code-keyword"&gt;private&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; void log (&lt;span class="code-object"&gt;String&lt;/span&gt; data){&lt;br /&gt;    PrintWriter pw=&lt;span class="code-keyword"&gt;null&lt;/span&gt;;&lt;br /&gt;    &lt;span class="code-keyword"&gt;try&lt;/span&gt;{&lt;br /&gt;       &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(appName + data);&lt;br /&gt;       pw = &lt;span class="code-keyword"&gt;new&lt;/span&gt; PrintWriter(&lt;span class="code-keyword"&gt;new&lt;/span&gt; FileWriter(&lt;span class="code-quote"&gt;"/&lt;span class="code-keyword"&gt;var&lt;/span&gt;/log/messages.log"&lt;/span&gt;,&lt;span class="code-keyword"&gt;true&lt;/span&gt;));&lt;br /&gt;       pw.println(appName + data);&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="code-keyword"&gt;catch&lt;/span&gt;(Exception e){&lt;br /&gt;      &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(appName + &lt;span class="code-quote"&gt;" Exception "&lt;/span&gt; + e.getMessage());&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="code-keyword"&gt;finally&lt;/span&gt;{&lt;br /&gt;      &lt;span class="code-keyword"&gt;if&lt;/span&gt;(pw != &lt;span class="code-keyword"&gt;null&lt;/span&gt;){&lt;br /&gt;        pw.close();&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Checks &lt;span class="code-keyword"&gt;if&lt;/span&gt; netconf is already configured on the Service Module&lt;br /&gt;   * @&lt;span class="code-keyword"&gt;return&lt;/span&gt; &lt;span class="code-keyword"&gt;true&lt;/span&gt; &lt;span class="code-keyword"&gt;if&lt;/span&gt; netconf configured, otherwise &lt;span class="code-keyword"&gt;false&lt;/span&gt;.&lt;br /&gt;   * @&lt;span class="code-keyword"&gt;throws&lt;/span&gt; Exception&lt;br /&gt;   */&lt;br /&gt;  &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-object"&gt;boolean&lt;/span&gt; isNetconfConfiguredOnSM() &lt;span class="code-keyword"&gt;throws&lt;/span&gt; Exception{&lt;br /&gt;    &lt;span class="code-keyword"&gt;final&lt;/span&gt; &lt;span class="code-object"&gt;String&lt;/span&gt; cmd                = &lt;span class="code-quote"&gt;"show run | include netconf"&lt;/span&gt;;&lt;br /&gt;    &lt;span class="code-object"&gt;boolean&lt;/span&gt; result                  = &lt;span class="code-keyword"&gt;false&lt;/span&gt;;&lt;br /&gt;    CommonServiceImpl apiCall       = &lt;span class="code-keyword"&gt;new&lt;/span&gt; CommonServiceImpl();&lt;br /&gt;    AppreMessage msg                = &lt;span class="code-keyword"&gt;new&lt;/span&gt; AppreMessage();&lt;br /&gt;&lt;br /&gt;    log(&lt;span class="code-quote"&gt;"Entering isNetconfConfiguredOnSM"&lt;/span&gt;);&lt;br /&gt;    msg.setRequest(cmd);&lt;br /&gt;    &lt;span class="code-keyword"&gt;if&lt;/span&gt;(apiCall.exec(msg)!=AppreAPI.FAIL){&lt;br /&gt;      &lt;span class="code-object"&gt;String&lt;/span&gt; response = msg.getResponse();&lt;br /&gt;      &lt;span class="code-keyword"&gt;if&lt;/span&gt;(response.length()&amp;gt;0 &amp;amp;&amp;amp; response.indexOf(&lt;span class="code-quote"&gt;"netconf"&lt;/span&gt;)!=-1){&lt;br /&gt;        result = &lt;span class="code-keyword"&gt;true&lt;/span&gt;;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="code-keyword"&gt;else&lt;/span&gt;{&lt;br /&gt;      log(&lt;span class="code-quote"&gt;"Command failed "&lt;/span&gt; + cmd);&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="code-keyword"&gt;return&lt;/span&gt; result;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Copies the running configuration to the startup&lt;br /&gt;   * configuration on the Service Module.&lt;br /&gt;   * @&lt;span class="code-keyword"&gt;throws&lt;/span&gt; Exception&lt;br /&gt;   */&lt;br /&gt;  &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-object"&gt;boolean&lt;/span&gt; saveConfigurationOnSM() &lt;span class="code-keyword"&gt;throws&lt;/span&gt; Exception{&lt;br /&gt;    &lt;span class="code-keyword"&gt;final&lt;/span&gt; &lt;span class="code-object"&gt;String&lt;/span&gt; cmd                = &lt;span class="code-quote"&gt;"copy run start"&lt;/span&gt;;&lt;br /&gt;    &lt;span class="code-object"&gt;boolean&lt;/span&gt; result                  = &lt;span class="code-keyword"&gt;false&lt;/span&gt;;&lt;br /&gt;    CommonServiceImpl apiCall       = &lt;span class="code-keyword"&gt;new&lt;/span&gt; CommonServiceImpl();&lt;br /&gt;    AppreMessage msg                = &lt;span class="code-keyword"&gt;new&lt;/span&gt; AppreMessage();&lt;br /&gt;&lt;br /&gt;    log(&lt;span class="code-quote"&gt;"Entering saveConfigurationOnSM"&lt;/span&gt;);&lt;br /&gt;    msg.setRequest(cmd);&lt;br /&gt;    &lt;span class="code-keyword"&gt;if&lt;/span&gt;(apiCall.exec(msg)!=AppreAPI.FAIL){&lt;br /&gt;      result = &lt;span class="code-keyword"&gt;true&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="code-keyword"&gt;else&lt;/span&gt;{&lt;br /&gt;      log(&lt;span class="code-quote"&gt;"Command failed "&lt;/span&gt; + cmd);&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="code-keyword"&gt;return&lt;/span&gt; result;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Configures netconf over beep on the service module&lt;br /&gt;   * @&lt;span class="code-keyword"&gt;throws&lt;/span&gt; Exception&lt;br /&gt;   */&lt;br /&gt;  &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-object"&gt;boolean&lt;/span&gt; configureSM() &lt;span class="code-keyword"&gt;throws&lt;/span&gt; Exception {&lt;br /&gt;    &lt;span class="code-keyword"&gt;final&lt;/span&gt; &lt;span class="code-object"&gt;String&lt;/span&gt; cmd             = &lt;span class="code-quote"&gt;"netconf beep initiator [router-ip] [port],netconf max-sessions 16"&lt;/span&gt;;&lt;br /&gt;    &lt;span class="code-object"&gt;boolean&lt;/span&gt; result               = &lt;span class="code-keyword"&gt;false&lt;/span&gt;;&lt;br /&gt;    CommonServiceImpl apiCall    = &lt;span class="code-keyword"&gt;new&lt;/span&gt; CommonServiceImpl();&lt;br /&gt;    AppreMessage msg             = &lt;span class="code-keyword"&gt;new&lt;/span&gt; AppreMessage();&lt;br /&gt;&lt;br /&gt;    log(&lt;span class="code-quote"&gt;"Entering configureSM"&lt;/span&gt;);&lt;br /&gt;    msg.setRequest(cmd);&lt;br /&gt;    &lt;span class="code-keyword"&gt;if&lt;/span&gt;(apiCall.config(msg)!=AppreAPI.FAIL){&lt;br /&gt;      result = &lt;span class="code-keyword"&gt;true&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="code-keyword"&gt;else&lt;/span&gt;{&lt;br /&gt;      log(&lt;span class="code-quote"&gt;"Command failed "&lt;/span&gt; + cmd);&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="code-keyword"&gt;return&lt;/span&gt; result;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; void main (&lt;span class="code-object"&gt;String&lt;/span&gt; args[]){&lt;br /&gt;    &lt;span class="code-keyword"&gt;final&lt;/span&gt; &lt;span class="code-object"&gt;String&lt;/span&gt; EVENTS = &lt;span class="code-quote"&gt;"ios_config syslog timer"&lt;/span&gt;;&lt;br /&gt;    EventManager em = &lt;span class="code-keyword"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class="code-keyword"&gt;try&lt;/span&gt;{&lt;br /&gt;      &lt;span class="code-object"&gt;boolean&lt;/span&gt; isSMConfigured = &lt;span class="code-keyword"&gt;false&lt;/span&gt;;&lt;br /&gt;      log(&lt;span class="code-quote"&gt;"Starting application."&lt;/span&gt;);&lt;br /&gt;      MyEventHandler eh = &lt;span class="code-keyword"&gt;new&lt;/span&gt; MyEventHandler();&lt;br /&gt;      &lt;span class="code-keyword"&gt;if&lt;/span&gt;(!eh.isNetconfConfiguredOnSM()){&lt;br /&gt;        &lt;span class="code-keyword"&gt;if&lt;/span&gt;(eh.configureSM()){&lt;br /&gt;          eh.saveConfigurationOnSM();&lt;br /&gt;          isSMConfigured=&lt;span class="code-keyword"&gt;true&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;      &lt;span class="code-keyword"&gt;else&lt;/span&gt;{&lt;br /&gt;        MyEventHandler.log(&lt;span class="code-quote"&gt;"Skipping service module configuration"&lt;/span&gt;);&lt;br /&gt;        isSMConfigured=&lt;span class="code-keyword"&gt;true&lt;/span&gt;;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      em = EventManager.getInstance();&lt;br /&gt;      &lt;span class="code-keyword"&gt;if&lt;/span&gt;(em.Register(eh,EVENTS)==1){&lt;br /&gt;        MyEventHandler.log(&lt;span class="code-quote"&gt;"Registered events "&lt;/span&gt; + EVENTS);&lt;br /&gt;        MyEventHandler.log(&lt;span class="code-quote"&gt;"Going into wait state"&lt;/span&gt;);&lt;br /&gt;        &lt;span class="code-object"&gt;Object&lt;/span&gt; obj = &lt;span class="code-keyword"&gt;new&lt;/span&gt; &lt;span class="code-object"&gt;Object&lt;/span&gt;();&lt;br /&gt;        &lt;span class="code-keyword"&gt;synchronized&lt;/span&gt; (obj){&lt;br /&gt;          obj.wait();&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;      &lt;span class="code-keyword"&gt;else&lt;/span&gt;{&lt;br /&gt;        MyEventHandler.log(&lt;span class="code-quote"&gt;"Failed to register events "&lt;/span&gt; + EVENTS);&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="code-keyword"&gt;catch&lt;/span&gt;(Exception e){&lt;br /&gt;      MyEventHandler.log(&lt;span class="code-quote"&gt;"Caught exception "&lt;/span&gt; + e.getMessage());&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="code-keyword"&gt;finally&lt;/span&gt;{&lt;br /&gt;      &lt;span class="code-keyword"&gt;if&lt;/span&gt;(em!=&lt;span class="code-keyword"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; em.Deregister()==1){&lt;br /&gt;        MyEventHandler.log(&lt;span class="code-quote"&gt;"Deregistered events "&lt;/span&gt; + EVENTS);&lt;br /&gt;      }&lt;br /&gt;      &lt;span class="code-keyword"&gt;else&lt;/span&gt;{&lt;br /&gt;        MyEventHandler.log(&lt;span class="code-quote"&gt;"Failed to deregister events"&lt;/span&gt;+ EVENTS);&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/AXP%20Triggering%20API?#AXPTriggeringAPI-top"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="AXPTriggeringAPI-HowdoIcompilethesourcecodeexample?"&gt;&lt;/a&gt;How do I compile the source code example?&lt;/h2&gt;
&lt;p&gt;To compile this java source code you'll need the jar files  appreapi.jar and eemapi.jar. These jar files are provided in the AXP  sdk. So to compile this code your command line would like something  like:&lt;/p&gt;
&lt;p&gt;javac -classpath appreapi.jar:eemapi.jar MyEventHandler.java&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/AXP%20Triggering%20API?#AXPTriggeringAPI-top"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="AXPTriggeringAPI-DoIneedtoincludetheappreapi.jarandeemapi.jarfilesinmypackage?"&gt;&lt;/a&gt;Do I need to include the appreapi.jar and eemapi.jar files in my package?&lt;/h2&gt;
&lt;p&gt;No.  The appreapi.jar file is built into the AXP Guest OS, and the  eemapi.jar file is included with your  axp-eemapi.&amp;lt;platform&amp;gt;&amp;lt;version&amp;gt;.pkg, and gets added to the  AXP Guest OS when you install this package. In the AXP Guest OS of your  application these files reside in the directory /usr/lib/java.&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/AXP%20Triggering%20API?#AXPTriggeringAPI-top"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="AXPTriggeringAPI-Arethereanyadditionalfilesrequiredtorunthissourcecodeexample?"&gt;&lt;/a&gt;Are there any additional files required to run this source code example?&lt;/h2&gt;
&lt;p&gt;Yes. You also need file localsocket.jar.  This file is also included  with your axp-eemapi.&amp;lt;platform&amp;gt;&amp;lt;version&amp;gt;.pkg, and gets added  to the AXP Guest OS when you install this package. In the AXP Guest OS  of your application these files reside in the directory /usr/lib/java.&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/AXP%20Triggering%20API?#AXPTriggeringAPI-top"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="AXPTriggeringAPI-WherearethelibraryfileslocatedinthesdkandGuestOSforotherlanguagesupportsuchasC,C\andPython?"&gt;&lt;/a&gt;Where are the library files located in the sdk and Guest OS for other language support such as C, C++ and Python?&lt;/h2&gt;
&lt;p&gt;The files for support of these languages in the sdk are located in  the directory axp-sdk.&amp;lt;version&amp;gt;.  In the AXP module Guest OS,  you'll find files supporting these languages in the /lib directory and  child directories below it.&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/AXP%20Triggering%20API?#AXPTriggeringAPI-top"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 25 Sep 2012 09:26:45 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;AXP+Triggering+API</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:26:45Z</dc:date>
    </item>
    <item>
      <title>How to Install AXP via the Helper File 4.7</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;How+to+Install+AXP+via+the+Helper+File</link>
      <description>This installation requires that you set up both tftp and ftp servers. In the tftp public directory place the helper file into it. And on the same box place together into a different directory the installation files. The helper file has the named format axp-helper.&lt;platform&gt;&lt;version&gt; while the installation files have the named format of axp-k9.&lt;platform&gt;.&lt;version&gt;.pkg, axp-k9.&lt;platform&gt;.&lt;version&gt;.prt1 and axp-installer-k9.&lt;platform&gt;.&lt;version&gt;.prt1. Be sure that your blade can ping this server, and assure your tftp and ftp servers are running. Here are the steps to follow should you decide to do this process. This is a clean installation, so your previously existing software and packages on the blade will be removed.

1. At the AXP prompt type 'reload'
{{{
2. When the boot loader prompt comes up saying 'type *** to change boot configuration', type ***.
}}}
3. Type config.

4. Enter the following information for each prompt:

      IP Address : [Your AXP blade IP]
      Subnet mask : 255.255.255.0
      TFTP server : [IP of your tftp server]. Must be pingable from blade.
      Gateway : [Your router-side IP].
      Default Helper-file : [helper file name]
      Ethernet interface : internal
      External interface media : copper
      Default Boot : disk
      Default bootloader : secondary

5. Type 'show config' and verify your settings. Re-edit if necessary. Then type 'ping &lt;ip of your tftp server&gt;' to confirm network communication.

6. Type 'boot helper'.

7. Boot helper will load. Note that if your boot helper does not load, then check these common issues: your tftp server is not running, you haven't placed the helper file into your tftp server's public directory, you misnamed the helper file in your configuration. 

8. Select from the menu, 'install software'.

9. At the package name prompt enter the axp installation package name. This file was describe above and has the suffix .pkg.

10. At the url prompt enter the url ftp://&lt;server ip&gt;/&lt;dir&gt;

11. When prompted, enter the username and at the password prompt enter the password.

12. System may ask you if you want to retain old settings, do not retain them.

13. AXP platform will be installed.</description>
      <pubDate>Tue, 25 Sep 2012 09:24:23 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;How+to+Install+AXP+via+the+Helper+File</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:24:23Z</dc:date>
    </item>
    <item>
      <title>How AXP Upgrades Your Package Files 3.2</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;How+AXP+Upgrades+Your+Package+Files</link>
      <description>&lt;p&gt;During an upgrade the AXP system compares the manifest file included  in the upgrade package to the manifest file of the already installed  package.&amp;nbsp; Each manifest file contains a list of the file names, along  with the directory location and checksum of each file.&amp;nbsp; Regarding the  manifest file of the already installed package, there are two important  items to take note of: First, the manifest contains details of only  files that were installed onto the system, so files created by the  application are not tracked.&amp;nbsp; Second, the manifest does not track file  changes so even if these installed files are then modified or deleted on  the system by the application, their initial md5sum taken during the  installation is still what is used for comparison. &amp;nbsp; In the discussion  below I'll call the manifest file of the already installed package ManA  and the manifest file of the upgrade package ManU.&amp;nbsp; As the reader will  see, there are several possibilities that could occur based upon the  comparison of the manifest files.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;nbsp;The originally installed file will be removed if ManU does not contain the matching file location and name listed in ManA.&lt;/li&gt;
&lt;li&gt;The originally installed file will be overwritten if ManU contains  the same file location and name listed in ManA but with a different  checksum.&lt;/li&gt;
&lt;li&gt;The originally installed file will be left alone if ManU contains the same file location, name and checksum of the file in ManA.&lt;/li&gt;
&lt;li&gt;A new file will be added if ManU contains a file location, name that does not exist in ManA.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After being installed onto AXP files that are dynamically created by  the application are not added to the installation manifest and,  therefore, are essentially ignored during the upgrade.&amp;nbsp; In addition, the  installation manifest file does not pay attention to file changes such  as deletion or modifications that occur after the application is  installed.&amp;nbsp; As a result there are a few upgrade scenarios to consider.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Installed file A has a checksum value of Y and is changed by the  application to have a checksum value of Z, during the upgrade process  only the checksum value of Y will be considered.&lt;/li&gt;
&lt;li&gt;Installed file A is deleted by the application; however the upgrade  process will only consider the installed manifest file which will show  that file A still exists.&lt;/li&gt;
&lt;li&gt;File A is dynamically created by the application.&amp;nbsp; The upgrade  process will not remove this file because it does not exist in the  installed manifest file.&amp;nbsp; However, file A would be overwritten if the  upgrade manifest contains a file with the same location and name.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Finally, before the upgrade process begins the system shuts down the  virtual instance of the installation to be upgraded effectively stopping  the running applications so that timing issues do not occur.&lt;/p&gt;</description>
      <pubDate>Tue, 25 Sep 2012 09:23:57 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;How+AXP+Upgrades+Your+Package+Files</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:23:57Z</dc:date>
    </item>
    <item>
      <title>Configuring eth1 8.7</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Configuring+eth1</link>
      <description>&lt;h3&gt;Configuration of the Network-Modules' External Interface&lt;/h3&gt;
&lt;p&gt;On most network-module, there is an additional External Interface.  This External Interface is located on the faceplate of the  Network-Module and provides a RJ-45 connector.&lt;/p&gt;
&lt;p&gt;This interface can only be used (and therefore configured) by the  Network-Module; the ISR does not see this interface. This external  interface can be use to connect the Network-Module to a different  network.&lt;/p&gt;
&lt;p&gt;The configuration of the interface (eth1) is done similarly to any other IOS Modern Ethernet Interface.&lt;/p&gt;
&lt;p&gt;First, get to the Network-Module's console in configuration mode and enter the eth1 interface submode.&lt;/p&gt;
&lt;p&gt;Router#service-module integrated-Service-Engine 1/0&lt;br /&gt; session network-module&amp;gt; configure terminal&lt;br /&gt; Enter configuration commands, one per line. End with CNTL/Z.&lt;br /&gt; network-module(config)&amp;gt; interface eth1&lt;br /&gt; network-module(config-interface)&amp;gt; ip address 10.10.0.24 255.255.255.0&lt;br /&gt; network-module(config-interface)&amp;gt; no shutdown&lt;/p&gt;
&lt;p&gt;After the configuration of the external interface, make sure that the  network is connected and that you configure additional ip route if  required.&lt;/p&gt;</description>
      <pubDate>Tue, 25 Sep 2012 09:23:35 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Configuring+eth1</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:23:35Z</dc:date>
    </item>
    <item>
      <title>Application Install, Upgrade and Uninstall 4.5</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Application+Install%2C%20Upgrade+and+Uninstall</link>
      <description>&lt;h2&gt;Installing an Application&lt;/h2&gt;
&lt;p&gt;In the packaging section of our SFS various bundling scenarios are  explained. The following are the CLIs used to install a third party  signed add-on on a blade.&lt;/p&gt;
&lt;p&gt;1. use "software install clean" for the following bunling scenarios.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AXP host OS&lt;/li&gt;
&lt;li&gt;AXP host OS + 3rd party signed add-ons&lt;/li&gt;
&lt;li&gt;AXP host OS + cisco signed infrastructure add-ons + 3rd party signed add-ons&lt;br /&gt; 2. use "software install add" for the following bundling scenarios.&lt;/li&gt;
&lt;li&gt;3rd party signed add-ons&lt;/li&gt;
&lt;li&gt;cisco signed infrastructure add-ons + 3rd party signed add-ons&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AXP also supports single install mode that enables the user to bundle  a AXP host OS with 3rd party add-ons and install them together. The  user can either use "software install clean" CLI or helper image to  install this bundle on the blade.&lt;/p&gt;
&lt;h2&gt;&lt;a name="ApplicationInstall,UpgradeandUninstall-Upgrading/Downgradinganapplication"&gt;&lt;/a&gt;Upgrading /Downgrading an application&lt;/h2&gt;
&lt;p&gt;AXP Installer supports upgrade/downgrade of infrastructure and add-on  (both Cisco signed and 3rd party signed) packages. The upgrade  mechanism supported by the AXP installer is any-to-any upgrade, so the  user can upgrade from any version of the application to any other  version. The user must provide a full payload of the newer version of  the application. Since AXP supports upgrades based on Application UUID,  downgrade is provided using reverse upgrade.&lt;/p&gt;
&lt;p&gt;Foundation code base will be responsible for upgrading packages  created internally by Cisco. But AXP installer should check if any 3rd  party add-on subsystems are dependent on these packages and update their  unified link dependencies.&lt;/p&gt;
&lt;p&gt;The following CLI is used to upgrade/downgrade an application installed on the blade&lt;/p&gt;
&lt;p&gt;1. "software install upgrade" for the following bundles&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AXP host OS&lt;/li&gt;
&lt;li&gt;3rd party signed add-ons&lt;/li&gt;
&lt;li&gt;AXP host OS + 3rd party signed add-ons&lt;/li&gt;
&lt;li&gt;AXP host OS + 3rd party signed add-ons + cisco signed infrastructure add-ons &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a name="ApplicationInstall,UpgradeandUninstall-Uninstallinganapplication"&gt;&lt;/a&gt;Uninstalling an application&lt;/h2&gt;
&lt;p&gt;AXP supports uninstallation of an application. If the user uninstalls  the application all the resources allocated to the application are  released and claimed by AXP host OS.&lt;/p&gt;
&lt;p&gt;The following CLI is used to uninstall an application from the blade.&lt;/p&gt;
&lt;p&gt;1. "software uninstall" and select the subsystem to be removed from the menu displayed.&lt;/p&gt;</description>
      <pubDate>Tue, 25 Sep 2012 09:22:21 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Application+Install%2C%20Upgrade+and+Uninstall</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:22:21Z</dc:date>
    </item>
    <item>
      <title>Adding authentication to service module sessioning 3.3</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Adding+authentication+to+service+module+sessioning</link>
      <description>&lt;p&gt;There are two methods to add authentication and both are done on the ISR (router) and are very simple.&lt;/p&gt;
&lt;p&gt;1.&amp;nbsp; Create a username and password on the router. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;Example: &amp;nbsp;&lt;/p&gt;
&lt;p&gt;config t&lt;/p&gt;
&lt;p&gt;username brett password 0 pass123&lt;/p&gt;
&lt;p&gt;end&lt;/p&gt;
&lt;p&gt;copy run start&lt;/p&gt;
&lt;p&gt;2.&amp;nbsp; Follow step A or B.&lt;/p&gt;
&lt;p&gt;A.&amp;nbsp; config t&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; aaa new-model&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; end&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; copy run start&lt;/p&gt;
&lt;p&gt;B*.&amp;nbsp; config t&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; line 66&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; login local&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/p&gt;
&lt;p&gt;copy run start&lt;/p&gt;
&lt;p&gt;3.&amp;nbsp; Now session into the service module and you will see a request for the username and password. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;*&amp;nbsp;&amp;nbsp; Step B relies on knowing ISR and Service module communication line.&amp;nbsp; You can get this information via the following steps.&lt;/p&gt;
&lt;p&gt;1.&amp;nbsp; Session into the service module.&lt;/p&gt;
&lt;p&gt;2.&amp;nbsp; Exit back to the router by typing Ctl + Shift + 6, then type x&lt;/p&gt;
&lt;p&gt;3.&amp;nbsp;&amp;nbsp; Type 'show users'.&amp;nbsp; The data showing Line: tty, Host: incoming is the communication line.&lt;/p&gt;
&lt;p&gt;4. &amp;nbsp; You can return to the service module by pressing the &amp;lt;Enter&amp;gt; key.&lt;/p&gt;</description>
      <pubDate>Tue, 25 Sep 2012 09:21:43 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Adding+authentication+to+service+module+sessioning</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:21:43Z</dc:date>
    </item>
    <item>
      <title>Admin - Basics 3.3</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Admin+-+Basics</link>
      <description />
      <pubDate>Tue, 25 Sep 2012 09:21:03 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Admin+-+Basics</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:21:03Z</dc:date>
    </item>
    <item>
      <title>Admin - Add-On Packages and Features 2.2</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Admin+-+Add-On+Packages+and+Features</link>
      <description>&lt;div class="rbtoc1210989044010"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Admin%20-%20Add-On%20Packages%20and%20Features?#Admin-Add-OnPackagesandFeatures-1.AXPValueaddcomponents"&gt;1. AXP Value-add components&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Admin%20-%20Add-On%20Packages%20and%20Features?#Admin-Add-OnPackagesandFeatures-a.Netflowcollector"&gt;a. Netflow collector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Admin%20-%20Add-On%20Packages%20and%20Features?#Admin-Add-OnPackagesandFeatures-b.ExposingthesyslogservertoclientsontheLAN"&gt;b. Exposing the syslog server to clients on the LAN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Admin%20-%20Add-On%20Packages%20and%20Features?#Admin-Add-OnPackagesandFeatures-c.ProSystOSGI"&gt;c. ProSyst OSGI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-1.AXPValueaddcomponents"&gt;&lt;/a&gt;1. AXP Value-add components&lt;/h1&gt;
&lt;h2&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-a.Netflowcollector"&gt;&lt;/a&gt;a. Netflow collector&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;No explicit support here, 3rd party can add their own collector&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Admin%20-%20Add-On%20Packages%20and%20Features?#Admin-Add-OnPackagesandFeatures-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-b.ExposingthesyslogservertoclientsontheLAN"&gt;&lt;/a&gt;b. Exposing the syslog server to clients on the LAN&lt;/h2&gt;
&lt;h3&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-SetupSyslogServer(phaseII)"&gt;&lt;/a&gt;Set up Syslog Server (phase II)&lt;/h3&gt;
&lt;p&gt;AXP runs a syslog server that can receive log messages from remote  hosts. To use this functionality, the following needs to be done:&lt;/p&gt;
&lt;p&gt;1. Write code that uses syslog to log messages, or able to direct logs to syslog when running the program&lt;br /&gt; 2. Direct log messages to remote syslog&lt;br /&gt; 3. Setup AXP to run remote syslog server&lt;/p&gt;
&lt;h3&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-Writecodethatusessyslog"&gt;&lt;/a&gt;Write code that uses syslog&lt;/h3&gt;
&lt;h4&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-Cprograms"&gt;&lt;/a&gt;C programs&lt;/h4&gt;
&lt;p&gt;See this online resource for using the syslog API:&lt;br /&gt; &lt;a href="http://www.gnu.org/software/libc/manual/html_node/Submitting-Syslog-Messages.html#Submitting-Syslog-Messages" target="_top"&gt;http://www.gnu.org/software/libc/manual/html_node/Submitting-Syslog-Messages.html#Submitting-Syslog-Messages&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Example of using syslog API:&lt;/p&gt;
&lt;div class="code panel" style="border-style: solid; border-width: 1px;"&gt;
&lt;div class="codeHeader panelHeader" style="border-bottom-width: 1px; border-bottom-style: solid;"&gt;&lt;strong&gt;syslog.c&lt;/strong&gt;&lt;/div&gt;
&lt;div class="codeContent panelContent"&gt;
&lt;pre class="code-java"&gt;#include &lt;br /&gt;&lt;br /&gt;&lt;span class="code-object"&gt;int&lt;/span&gt; main(&lt;span class="code-object"&gt;int&lt;/span&gt; argc, &lt;span class="code-object"&gt;char&lt;/span&gt;* argv[]){&lt;br /&gt;   setlogmask (LOG_UPTO (LOG_DEBUG));&lt;br /&gt;   openlog(&lt;span class="code-quote"&gt;"myapp"&lt;/span&gt;, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);&lt;br /&gt;   syslog(LOG_DEBUG, &lt;span class="code-quote"&gt;"This is a debug message\n"&lt;/span&gt;);&lt;br /&gt;   syslog(LOG_INFO, &lt;span class="code-quote"&gt;"This is an info message\n"&lt;/span&gt;);&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-Javaprograms"&gt;&lt;/a&gt;Java programs&lt;/h4&gt;
&lt;p&gt;For java programs, developers can use the log4j module, see the following online resource:&lt;/p&gt;
&lt;p&gt;Example of using Java log4j API:&lt;/p&gt;
&lt;div class="code panel" style="border-style: solid; border-width: 1px;"&gt;
&lt;div class="codeHeader panelHeader" style="border-bottom-width: 1px; border-bottom-style: solid;"&gt;&lt;strong&gt;Logging.java&lt;/strong&gt;&lt;/div&gt;
&lt;div class="codeContent panelContent"&gt;
&lt;pre class="code-java"&gt;&lt;span class="code-keyword"&gt;import&lt;/span&gt; org.apache.log4j.*;&lt;br /&gt;&lt;br /&gt;class Logging {&lt;br /&gt;   &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; void main(&lt;span class="code-object"&gt;String&lt;/span&gt; args[]){&lt;br /&gt;      Logger x = Logger.getLogger(&lt;span class="code-quote"&gt;"foo"&lt;/span&gt;);&lt;br /&gt;      x.debug(&lt;span class="code-quote"&gt;"This is debug message"&lt;/span&gt;);&lt;br /&gt;      x.info(&lt;span class="code-quote"&gt;"This is info message"&lt;/span&gt;);&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-Directlogmessagestoremotesyslogserver"&gt;&lt;/a&gt;Direct log messages to remote syslog server&lt;/h3&gt;
&lt;h4&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-Cprograms"&gt;&lt;/a&gt;C programs&lt;/h4&gt;
&lt;p&gt;By default, C programs using the syslog API should be directed to the  local syslog server. In order to direct log messages from local syslog  server to remote syslog server, users need to configure the syslog  server config file, usually at /etc/syslog.conf, or /etc/syslog-ng.conf  if local syslog server is syslog-ng.&lt;/p&gt;
&lt;p&gt;For example, append the following line to the config file to redirect  all log messages of facility "local1" and priority "info" and higher to  "myblade"&lt;/p&gt;
&lt;p&gt;local1.info                                             @myblade&lt;/p&gt;
&lt;h4&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-Javaprograms"&gt;&lt;/a&gt;Java programs&lt;/h4&gt;
&lt;p&gt;Using the log4j, user can configure the syslog behavior by editing the log4j.properties file.&lt;/p&gt;
&lt;p&gt;log4j.rootLogger=DEBUG, mySyslog&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;mySyslog config&lt;br /&gt; log4j.appender.mySyslog.layout=org.apache.log4j.PatternLayout&lt;br /&gt; log4j.appender.mySyslog.layout.ConversionPattern=%p %t %c - %m%n&lt;br /&gt; log4j.appender.mySyslog.SyslogHost=myblade&lt;br /&gt; log4j.appender.mySyslog.Facility=USER&lt;br /&gt; log4j.appender.mySyslog.threshold=INFO&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-SetupAXPtoruntheremotesyslogserver"&gt;&lt;/a&gt;Set up AXP to run the remote syslog server&lt;/h3&gt;
&lt;p&gt;Use the CLI to enable the remote syslog server&lt;/p&gt;
&lt;p&gt;blade# config terminal&lt;br /&gt; (config)# syslog-server&lt;/p&gt;
&lt;p&gt;There are CLI to show remote syslog server status&lt;/p&gt;
&lt;p&gt;Syslog Server&lt;br /&gt; Status:                 RUNNING&lt;/p&gt;
&lt;p&gt;Also, there are CLIs to configure the number of files for rotation and the file size&lt;/p&gt;
&lt;p&gt;blade# config terminal&lt;br /&gt; (config)# syslog-server limit file-rotation 2 file-size 500&lt;/p&gt;
&lt;p&gt;The range for file-rotation is from 1 to 40. The range for file-size  is from 1 to 1000 (in MB). By default, file-rotation is 10 and file-size  is 20.&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Admin%20-%20Add-On%20Packages%20and%20Features?#Admin-Add-OnPackagesandFeatures-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-c.ProSystOSGI"&gt;&lt;/a&gt;c. ProSyst OSGI&lt;/h2&gt;
&lt;h3&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-Overview"&gt;&lt;/a&gt;Overview&lt;/h3&gt;
&lt;p&gt;The OSGi specification defines how Java applications or components  (bundles in OSGi term) can be remotely installed, started, stopped,  updated and uninstalled without requiring a reboot and post no impact to  the operation of the device.&lt;/p&gt;
&lt;p&gt;AXP has chosen and partnered with ProSyst, the leading commercial  OSGi software provider, to provide the OSGI framework to the customers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OSGi support by Cisco is provided via the optional infrastructure  add-on package, prosyst_mbs6.pkg, without any license key embedded.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;The current supported osgi package is ProSyst Embedded Server mBS6.0 Framework package 6.0.02&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;If customers choose not to use Cisco provided prosyst_osgi.pkg  (i.e. version is not compatible with their product etc.). Customers will  purchase the Cisco signed OSGI bundle directly from Prosyst and  packaged in their application packages for installation and used as per  their requirements.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-OSGIaddonpackage"&gt;&lt;/a&gt;OSGI add-on package&lt;/h3&gt;
&lt;p&gt;1. In general, customers who require OSGI support and would like  to leverage Cisco prosyst_osgi.pkg, need to purchase the license from  ProSyst directly.&lt;br /&gt; 2. Application developer needs to place the license key file  (domain.crp) in the AXP designated path, /opt (i.e. /opt/domain.crp ),  in their project tree. The key file will then be packaged inside the  Application add-on package.&lt;br /&gt; 3. The startup script for prosys_osgi.pkg will first copy the license key file before it starts up the mBeddedServer.&lt;/p&gt;
&lt;h3&gt;&lt;a name="Admin-Add-OnPackagesandFeatures-AccessOSGI"&gt;&lt;/a&gt;Access OSGI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AXP provides add-on CLI, connect osgi, to manage the OSGI framework.&lt;br /&gt; o &amp;gt; connect osgi&lt;/li&gt;
&lt;li&gt;This command will cross connect to the text console of the Prosyst  OSGI framework and allows administration to manage the OSGI framework by  means of Prosyst text commands (CLI) from there.&lt;/li&gt;
&lt;li&gt;This command is only available when prosys_mbs6.pkg infrastructure add_on package is installed.&lt;/li&gt;
&lt;/ul&gt;</description>
      <pubDate>Tue, 25 Sep 2012 09:20:40 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Admin+-+Add-On+Packages+and+Features</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:20:40Z</dc:date>
    </item>
    <item>
      <title>Application eXtension Platform Wiki 4.7</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Application+eXtension+Platform+Wiki</link>
      <description>&lt;p&gt;This is the home page for the Application Extension Platform space.&lt;/p&gt;</description>
      <pubDate>Tue, 25 Sep 2012 09:19:27 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Application+eXtension+Platform+Wiki</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:19:27Z</dc:date>
    </item>
    <item>
      <title>Blade IP Address Configuration 1.5</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Blade+IP+Address+Configuration</link>
      <description>&lt;h3&gt;&lt;span style="color: black;"&gt;Hardware Overview&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;The network-module circuit board has 2 Network Interfaces.&lt;/p&gt;
&lt;h3&gt;&lt;a name="BladeIPAddressConfiguration-"&gt;&lt;/a&gt;&lt;span style="color: black;"&gt;Internal Interface (eth0)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;The first Network Interface is internal between the ISR and the  network-module. This connection is used to exchange traffic between the  network interface and the ISR. For example, the console connection to  the network-module is connected through this interface.&lt;/p&gt;
&lt;h3&gt;&lt;a name="BladeIPAddressConfiguration-"&gt;&lt;/a&gt;&lt;span style="color: black;"&gt;Designation&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;1. On the ISR side (Cisco IOS), this interface is described as:  Service Interface Engine x/0 (where x is the network-module slot the  blade was inserted in).&lt;br /&gt; 2. On the network-module side (Linux), the same interface is designated as eth0.&lt;/p&gt;
&lt;h3&gt;&lt;a name="BladeIPAddressConfiguration-"&gt;&lt;/a&gt;&lt;span style="color: black;"&gt;External Interface (eth1)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;The other one, which is available on most of the network-module is  external. It varies between a Fast Ethernet (100Mb/s) or Gigabit  (1000Mb/s) and is available through an RJ-45 connector.&lt;/p&gt;
&lt;h3&gt;&lt;a name="BladeIPAddressConfiguration-"&gt;&lt;/a&gt;&lt;span style="color: black;"&gt;Designation&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;1. On the network-module side (Linux), this interface is designated  as eth1.Note: This interface is not visible from the ISR and can only be  configured and use on/by the network-module.&lt;/p&gt;
&lt;h3&gt;&lt;a name="BladeIPAddressConfiguration-"&gt;&lt;/a&gt;&lt;span style="color: black;"&gt;Configuring Network-Module internal interface&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;The first step in configuring the network-module interface is to  enter the configuration on the ISR side. The complete configuration  consist of:1. Configure the Integrated-Service-Engine interface&lt;br /&gt; 2. Configure the route proper route so that packets are relayed from the router to the network-module.&lt;/p&gt;
&lt;h3&gt;&lt;a name="BladeIPAddressConfiguration-"&gt;&lt;/a&gt;&lt;span style="color: black;"&gt;Integrated Service Engine Interface Configuration&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;To configure the internal interface on the ISR, you first need to get enable access to it.&lt;/p&gt;
&lt;p&gt;1. Enter the configuration mode:&lt;/p&gt;
&lt;p&gt;Router# config terminal&lt;/p&gt;
&lt;p&gt;Router(config)#&lt;/p&gt;
&lt;p&gt;2. Enter the interface mode&lt;/p&gt;
&lt;p&gt;Router(config)#interface integrated-Service-Engine 1/0&lt;/p&gt;
&lt;p&gt;Router(config-if)#&lt;/p&gt;
&lt;p&gt;3. Now it is time to enter the IP configuration parameters for the  network-module internal interface. Since the primary interface of the  network-module does not have a physical connector, it is accessed  through an ISR physical interface. One way to configure this is to set  the internal interface as an unnumbered interface.&lt;/p&gt;
&lt;p&gt;Here is a simple of such a configuration:&lt;/p&gt;
&lt;p&gt;interface Integrated-Service-Engine1/0&lt;/p&gt;
&lt;p&gt;ip unnumbered FastEthernet0/0&lt;/p&gt;
&lt;p&gt;service-module ip address&amp;nbsp;192.168.1.3 255.255.255.0&amp;nbsp;&lt;/p&gt;
&lt;p&gt;service-module ip default-gateway 192.168.1.2&lt;/p&gt;
&lt;p&gt;In the previosus configuration example, the ip unnumbered  FastEthernet0/0 is used so that we can avoid using an additional IP  Address for the Integrated-Service-Engine1/0 interface on the IOS side.&lt;/p&gt;
&lt;h3&gt;&lt;a name="BladeIPAddressConfiguration-"&gt;&lt;/a&gt;&lt;span style="color: black;"&gt;Network-Module Routing Configuration (IOS)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Once the Network-Module interface on the IOS side is configured, the  configuration of a route is necessary. A specific route to redirect  traffic from the router to the Network-Module internal interface is  required.This is achieved by creating a route to a single host (or ip  address) specifying the ip address previously assigned through  configuration of the Network-Module and using the 255.255.255.255  network mask to redirect to the Network-Module's interface.&lt;/p&gt;
&lt;p&gt;First get to the IOS configuration mode:&lt;/p&gt;
&lt;p&gt;Router# configure terminal&lt;/p&gt;
&lt;p&gt;Router(config)# ip route 192.168.1.3&amp;nbsp;255.255.255.255 Integrated-Service-Engine1/0&lt;/p&gt;</description>
      <pubDate>Tue, 25 Sep 2012 09:19:09 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Blade+IP+Address+Configuration</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:19:09Z</dc:date>
    </item>
    <item>
      <title>SSH Access to Blade 4.9</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;SSH+Access+to+Blade</link>
      <description>&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;AXP provides secure shell (SSH) access to the AXP CLI through a  default user, sysadmin, that acts like a system administrator. The  password for the default system administrator must be configured by the  user through the CLI, before SSH access to the AXP CLI. This initial  configuration gives users direct SSH access to the AXP CLI and also  allows them to perform remote configuration without having to constantly  access Cisco IOS and telnet into the service module.&lt;/p&gt;
&lt;h3&gt;&lt;a name="SSHAccesstoBlade-HowTo"&gt;&lt;/a&gt;How To&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Configure password protection&lt;br /&gt; o For direct SSH access to the AXP CLI, a user must first telnet into the service module and configure the password.&lt;br /&gt; o If "service password-encryption" is enabled, system will encrypt the  clear text password entered and saved it in the encrypted format in the  configuration file.&lt;br /&gt; o If user prefers to keep clear text password, then "service password-encryption" shall be disabled with no....&lt;br /&gt; o no service password-encryption&lt;br /&gt; o no username sysadmin password [ 0 | APPLICATIONEXTENSIONPLATFORM:7] clear-password-string&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Configure SSH server&lt;br /&gt; o SSH access to CLI server opens up the SSH channel to allow remote  access to AXP blade. This potentially raises security concern. The  following configuration allows user to have more control over SSH  service.&lt;br /&gt; o no ip ssh server&lt;br /&gt; + This command will enable the SSH service (i.e. starts the SSHD  daemon). Default SSH service is enabled. When "no ip ssh server" is  configured and sshd was running, SSHD is instructed to stop. This will  cause AXP to no longer accept new SSH session but will keep existing SSH  session alive.&lt;br /&gt; o no ip ssh interface interface&lt;br /&gt; + This command will explicitly specify which interface SSHD should  listen on for incoming connection. If no such statement specified  (default), SSHD will listen on all interfaces.&lt;br /&gt; + In the case that SSHD is configured to listen to specific network  interfaces (explicit configuration), an ip address change of one of  those interface will not be detected by SSHD causing the inability of  SSHD to accept connection on the modified interface. The workaround for  this is to restart SSHD or the blade.&lt;/li&gt;
&lt;li&gt;Diagnose SSH server&lt;br /&gt; o show processes&lt;br /&gt; + Use this command to view the state of the SSHD process&lt;br /&gt; o show processes memory&lt;br /&gt; + Use this command to display the information of the sshd process when running. &lt;/li&gt;
&lt;/ul&gt;</description>
      <pubDate>Tue, 25 Sep 2012 09:18:53 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;SSH+Access+to+Blade</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:18:53Z</dc:date>
    </item>
    <item>
      <title>SSH Access to Router 3.9</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;SSH+Access+to+Router</link>
      <description>&lt;p&gt;Your IOS image on your router must be a k9 image that supports encryption.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Configuration&lt;/strong&gt;Router&amp;gt; config terminal&lt;br /&gt; Router (config)# hostname&amp;nbsp;&amp;lt;the name of the router&amp;gt;&lt;br /&gt; Router (config)# ip domain-name domainname &amp;lt;a domain that the router services&amp;gt;&lt;/p&gt;
&lt;p&gt;At this point, you're ready to enable the SSH server on the router.  To enable the SSH server, you must first generate an RSA key pair using  the following command:&lt;/p&gt;
&lt;p&gt;Router (config)# crypto key generate rsa&lt;/p&gt;
&lt;p&gt;Generating an RSA key pair for the router automatically enables SSH.  If you delete the RSA key pair, this automatically disables the SSH  server.&lt;/p&gt;
&lt;p&gt;The last step to implementing SSH is to enable Authentication,  Authorization, and Accounting (AAA). When you configure AAA, specify  usernames and passwords, the session timeout, and the number of retries  allowed during a connection attempt. Use the global commands, as shown  below:&lt;/p&gt;
&lt;p&gt;Router (config)# aaa new-model&lt;br /&gt; Router (config)# username &amp;lt;username&amp;gt; password &amp;lt;password&amp;gt;&lt;br /&gt; Router (config)# ip ssh time-out &amp;lt;second&amp;gt;&lt;br /&gt; Router (config)# ip ssh authentication-retries &amp;lt;value&amp;gt;&lt;/p&gt;
&lt;p&gt;To verify that you've configured SSH and it's running on the router, execute the following command:&lt;/p&gt;
&lt;p&gt;Router# show ip ssh&lt;/p&gt;
&lt;p&gt;After verifying the configuration, you're ready to force the users  that you added during the AAA configuration to use SSH instead of  Telnet. You can do so by requiring SSH for virtual terminal (vty)  connections.&lt;br /&gt; Here's an example:&lt;/p&gt;
&lt;p&gt;Router (config)# line vty 0 4&lt;br /&gt; Router (config-line)# transport input SSH&lt;/p&gt;</description>
      <pubDate>Tue, 25 Sep 2012 09:10:47 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;SSH+Access+to+Router</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:10:47Z</dc:date>
    </item>
    <item>
      <title>Routing packets to Blade 5.1</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Routing+packets+to+Blade</link>
      <description>&lt;h3&gt;Network-Module Routing Configuration (IOS)&lt;/h3&gt;
&lt;p&gt;Once the Network-Module interface on the IOS side is configured, the  configuration of a route is necessary. A specific route to redirect  traffic from the router to the Network-Module internal interface is  required.&lt;/p&gt;
&lt;p&gt;This is achieved by creating a route to a single host (or ip address)  specifying the ip address previously assigned through configuration of  the Network-Module and using the 255.255.255.255 network mask to  redirect to the Network-Module's interface.&lt;/p&gt;
&lt;p&gt;First get to the IOS configuration mode:&lt;/p&gt;
&lt;p&gt;Router# configure terminal Router(config)# ip route 10.10.3.188 255.255.255.255 Integrated-Service-Engine1/0&lt;/p&gt;
&lt;p&gt;Router# end&lt;/p&gt;
&lt;h3&gt;&lt;a name="RoutingpacketstoBlade-"&gt;&lt;/a&gt;&lt;span style="color: black;"&gt;Access to the Network-Module's console&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;After the configuration of the Network-Module's interface and route  is completed, we should be able to connect to the console of the  Network-Module by typing&lt;/p&gt;
&lt;p&gt;Router# service-module integrated-Service-Engine 1/0 session&lt;/p&gt;
&lt;p&gt;se-192-168-1-3&amp;gt;&lt;/p&gt;</description>
      <pubDate>Tue, 25 Sep 2012 09:10:29 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Routing+packets+to+Blade</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T09:10:29Z</dc:date>
    </item>
    <item>
      <title>Blade Installation 1.9</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Blade+Installation</link>
      <description>&lt;h3&gt;Hardware description&lt;/h3&gt;
&lt;p&gt;The network-module is placed in a compatible Cisco ISR chassis. The  Cisco ISR provides power, network connectivity and software interfaces  to it. The network-module is a self-contained computer which can host  3rd party application.&lt;/p&gt;
&lt;p&gt;Different type of network-module are available for different performance need.&lt;/p&gt;
&lt;h3&gt;&lt;a name="BladeInstallation-CiscoISRcompatibility"&gt;&lt;/a&gt;Cisco ISR compatibility&lt;/h3&gt;
&lt;p&gt;The network-modules are compatible with certain Cisco ISRs. Cisco ISR  also require to be loaded with the right Cisco IOS to recognize and  enable the network-module.&lt;/p&gt;
&lt;p&gt;Network-Module vs Cisco ISR&lt;br /&gt; Network-Module Hardware Description Cisco ISR Cisco IOS Version External Interface&lt;br /&gt; AIM-APPRE-102-K9 CPU: 300Mhz, Mem: 256MB, Flash: 1GB Cisco 1841 only 12.4(15)T No&lt;br /&gt; NME-APPRE-302-K9 CPU: 1.0Ghz, Mem: 512MB, HDD: 80GB All Cisco ISRs 12.4(15)T Yes&lt;br /&gt; NME-APPRE-522-K9 CPU: 1.4Ghz, Mem: 2048GB, HDD: 160GB Cisco 3800 12.4(15)T Yes&lt;/p&gt;
&lt;p&gt;Physical Installation of Network-Module&lt;/p&gt;
&lt;p&gt;Note to writer: This section assumes that the ISR is already installed, is console available, has power and network connectivity&lt;/p&gt;
&lt;p&gt;The network module need to first be installed in the ISR. The  network-module is not a hot-swappable card; the ISR first needs to be  powered off prior to insert the blade.&lt;/p&gt;
&lt;p&gt;Follow the following steps to physically install the network-module inside the Cisco ISR.&lt;/p&gt;
&lt;p&gt;1. Power off the Cisco ISR&lt;br /&gt; 2. Remove the a network-module face plate by unscrewing the 2 Phillips head bolts&lt;br /&gt; 3. Grab the netork-module by its handle, slide in the module in the ISR&lt;br /&gt; 4. Secure the network-module by tightening the 2 screws from the Network-Module face-plate to the ISR&lt;br /&gt; 5. Power the Cisco ISR back&lt;/p&gt;
&lt;p&gt;After the Cisco ISR power is restored, monitor its boot process  through the console. After the ISR boot sequence completes, verify that  the "EN" led on the Network-Module is lit up.&lt;/p&gt;</description>
      <pubDate>Tue, 25 Sep 2012 03:58:05 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Blade+Installation</guid>
      <dc:creator>Marjie Ennis Floyd</dc:creator>
      <dc:date>2012-09-25T03:58:05Z</dc:date>
    </item>
    <item>
      <title>Wiki Home 1.1</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Wiki+Home</link>
      <description>This is the home page for the Application Extension Platform space. Use links on the left to display content</description>
      <pubDate>Thu, 16 Sep 2010 22:08:08 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Wiki+Home</guid>
      <dc:creator>David Nguyen</dc:creator>
      <dc:date>2010-09-16T22:08:08Z</dc:date>
    </item>
    <item>
      <title>Development - Overview 1.0</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Development+-+Overview</link>
      <description>&lt;h1&gt;1. Initial development setup&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;InitialDevelopmentSetup?&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a name="Development-Overview-2.DeveloperLinuxboxrequirements"&gt;&lt;/a&gt;2. Developer Linux box requirements&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;DeveloperLinuxBoxHWRequirement?&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a name="Development-Overview-3.Developeroverview"&gt;&lt;/a&gt;3. Developer overview&lt;/h1&gt;
&lt;h2&gt;&lt;a name="Development-Overview-a.Highleveloverviewofarchitecture.Howapplicationsarebuiltandinstalled."&gt;&lt;/a&gt;a. High level overview of architecture. How applications are built and installed.&lt;/h2&gt;
&lt;p&gt;AXP operating system hosting environment consists of a Linux-Vserver  built on top of Cisco's Linux operating system. It is a container based  environment in which each application will receive a separate Vserver  container called Virtual Instance (VI). The execution of an application  is limited within its container. This method prevents 3rd-party software  from interfering with the host operating system or other application  running on the system. The vserver architecture utilizes a single kernel  to be shared by all the VI, developers should make sure that its  application is compatible with the linux kernel provided by AXP.&lt;/p&gt;
&lt;p&gt;Here are some basic features of AXP:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prevents 3rd-party software from interfering with the host operating system.&lt;/li&gt;
&lt;li&gt;Creates virtual instances for application separation.&lt;/li&gt;
&lt;li&gt;Managed through the host operating system instead of the CLI.&lt;/li&gt;
&lt;li&gt;Reduced troubleshooting times&lt;/li&gt;
&lt;li&gt;Container based virtualization&lt;/li&gt;
&lt;li&gt;Broad based CPU support, good resource usage, single Linux kernel  support (x86 support for AXP future releases to support additional  platforms).&lt;/li&gt;
&lt;li&gt;3rd-Party software cannot install kernel modules or device drivers.&lt;/li&gt;
&lt;li&gt;Efficient use of resources (kernel level isolation).&lt;/li&gt;
&lt;li&gt;Process level security.&lt;/li&gt;
&lt;li&gt;Processes utilize shared resources (no hard partitioning).&lt;/li&gt;
&lt;li&gt;Multiple 3rd-Party applications running simultaneously on a single AXP blade.&lt;/li&gt;
&lt;li&gt;Supports start, stop, and control for individual applications.&lt;/li&gt;
&lt;li&gt;Complete isolation ensures discrete health state.&lt;/li&gt;
&lt;li&gt;Each application runs a separate Vserver container called a Virtual Instance (VI) or Application Instance.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Overview-HowtoinstallathirdpartyapplicationOverview"&gt;&lt;/a&gt;How to install a third party application - Overview&lt;/h3&gt;
&lt;p&gt;Third party developers will develop their application on their own  linux environment. When the application is ready to be installed onto  the blade, 3rd Party developers will need to obtain a development  authorization from Cisco in order for their application to be  installable onto AXP. The development authorization will only need to be  requested once, and can be used on other applications that the 3rd  party wishes to install. Cisco will provide a packaging tool that will  do all the necessary work to package a 3rd party application (i.e.  bundling, adding authorization ..etc) into a AXP acceptable format. The  developers can then execute a command on the blade to ftp the package  onto the blade and have it installed.&lt;/p&gt;
&lt;p&gt;After an application is installed, its status and health can be  monitored using AXP commands. Each application will be running in its  own vserver container, and each vserver will have its own shell.  Developers can use this shell to manually start their application, or  they can use a start up script to start the application automatically  after installation completes. AXP also provides commands to stop and/or  remove the installed packages when needed.&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Overview?#Development-Overview-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Overview-b.VServeroverview"&gt;&lt;/a&gt;b. VServer overview&lt;/h2&gt;
&lt;h3&gt;&lt;a name="Development-Overview-WhatisAXPvirtualizationusedfor?"&gt;&lt;/a&gt;What is AXP virtualization used for?&lt;/h3&gt;
&lt;p&gt;1. Security Isolation between applications and between application  and host: Application software will not be able to cause a crash on the  host or other application. Also if one vserver is compromised by  hacker, the host will be less affected.&lt;br /&gt; 2. Linux library independence: When porting software to run on AXP,  applcation may have dependency on certain linux libraries that are not  compatible with the library provided by AXP. In these circumstances,  application can load up it's own guestOS environment. Decoupling the 3rd  party application from the AXP guestOS environment.&lt;br /&gt; 3. Resource isolation: Each application is given it's own set of CPU,  Memory and Disk resource limits. application running in a Virtual  environment cannot use more resource than that allocated to it. This  improves application stability when running in a multiple 3rd party  application environment.&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Overview-DescriptionofVservertechnology"&gt;&lt;/a&gt;Description of Vserver technology&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Container based technology, making use of change root barrier and attaching security context to processes.&lt;/li&gt;
&lt;li&gt;Virtualization of user level processes. One signle linux kernel is  used throughout the system. Which has low virtualization memory and  scheduling overhead. This provides near native OS performance.&lt;/li&gt;
&lt;li&gt;When application software is installed under a certain directory,  e.g. /home/app1. Application processes started under the context of this  directory, /home/app1 becomes the root directory of for these  processes. The processes can only access directories below this root;  they do not have permission to escape out of /home/app1.&lt;/li&gt;
&lt;li&gt;Processes running in a context cannot see processes running in another Vserver context hence provide security isolation.&lt;/li&gt;
&lt;li&gt;Devices are not virtualized rather shared amoung vservers. Hence no addition overhead incurred for IO operation.&lt;/li&gt;
&lt;li&gt;Networks is not virtualized, only interface hiding is done for  vserver context. Network routing tables are not vitualized, however  multiple routing tables can be configured under AXP.&lt;/li&gt;
&lt;li&gt;The unit of vserver context is described in AXP as a Virtual  Instance. This is the unit that can be installed and run under the AXP  context. Application software (which can contain multiple processes and  functionalities) are packaged into the slim format using the AXP  packaging tool. The package is installed into the VI's root directory  and run within a VI's context. (Hence a 3rd party slim package cannot  run in multiple VIs).&lt;/li&gt;
&lt;li&gt;An application running inside a VI is provided a operating  environment which is termed guestOS as opposed to the hostOS which  manages all the VI in the system.&lt;/li&gt;
&lt;li&gt;Application can run as root within the VI context.&lt;/li&gt;
&lt;li&gt;To further improve security, the HostOS?'s shell environment is not  available only the CLI will be provided to manage the operating  environment.&lt;/li&gt;
&lt;li&gt;In the VI, the application developer has the choice to enable shell access to within the guestOS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Overview?#Development-Overview-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Overview-c.Resourcehandlingoverview(disk,CPUapplications,etc)"&gt;&lt;/a&gt;c. Resource handling overview (disk, CPU applications, etc)&lt;/h2&gt;
&lt;h3&gt;&lt;a name="Development-Overview-ResourceHandling"&gt;&lt;/a&gt;Resource Handling&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Provided to segment system resource for a Virtual Instance (VI)&lt;/li&gt;
&lt;li&gt;Reduce resource contention within the system, make system behave  more predictably and reduce side effects (e.g. one application hogs  memory causing another application to fail)&lt;/li&gt;
&lt;li&gt;The resources that are managed by AXP are&lt;br /&gt; o CPU&lt;br /&gt; o Memory&lt;br /&gt; o Disk&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;a name="Development-Overview-CPU"&gt;&lt;/a&gt;CPU&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;CPU resource limit is specified based on a CPU index. This CPU  index is an arbitrary number of 10000 assigned to the 1.0 GHz Celeron M  CPU used on NME_APPRE_302-K9 application runtime engine.&lt;/li&gt;
&lt;li&gt;Other AXP blades CPU performance will be scaled with respect to this CPU.&lt;/li&gt;
&lt;li&gt;The CPU index for AIM_APPRE is 3000&lt;/li&gt;
&lt;li&gt;A percentage CPU application usage figure can be calculated by application CPU index/platform CPU index.&lt;/li&gt;
&lt;li&gt;Certain CPU resource is allocated for the host operating system&lt;br /&gt; o AIM APPRE module approx 8% CPU&lt;br /&gt; o NME APPRE 320 module approx 5% CPU is allocated.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;a name="Development-Overview-Memory"&gt;&lt;/a&gt;Memory&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;APPRE as a platform does not make use of disk swapping, the amount  of memory available to application is limited by the physical memory  found in the system.&lt;/li&gt;
&lt;li&gt;The RSS parameter (Resident size) in the kernel is the parameter that gets limited per VI&lt;/li&gt;
&lt;li&gt;The default memory allocation behavior for linux is to allow for  memory overcommit. Memory overcommit is feature of linux memory  management to allow applications that are memory hungry in terms of  allocation but relatively lean actual usage to run. The down side of  this approach is that application that successfully allocated memory can  still fail in run time. This memory overcommit mode however is  necessary for application with heavy memory foot print to run.&lt;/li&gt;
&lt;li&gt;The "test memory" CLI allows this memory overcommit behavior to be  changed or turned off. (This CLI is supposed to be hidden so it is best  not to document it)&lt;/li&gt;
&lt;li&gt;Here is that actual description of the overcommit modes. The Linux kernel supports the following overcommit handling modes:&lt;br /&gt; o 0 - Heuristic overcommit handling. Obvious overcommits of  address space are refused. Used for a typical system. It ensures a  seriously wild allocation fails while allowing overcommit to reduce swap  usage. root is allowed to allocate slighly more memory in this mode.  This is the default.&lt;br /&gt; o 1 - Always overcommit. Appropriate for some scientific applications.&lt;br /&gt; o 2 - Don't overcommit. The total address space commit for the  system is not permitted to exceed swap + a configurable percentage  (default is 50) of physical RAM. Depending on the percentage you use, in  most situations this means a process will not be killed while accessing  pages but will receive errors on memory allocation as appropriate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The overcommit policy is set via the sysctl `vm.overcommit_memory'.&lt;/p&gt;
&lt;p&gt;The overcommit percentage is set via `vm.overcommit_ratio'.&lt;/p&gt;
&lt;p&gt;The current overcommit limit and amount committed are viewable  in /proc/meminfo as CommitLimit and Committed_AS respectively.&lt;/p&gt;
&lt;p&gt;Gotchas -------&lt;/p&gt;
&lt;p&gt;The C language stack growth does an implicit mremap. If you  want absolute guarantees and run close to the edge you MUST mmap your  stack for the largest size you think you will need. For typical stack  usage this does not matter much but it's a corner case if you really  really care&lt;/p&gt;
&lt;p&gt;In mode 2 the MAP_NORESERVE flag is ignored.&lt;/p&gt;
&lt;p&gt;How It Works ------------&lt;/p&gt;
&lt;p&gt;The overcommit is based on the following rules&lt;/p&gt;
&lt;p&gt;For a file backed map&lt;br /&gt; SHARED or READ-only - 0 cost (the file is the map not swap)&lt;br /&gt; PRIVATE WRITABLE - size of mapping per instance&lt;/p&gt;
&lt;p&gt;For an anonymous or /dev/zero map&lt;br /&gt; SHARED - size of mapping&lt;br /&gt; PRIVATE READ-only - 0 cost (but of little use)&lt;br /&gt; PRIVATE WRITABLE - size of mapping per instance&lt;/p&gt;
&lt;p&gt;Additional accounting&lt;br /&gt; Pages made writable copies by mmap&lt;br /&gt; shmfs memory drawn from the same pool&lt;/p&gt;
&lt;p&gt;Status ------&lt;br /&gt; o We account mmap memory mappings&lt;br /&gt; o We account mprotect changes in commit&lt;br /&gt; o We account mremap changes in size&lt;br /&gt; o We account brk&lt;br /&gt; o We account munmap&lt;br /&gt; o We report the commit status in /proc&lt;br /&gt; o Account and check on fork o Review stack handling/building on exec&lt;br /&gt; o SHMfs accounting&lt;br /&gt; o Implement actual limit enforcement&lt;/p&gt;
&lt;p&gt;To Do -----&lt;br /&gt; o Account ptrace pages (this is hard)&lt;/p&gt;
&lt;p&gt;When out of memory occurs, the linux kernel employs the oom_kill (out  of memory kill) function to figure out a process to kill to maintain  system's operation.&lt;/p&gt;
&lt;p&gt;In the Vsever context, specify memory limit specifies the maximum  memory available for each VI conext. When memory overcomit is enabled,  when total memory usage within the VI exceeds that specified by the  limit, processes within the VI will get killed.&lt;/p&gt;
&lt;p&gt;When specifying memory limit the granularity is in MB.&lt;/p&gt;
&lt;h4&gt;&lt;a name="Development-Overview-Disk"&gt;&lt;/a&gt;Disk&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Disk space limit, limits the maximum disk space that can be used by the VI.&lt;/li&gt;
&lt;li&gt;Specified in MB&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Overview-PackagingTimeResourceSpecifications"&gt;&lt;/a&gt;Packaging Time Resource Specifications&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Since the application developer is the best judge of maximum  resource usage by an application. The control is given to the  application developer to specify application resource usage during  packaging time.&lt;/li&gt;
&lt;li&gt;see packaging tool syntax for resource limit specification.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Overview-InstallTimeResourceManagement"&gt;&lt;/a&gt;Install Time Resource Management&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The APPRE system keep track of resource usage by the HostOS?, and all installed VI's&lt;/li&gt;
&lt;li&gt;During installation time when requested resource specified by the  package cannot be met, the software will not be allowed to install.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Overview-RuntimeResourceLimitEnforcement"&gt;&lt;/a&gt;Run time Resource Limit Enforcement&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;APPRE make use of linux-vserver's resource limit capability to enforce runtime resource limits for CPU, memory and disk.&lt;/li&gt;
&lt;li&gt;For CPU limit enforcement the linux-vserver has a token bucket  based scheme to schedule CPU time for the entire Virtual Instance (VI).&lt;/li&gt;
&lt;li&gt;When a VI has run out of CPU time, based on the token bucket  algorithm, the process priority of the VI are set to a lower priority.&lt;/li&gt;
&lt;li&gt;The priority scheduler allows CPU usage to be regulated amount the  host and VI's. It also elimiate wastage of CPU time when the hostOS or a  VI does not make use of it's allocated amount.&lt;/li&gt;
&lt;li&gt;For Phase II deliverable, the CPU and disk paremater can be altered  through CLI after installation. This provides flexibility to adjust  these parameters in the field. However, due to the sensitivity of the  out of memory issue, there is no CLI to modify the memory limit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a name="Development-Overview-4.SDKoverview"&gt;&lt;/a&gt;4. SDK overview&lt;/h1&gt;
&lt;p&gt;AXP provides Software Development kit (SDK) to the 3rd party  Developers for Linux environment. The SDK provides the following types  of tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Packaging utility tools (Phase 1)&lt;br /&gt; o A packaging tool, pkg_build.sh, is provided to the 3rd party  developer to bundle and sign the application package. This tool will  require that application vendor has development authorization from Cisco  and access to private keys that will be used in signing application.&lt;br /&gt; o A bundling tool, pkg_bundle.sh, is used to compile multiple packages into a single bundle&lt;br /&gt; o Two interfaces will be supported for these tools: command arguments and interactive command line interface&lt;br /&gt; o Refer to SFS section 3.4.8, Packaging Tools, for details and examples (Merwan/John)&lt;/li&gt;
&lt;li&gt;Utility tools (phase 2)&lt;br /&gt; o Library Dependency Checker tool, pkg_check.sh, is used  checks and verifies the library dependency on a specified package  (*.pkg)&lt;br /&gt; + Note See SFS 3.4.12 to provide more detail and example (Merwan/John)&lt;br /&gt; o Package Info Tool, pkg_info.sh, is used to display package information&lt;br /&gt; o RPM extractor too, rpm_extractor.sh, is used to extract content from a RPM package.&lt;/li&gt;
&lt;li&gt;CLI plugin tility tools and APIs&lt;br /&gt; o AXP provides a mechanism for third party applications CLIs to be integrated into the AXP CLI environment.&lt;br /&gt; o A set of tools are provided to third party developers during  their development time to validate, process and package the CLI plugin  along with their main application&lt;br /&gt; o See SFS section 3.4.2 for more detail and sample (Merwan/John)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Value-added service APIs&lt;br /&gt; o AXP provides various service APIs to allow 3rd parties to  programmatically access, manage and augment existing features available  within IOS. The SDK includes the necessary libraries, APIs and/or their  associated header files for each supported languages. This allows  developer be able to compile and/or link their applications in their  desktop.&lt;br /&gt; o The implementation of these value-added services are  provided via AXP infrastructure add-on packages. During application  packaging, the dependency on the associated infrastructure add-on  package needs to be specified if that application depends upon that  service.&lt;br /&gt; o Both infrastructure add-on package and application package  need to be installed for that service to be enabled for the application.&lt;br /&gt; o The following are the list of value-added services provided: (Mostly in phase 2)&lt;br /&gt; + IOS Service APIs&lt;br /&gt; + Event Notification APIs&lt;br /&gt; + Serial device APIs&lt;br /&gt; + AXP Service APIs&lt;br /&gt; + SNMP APIs (phase 1)&lt;br /&gt; + packet service - (phase 1) This one uses standard library (see its section in SFS)&lt;br /&gt; + refer to SFS for more detail description for reference (Merwan/John)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Overview?#Development-Overview-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Overview-a.InstallingtheSDK"&gt;&lt;/a&gt;a. Installing the SDK&lt;/h2&gt;
&lt;p&gt;AXP SDK, appre-sdk.nme.&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:version]&lt;/span&gt;.tar.gz, is provided with compressed tarball in gzip format.&lt;/p&gt;
&lt;p&gt;1. Place the tarball in a direcoty.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cp appre-sdk.nme.&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:versin]&lt;/span&gt;.tar.gz /source/workspace/sdk&lt;br /&gt; 2. Unzip and untar the package into desired directory&lt;/li&gt;
&lt;li&gt;bash&amp;gt; tar xvfz appre-sdk.nme.&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:version]&lt;/span&gt;.tar.gz OR&lt;/li&gt;
&lt;li&gt;bash&amp;gt; gunzip appre-sdk.nme.&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:version]&lt;/span&gt;.tar.gz&lt;/li&gt;
&lt;li&gt;bash&amp;gt; tar xvf appre-sdk.nme.&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:version]&lt;/span&gt;.tar&lt;br /&gt; 3. This will populate appre-sdk.nme.&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:version]&lt;/span&gt; directory&lt;br /&gt; 4. cd /source/workspace/sdk/appre-sdk.nme.&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:version]&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Overview?#Development-Overview-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Overview-b.DirectoriesoftheSDKandsourcetree"&gt;&lt;/a&gt;b. Directories of the SDK and source tree&lt;/h2&gt;
&lt;p&gt;AXP SDK provides packaging tools, Service API's include header files  as well as libraries/modules, which can be used to build, compile, and  link AXP service enabled third party applications. The SDK has the  following hierarchical structure:&lt;br /&gt; include 	Contains header files to C/C++ API&lt;br /&gt; jar 	Contains JAVA jar files&lt;br /&gt; lib 	Contains library files used for linkage&lt;br /&gt; perl 	Contains Perl modules files&lt;br /&gt; python2.3 	Contains Python module files&lt;br /&gt; tools 	Contains packaging and CLI plugin tools&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Overview?#Development-Overview-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Overview-c.Whichscriptsareprovided."&gt;&lt;/a&gt;c. Which scripts are provided.&lt;/h2&gt;
&lt;p&gt;Helper scripts are provided as part of the Software Development Kit and can be found in tools directory.&lt;br /&gt; gen_auth.sh 	Certification Authorization Tool&lt;br /&gt; This tools will generate Javelin Authorization files (&lt;strong&gt;.jvln) and Certification files (&lt;/strong&gt;.key)&lt;br /&gt; Note::Do NOT show in devloper's Guide. It is internal usage and only available in engineer build.&lt;br /&gt; See SFS 3.4.16 to provide more detail and example (Merwan/John)&lt;br /&gt; pkg_build.sh 	SLIM Packaging Utility&lt;br /&gt; This tool will generate a installation package for a specific application&lt;/p&gt;
&lt;p&gt;Note See SFS 3.4.8 to provide more detail and example (Merwan/John)&lt;br /&gt; pkg_bundle.sh 	SLIM Bundle Utility&lt;br /&gt; This tool will bundle multiple packages together into one single install package&lt;/p&gt;
&lt;p&gt;Note See SFS 3.4.8 to provide more detail and example (Merwan/John)&lt;br /&gt; pkg_check.sh 	Library Dependency Checker Utility&lt;br /&gt; This tools checks and verifies the library dependency on a specified package (*.pkg)&lt;/p&gt;
&lt;p&gt;Note See SFS 3.4.12 to provide more detail and example (Merwan/John)&lt;br /&gt; pkg_info.sh 	Package Info Utility&lt;br /&gt; Displays package information&lt;br /&gt; rpm_extractor.sh 	RPM Extractor&lt;br /&gt; This tool extracts content from a RPM package. User can specify directories for storing scripts, dependencies and other files&lt;/p&gt;
&lt;p&gt;Note See SFS 3.4.13 to provide more detail and example (Merwan/John)&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Overview?#Development-Overview-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Overview-d.Multiplepackagesupport"&gt;&lt;/a&gt;d. Multiple package support&lt;/h2&gt;
&lt;p&gt;1. Dependency management&lt;br /&gt; 2. Host vs. Guest OS packages&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Artem PackageSupport?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Overview?#Development-Overview-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Overview-e.DevelopmentFlow"&gt;&lt;/a&gt;e. Development Flow&lt;/h2&gt;
&lt;h3&gt;&lt;a name="Development-Overview-Overview"&gt;&lt;/a&gt;Overview&lt;/h3&gt;
&lt;p&gt;There are different ways the developer can approach the application  development. There is a variety of criteria that can affect the method  the developer will adopt as development flow. Some of those criteria  are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;complexity of the application&lt;/li&gt;
&lt;li&gt;whether the developer starts the application from scratch or from existing code&lt;/li&gt;
&lt;li&gt;software dependencies this application might have (RPMs)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whether the application is developed from scratch or the developer is  required to port an existing application to the network-module, the  basic recommended work flow should be similar. Since the workstation is a  similar runtime environment to the network-module, the developer can do  some minor testing on the workstation if wanted.&lt;/p&gt;
&lt;p&gt;Here is a recommended work-flow to build an application:&lt;/p&gt;
&lt;p&gt;1. First Time Setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workstation setup:&lt;br /&gt; o SDK installation, workspace preparation, sync repository&lt;br /&gt; o Create an empty application, package it and install on  network-module, this is needed to get access to the linux shell in the  vserver&lt;/li&gt;
&lt;li&gt;Network-module installation and configuration&lt;/li&gt;
&lt;li&gt;Export Directory structure from network-module to the workstation using rsync CLI&lt;br /&gt; 2. Main development iteration loop:&lt;/li&gt;
&lt;li&gt;Add/modify software such as executable and scripts as required to the workstation sync repository&lt;br /&gt; o Only the binary are needed to be placed in the sync directory (not the source code)&lt;br /&gt; o Use the RPM Extraction Tool to extract any RPM your application may require&lt;/li&gt;
&lt;li&gt;Import back the changes to the network-module&lt;/li&gt;
&lt;li&gt;Test changes&lt;/li&gt;
&lt;li&gt;Developer can modify files on the network-module as well, if this  is the case, make sure to sync from the network-module to the  workstation so that those changes are not lost.&lt;br /&gt; 3. Package And Test&lt;/li&gt;
&lt;li&gt;Package Application - Make sure to remove unwanted files that might have been exported to the workstation such as temp files.&lt;/li&gt;
&lt;li&gt;Run the LDD Checker tool - this will help verify that all libraries required by the application were bundled in the package.&lt;/li&gt;
&lt;li&gt;Install packaged Application for testing&lt;/li&gt;
&lt;li&gt;Test Application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the previous development flow, there are some reference to tools.  Those tools are either part of the SDK or available at runtime on the  network-module (such as rsync CLI).&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Overview-RPMExtractionTool"&gt;&lt;/a&gt;RPM Extraction Tool&lt;/h3&gt;
&lt;p&gt;One shortcoming of the Application Runtime Environment is that it  does not support the installation of RPMs. The developer might face this  issue if its application depends on RPM(s). If this is the case, the  developer must bundle the RPM content and its script setup as part of  its application.&lt;/p&gt;
&lt;p&gt;To help the developer extracting the RPM, the SDK provides a tool to ease this extraction process.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; 
&lt;ul&gt;
&lt;li&gt;Note to Writer: There should be a reference here to the section where RPM Extraction Tool is covered in detail.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Overview-RSYNC"&gt;&lt;/a&gt;RSYNC&lt;/h3&gt;
&lt;p&gt;Another tool provided is the rsync cli (available from the  application debug package). This CLI allows the synchronization of the  VServer/Application content between the network-module and the  workstation workspace repository. This tool was made available to ease  the development cycle. This is achieved by bypassing the packaging and  installation steps of the application. This way, modification can easily  be done on the workstation and be updated to the network-module.&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Overview-LDDChecker"&gt;&lt;/a&gt;LDD Checker&lt;/h3&gt;
&lt;p&gt;LDD Checker is an executable that validates if all the libraries have  been packages in your application. This is used to validate that the  application will have the full set of libraries once installed.&lt;/p&gt;</description>
      <pubDate>Fri, 06 Aug 2010 18:32:41 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Development+-+Overview</guid>
      <dc:creator>Matthew J Denapoli</dc:creator>
      <dc:date>2010-08-06T18:32:41Z</dc:date>
    </item>
    <item>
      <title>Development - Details 1.0</title>
      <link>http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Development+-+Details</link>
      <description>&lt;div class="rbtoc1210989046552"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-1.Creatingasimpleapplication%28basic%29"&gt;1. Creating a simple application (basic)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-Buildyourapplication"&gt;Build your application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-Packagetheapplication"&gt;Package the application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-RetrievePackage"&gt;Retrieve Package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-InstallanApplicationPackagetotheBlade"&gt;Install an Application Package to the Blade&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-Verifyinstallation"&gt;Verify installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-Startyourapplication"&gt;Start your application&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-2.Applicationdevelopment"&gt;2. Application development&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-a.HandlingRPMfiles"&gt;a. Handling RPM files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-b.AccessingtheshelloftheVServercontext"&gt;b. Accessing the shell of the VServer context&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-c.DevelopingintheVServer"&gt;c. Developing in the VServer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-d.ExtendingtheCLI"&gt;d. Extending the CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-e.Healthmonitor"&gt;e. Health monitor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-f.SSHtunneling"&gt;f. SSH tunneling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-g.UtilizingthePromiscuouspacketAPI"&gt;g. Utilizing the Promiscuous packet API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-h.Loggingsupportandrecommendations"&gt;h. Logging support and recommendations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-i.CreatingaapplicationconsolewithintheCLI"&gt;i. Creating a application console within the CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-3.Applicationdebugging"&gt;3. Application debugging&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-a.Vservercommands"&gt;a. Vserver commands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-b.GDBDebugging"&gt;b. GDB Debugging&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1&gt;&lt;a name="Development-Details-1.Creatingasimpleapplication(basic)"&gt;&lt;/a&gt;1. Creating a simple application (basic)&lt;/h1&gt;
&lt;p&gt;In the following sections, we'll go through steps to build a simple package and deploy it to the blade.&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-Buildyourapplication"&gt;&lt;/a&gt;Build your application&lt;/h2&gt;
&lt;p&gt;As mentioned in the requirement section, the 3rd party development  should be done on a linux machine and should be compatible with the  kernel that AXP provides. Third party development can be done in Java,  C/C++, shell scripts, Python, and Perl. Building your application should  not be any different than building any other linux application. Just  make sure you include all the libraries required when packaging your  application.&lt;/p&gt;
&lt;p&gt;For this tutorial, we'll use a simple Hello app, which is a simple  bash script. We'll show you how to package this app and get it installed  onto the blade.&lt;/p&gt;
&lt;p&gt;#!/bin/bash echo "Hello...##########################################"&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-Packagetheapplication"&gt;&lt;/a&gt;Package the application&lt;/h2&gt;
&lt;h3&gt;&lt;a name="Development-Details-ExtracttheSDK"&gt;&lt;/a&gt;Extract the SDK&lt;/h3&gt;
&lt;p&gt;You'll first need to get the packaging tool:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Locate the sdk package in your "aesop-root/all-images" directory  for the "sdk.tar.gz" file. You will see this directory in your workspace  root.&lt;/li&gt;
&lt;li&gt;Extract the tarball into any directory on your machine "tar -xzf sdk.tar.gz".&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: if you do not see the tarball under aesop-root, then either  your workspace has not been build, or "make install" has not been done  to install the image into this directory. Do a "make" and "make install"  in the workspace root.&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-CreateaRootDirectory"&gt;&lt;/a&gt;Create a Root Directory&lt;/h3&gt;
&lt;p&gt;Create a common root directory. This directory will be the root  directory from which the packages will be created and then installed  onto the AXP platform. Copy all relevent files and links including their  directories into the common root directory. The root directory I have  created for my app is in /users/home/jescheng/source.&lt;/p&gt;
&lt;p&gt;Everything under this directory will appear in the root directory of my vserver with the directory structure intact.&lt;/p&gt;
&lt;p&gt;Note: If you're accessing the blade as the host, you'll see your application's root directory in /home/vserver/&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:AppName]&lt;/span&gt;/&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-CreateaProjectDirectory"&gt;&lt;/a&gt;Create a Project Directory&lt;/h3&gt;
&lt;p&gt;Create a project directory for the packaging tool. You'll find your  resulting package in this directory. The project directory I used for my  app is /ws2/jescheng/project/&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-Packaginginformation"&gt;&lt;/a&gt;Packaging information&lt;/h3&gt;
&lt;p&gt;You'll need to prepare some information before packaging your  application. Here is a complete list of information and some description  of each. Note that not all of them are required, some are labeled with  optional. The information here is provided for completeness (straight  from developer guide), you can skip over to the next section if you just  want to package with basic options.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project Directory&amp;iquest;Directory that stores generated package files, templates, and temporary files created during packaging.&lt;/li&gt;
&lt;li&gt;Development Certificate location &amp;iquest;X.509 certificate authorized for  software development on the platform. Example: "/xyz_source/x509.cer"&lt;/li&gt;
&lt;li&gt;Software Development Authorization file location&amp;iquest;Binary file that  grants permission to the certificate holder to develop software for the  platform. Example: "/xyz_source/dev_auth"&lt;/li&gt;
&lt;li&gt;Private Key location&amp;iquest;File containing the RSA key that is used to  sign the application vendor software. Example: "/xyz_source/privkey.txt"&lt;/li&gt;
&lt;li&gt;Application Name&amp;iquest;Name of the packaged application. Example: "XYZ"&lt;/li&gt;
&lt;li&gt;Application Version&amp;iquest;Version of the packaged application. Example: "1.0"&lt;/li&gt;
&lt;li&gt;Application Description&amp;iquest;(optional) Description of application functionality. For example:"XYZ Utility"&lt;/li&gt;
&lt;li&gt;Application UUID&amp;iquest;(optional) Application unique identifier. It is automatically generated when not specified.&lt;/li&gt;
&lt;li&gt;Application Files Location&amp;iquest;Directory that contains application  files to be packaged. The directory structure should mirror the desired  directory structure on the target file system. Example:  "/xyz_source/root_fs"&lt;/li&gt;
&lt;li&gt;List of files to be protected&amp;iquest;(optional) Plain text document that  contains a list of files (one file per line) that will be checked for  tampering before application initialization.&lt;/li&gt;
&lt;li&gt;Platform License&amp;iquest; Specifies modern POSIX regular expression for  target platforms where this software is allowed to run. The application  is only installed and allowed to run if the target platform matches the  specified regular expression.&lt;/li&gt;
&lt;li&gt;Package Dependencies&amp;iquest;Select from a list of packages in the SDK and  project directories. The user can also specify UUID and filename for a  package that exists on the development workstation file system. After  each dependency, the user has to specify a dependency type:&lt;br /&gt; o - From &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:version]&lt;/span&gt;&amp;iquest;Dependency must be of the specified or later version.&lt;br /&gt; o - To &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:version]&lt;/span&gt;&amp;iquest;Dependency must be of the specified or earlier version.&lt;br /&gt; o - Exclude &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:version]&lt;/span&gt;&amp;iquest; Package cannot be installed with other dependencies for the specified version.&lt;br /&gt; o - Only &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:version]&lt;/span&gt;&amp;iquest;Dependency must be of the specified version.&lt;br /&gt; o - None&amp;iquest;Package cannot be installed with the specified dependency.&lt;br /&gt; o - All&amp;iquest;Dependency of any version must be present for the package installation.&lt;/li&gt;
&lt;li&gt;Disk Limit (in megabytes) - Set application disk usage limit. Disk  usage includes all application binary and data files as well as any  diagnostics data generated by the customer when using the application  (such as log and core files). Target platform resources must be taken  into consideration when selecting a value for this option. Application  may fail to install or run if the requested resource is not available on  the target platform. Example: 1500Mb&lt;/li&gt;
&lt;li&gt;Memory Limit (in megabytes) - Set application RAM usage limit.  Target platform resources must be taken into consideration when  selecting a value for this option. Application may fail to install or  run if requested resource is not available on target platform. Example:  256Mb&lt;/li&gt;
&lt;li&gt;CPU Limit (in CPU index points) - Sets the maximum CPU utilization  that an application can access. CPU index will be calculated using a  benchmark and published for each supported hardware platform. A more  powerful platform will have a higher CPU index and will be able to  accommodate a higher number of concurrent applications. Target platform  resources must be taken into consideration when selecting a value for  this option. Application may fail to install or run if enough CPU  resources are not available on the target platform. Example: 50Mb&lt;/li&gt;
&lt;li&gt;Application capacity&amp;iquest; Textual description of application  capabilities. Example: This string may indicate the call processing rate  for voice routing application.&lt;/li&gt;
&lt;li&gt;Post-install script &amp;iquest;(Optional) Specifies the script to run after installation. Example: /bin/postinstall.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Details-Runthepackagingtool"&gt;&lt;/a&gt;Run the packaging tool&lt;/h3&gt;
&lt;p&gt;Look into the sdk directory you just created, under "tools" there  should be a script called pkg_build.sh. You can run this script in  interactive or non-interactive mode.&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-InteractiveMode"&gt;&lt;/a&gt;Interactive Mode&lt;/h3&gt;
&lt;p&gt;Following is a sample output when packaging the Hello app, with the  interactive mode (redundant output such as description has been removed  from the output to reduce size).&lt;/p&gt;
&lt;p&gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:jescheng@jescheng-lnx /ws2/jescheng/sdk/tools]&lt;/span&gt;$ pkg_build.sh SLIM Packaging &lt;br /&gt; Utility. (C) 2007 Cisco Systems, Inc Checking dependencies...  No command &lt;br /&gt; parameters specified - entering interactive mode.  ** project-dir Project &lt;br /&gt; Directory: /ws2/jescheng/project  ** dev-cert Development Certificate &lt;br /&gt; File: /vws/vld/devtest-pkg/devcert/dev_certificate.jvln  ** dev-auth &lt;br /&gt; Development Authorization File: /vws/vld/devtest-pkg/devcert&lt;br /&gt; /dev_authorization.jvln  ** private-key Private Key for Signing Operations: &lt;br /&gt; /vws/vld/devtest-pkg/devcert/private.key  ** name Application Name: Hello&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; 
&lt;ul&gt;
&lt;li&gt;version Version: 1  ** description (optional) Description: echo hello&lt;/li&gt;
&lt;li&gt;uuid (optional) Unique Identifier: Using Default Value:  ** source-dir&lt;br /&gt; Source Directory: /users/jescheng/source  ** protect (optional) Protect List &lt;br /&gt; File: Using Default Value:  ** deps (optional) Dependency Subsystem &lt;br /&gt; Identifier: Using Default Value:  ** disk-limit resource limit parameters are &lt;br /&gt; 'min' and 'opt' Enter resource limit parameter: min Minimum Limit: 50M &lt;br /&gt; resource limit parameters are 'min' and 'opt' Enter resource limit parameter: &lt;br /&gt; opt Optimal Limit: 50M query_disk_limits min=50M,opt=50M  ** memory-limit &lt;br /&gt; Memory Limit: 50M  ** cpu-limit resource limit parameters are 'min' and 'opt' &lt;br /&gt; Minimum Limit: 1 resource limit parameters are 'min' and 'opt' Enter resource &lt;br /&gt; limit parameter: opt Optimal Limit: 1 query_cpu_limits min=1,opt=1 &lt;/li&gt;
&lt;li&gt;postinstall (optional) Post-install script path: Using Default Value:&lt;br /&gt; Interactive mode complete. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Details-NonInteractiveMode"&gt;&lt;/a&gt;Non-Interactive Mode&lt;/h3&gt;
&lt;p&gt;We can do the same work without the interactive mode. The command below will produce the same package.&lt;/p&gt;
&lt;p&gt;./pkg_build.sh --project-dir '/ws2/jescheng/project' --dev-cert &lt;br /&gt; '/vws/vld/devtest-pkg/devcert/dev_certificate.jvln' --dev-auth &lt;br /&gt; '/vws/vld/devtest-pkg/devcert/dev_authorization.jvln' --private-key &lt;br /&gt; '/vws/vld/devtest-pkg/devcert/private.key' -name 'Hello' &lt;br /&gt; --version '1' --description 'echo hello' --source-dir &lt;br /&gt; '/users/jescheng/source' --disk-limit 'min=50M,opt=50M' --memory-limit &lt;br /&gt; '50M'--cpu-limit 'min=1,opt=1'&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-RetrievePackage"&gt;&lt;/a&gt;Retrieve Package&lt;/h2&gt;
&lt;p&gt;After the packaging tool completes, you should find the package in  the project directory you specified under "pkg". There should be a .pkg  and a .prt1 file. Copy them to your ftp directory.&lt;/p&gt;
&lt;p&gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:jescheng@jescheng-lnx /ws2/jescheng/project/pkg]&lt;/span&gt;$ ls Hello.1.pkg  &lt;br /&gt; Hello.1.prt1 &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:jescheng@jescheng-lnx /ws2/jescheng/project/pkg]&lt;/span&gt;$cp &lt;br /&gt; Hello.1.* /var/ftp/&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-InstallanApplicationPackagetotheBlade"&gt;&lt;/a&gt;Install an Application Package to the Blade&lt;/h2&gt;
&lt;p&gt;Install the packages using the software install add url url command where url is the ftp location of the package.&lt;/p&gt;
&lt;p&gt;se-1-100-50-222.unspecified&amp;gt; $software install add url &lt;br /&gt; &lt;a href="../../../web/axp/wikidocs?src=/wiki/ftp%3A//128.107.146.24/Hello.1.pkg" target="_top"&gt;ftp://128.107.146.24/Hello.1.pkg&lt;/a&gt; WARNING:: This command will install the &lt;br /&gt; necessary software to WARNING:: complete an add-on install.  It is &lt;br /&gt; recommended that a backup be done WARNING:: before installing software.  &lt;br /&gt; Would you like to continue? &lt;span class="error"&gt;[n]&lt;/span&gt; y  Downloading ftp Hello.1.pkg Bytes &lt;br /&gt; downloaded :  4745 ....&lt;/p&gt;
&lt;p&gt;Note: Both .pkg and pkg.prt1 files must be present in the ftp server.&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-Verifyinstallation"&gt;&lt;/a&gt;Verify installation&lt;/h2&gt;
&lt;p&gt;You can verify the state of your application by executing the command:&lt;/p&gt;
&lt;p&gt;se-1-100-50-222.unspecified&amp;gt; sh app-service state APPLICATION                &lt;br /&gt; STATE               HEALTH       Hello               online&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-Startyourapplication"&gt;&lt;/a&gt;Start your application&lt;/h2&gt;
&lt;p&gt;There are two ways to start your application: Manually or Automatically.&lt;/p&gt;
&lt;p&gt;Please refer to VSEapp.AXP3rdPartyApplicationsDevelopmentFAQ for more information.&lt;/p&gt;
&lt;h1&gt;&lt;a name="Development-Details-2.Applicationdevelopment"&gt;&lt;/a&gt;2. Application development&lt;/h1&gt;
&lt;h2&gt;&lt;a name="Development-Details-a.HandlingRPMfiles"&gt;&lt;/a&gt;a. Handling RPM files&lt;/h2&gt;
&lt;h3&gt;&lt;a name="Development-Details-ExtractingRPMfileswithstandardrpm,rpm2cpiocommands(phaseI)"&gt;&lt;/a&gt;Extracting RPM files with standard rpm, rpm2cpio commands (phase I)&lt;/h3&gt;
&lt;p&gt;Since rpm is not supported, developers who want to install RPMs as  part of their application needs to extract the RPMs in their development  environment and integrate it together with the rest of their  application.&lt;/p&gt;
&lt;p&gt;To extract an RPM to current directoy as if that is root &lt;img class="emoticon" src="../../../wiki/images/icons/emoticons/check.gif" border="0" width="16" height="16" align="absmiddle" /&gt;&lt;/p&gt;
&lt;p&gt;rpm2cpio /tmp/myapp.rpm | cpio -ivd&lt;/p&gt;
&lt;p&gt;Developers can examine any pre/post install/uninstall scripts that the RPM contains&lt;/p&gt;
&lt;p&gt;rpm -qp --scripts /tmp/myapp.rpm&lt;/p&gt;
&lt;p&gt;Developers can examine any dependencies (libraries, other RPMs) that the RPM requires&lt;/p&gt;
&lt;p&gt;rpm -qp -R /tmp/myapp.rpm&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-ExtractingRPMfileswithRPMextractortool(phaseII)"&gt;&lt;/a&gt;Extracting RPM files with RPM extractor tool (phase II)&lt;/h3&gt;
&lt;p&gt;Given that their development environments have rpm and rpm2cpio  supported, there is a tool provided by the SDK to help developers  quickly extract all the RPMs into the project source root directory,  examine any dependencies the RPMs required, and view any pre/post  install/uninstall scripts that the RPMs contains.&lt;/p&gt;
&lt;p&gt;This tool is provided as /tools/rpm_extractor.sh inside the SDK package.&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-UsingtheRPMextractortool"&gt;&lt;/a&gt;Using the RPM extractor tool&lt;/h3&gt;
&lt;p&gt;Before using this tool, developers should have a project directory  created, this directory could be the same directory where packaging tool  is run.&lt;/p&gt;
&lt;p&gt;workstation# rpm_extractor.sh --proj &amp;lt;Project Directory&amp;gt; &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:\-\-output]&lt;/span&gt; &lt;br /&gt; &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:\-\-scripts]&lt;/span&gt; &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:\-\-deps]&lt;/span&gt; &amp;lt;RPM files&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-RequiredArguments"&gt;&lt;/a&gt;Required Arguments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;--proj &amp;lt;Project Directory&amp;gt;: Designates where the project  directory is located. This tool will create a sub-directory structure as  under the project directory as follows:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;Project Directory&amp;gt;/    rpm_extractor/    output/      scripts/        deps/&lt;/p&gt;
&lt;p&gt;Extracted RPM files will be placed in the output/ directory as if the directory is root &lt;img class="emoticon" src="../../../wiki/images/icons/emoticons/check.gif" border="0" width="16" height="16" align="absmiddle" /&gt; directory. Scripts information will be placed in the scripts/  directory, the name of the file will be the RPM filename suffixed with  ".scripts". Dependencies information will be placed in the deps/  directory, the name of the file will be the RPM filename suffixed with  ".deps". If none of the optional arguments are specified, all three  operations will be performed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt;RPM files&amp;gt;: A list of RPM files. This tool can process  multiple RPM files at the same time. RPM files will be extracted to the  same output directory as that directory is treated as root &lt;img class="emoticon" src="../../../wiki/images/icons/emoticons/check.gif" border="0" width="16" height="16" align="absmiddle" /&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Details-OptionalArguments"&gt;&lt;/a&gt;Optional Arguments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;--output: Specify the extract operation to be performed&lt;/li&gt;
&lt;li&gt;--scripts: Specify the script extract operation to be performed&lt;/li&gt;
&lt;li&gt;--deps: Specify the dependency extract operation to be performed&lt;/li&gt;
&lt;li&gt;--help: Print a usage page&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Details-AfterRPMextraction"&gt;&lt;/a&gt;After RPM extraction&lt;/h3&gt;
&lt;p&gt;With the RPM extracted (either by using the standard rpm commands, or  the rpm extraction tool), and given the scripts and dependencies  information known, developers should port the files following the steps  below&lt;/p&gt;
&lt;p&gt;1. Look at any library and RPM dependencies, gather any new RPM files needed and perform the extraction&lt;br /&gt; 2. Examine the extracted RPM files, move them to the project source directory&lt;br /&gt; 3. Examine the pre/post install/uninstall scripts, write the appropiate scripts in the project source directory&lt;br /&gt; 4. Package the application and install it on the blade&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-TroubleshootinganapplicationwithextractedRPMs"&gt;&lt;/a&gt;Troubleshooting an application with extracted RPMs&lt;/h3&gt;
&lt;p&gt;It might not work the first time an application containing RPMs are installed to the blade. Typical problems include:&lt;/p&gt;
&lt;p&gt;1. Missing libraries&lt;br /&gt; If there are further libraries missing, try transfer those  libraries using ftp into the blade. Developers usually don't need to  repackage to test&lt;br /&gt; 2. Missing configurations&lt;br /&gt; Sometimes the configuration scripts extracted from the RPMs might  not run successfully in the first trial. Developers can access the linux  shell of the application and manually invoke the scripts to see if  there are any problems.&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-b.AccessingtheshelloftheVServercontext"&gt;&lt;/a&gt;b. Accessing the shell of the VServer context&lt;/h2&gt;
&lt;h3&gt;&lt;a name="Development-Details-PhaseI"&gt;&lt;/a&gt;Phase I&lt;/h3&gt;
&lt;p&gt;To access shell in vserver context, application developers can  install their application with dependency on the application debug  package. This package provides a CLI to access the linux shell within  the vserver context. The steps are:&lt;/p&gt;
&lt;p&gt;1. Package the application with dependency on the app_debug.pkg&lt;br /&gt; 2. After installation of the application with the app_debug.pkg, use this CLI:&lt;/p&gt;
&lt;p&gt;blade# app-service system myapp (myapp)# linux shell bash#&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-PhaseII"&gt;&lt;/a&gt;Phase II&lt;/h3&gt;
&lt;p&gt;In addition to the CLI to access linux shell, application debug  package provides an SSH server that runs on the vserver context in phase  2.&lt;/p&gt;
&lt;p&gt;Vserver SSH server support is provided at two levels:&lt;/p&gt;
&lt;p&gt;1. Production Environment&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provides a "tunnel_user" SSH user that does not have shell access  upon SSH login. Third party developers have control what this  "tunnel_user" can do by writing a startup script that is called upon  successful SSH login&lt;br /&gt; 2. Debugging Environment&lt;/li&gt;
&lt;li&gt;Provides a "tunnel_user" SSH user, same as Production Environment&lt;/li&gt;
&lt;li&gt;Provides a "tunnel_root" SSH user that has shell access of the vserver context upon SSH login&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This two levels of support is provided through two separate add-on  package. Third party application that wants this support must specify  either of these add-on packages as dependency upon packaging time.&lt;/p&gt;
&lt;p&gt;1. app_ssh.pkg - addon package for Production Environment SSH support&lt;br /&gt; 2. app_debug.pkg - addon package for Debugging Environment SSH support&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-SetupvserverSSHserver"&gt;&lt;/a&gt;Setup vserver SSH server&lt;/h3&gt;
&lt;p&gt;Steps to setup a vserver to run SSH server:&lt;/p&gt;
&lt;p&gt;1. Package the application with dependency on the application debugging&lt;br /&gt; 2. After installation of the application with the app_debug.pkg, make  sure that there is an interface binded to the vserver, so that SSH  connection can be made into the vserver. If not, follow these steps:&lt;/p&gt;
&lt;p&gt;blade# config terminal (config)# app-service system myapp (config-myapp)# &lt;br /&gt; bind ip eth0 (config-myapp)# end&lt;/p&gt;
&lt;p&gt;3. Activate the "tunnel_root" user (same applies to "tunnel_user" user) by setting a password&lt;/p&gt;
&lt;p&gt;blade# config terminal (config)# app-service system myapp (config-myapp)# &lt;br /&gt; ip ssh uername tunnel_root password hello (config-myapp)# end&lt;/p&gt;
&lt;p&gt;4. Enable the vserver SSH server&lt;/p&gt;
&lt;p&gt;blade# config terminal (config)# app-service system myapp (config-myapp)# &lt;br /&gt; ip ssh server (config-myapp)# end&lt;/p&gt;
&lt;p&gt;5. Users can check that vserver SSH server is running&lt;/p&gt;
&lt;p&gt;blade# app-service system myapp (myapp)# show ssh-server Application SSH &lt;br /&gt; Server Status:           RUNNING&lt;/p&gt;
&lt;p&gt;6. Users can now connect to the vserver SSH server. By default,  vserver SSH server port is 2022 (There is a CLI to change the port). For  connection using "tunnel_root" as the SSH user, there will be shell  access&lt;/p&gt;
&lt;p&gt;workstation-shell# ssh tunnel_root@myblade -p 2022 tunnel_root@myblade's &lt;br /&gt; password: vserver-shell#&lt;/p&gt;
&lt;p&gt;7. For using the "tunnel_user" as the SSH user, upon successful  connection, it will first be greeted by the AXP login message. Then, the  startup script third party application provides will be processed.  Third party application should provide the script  /usr/ssh/home/tunnel_user_app_startup.sh. For example&lt;/p&gt;
&lt;p&gt;#!/bin/bash &lt;br /&gt; echo "Welcome Tunnel User!" &lt;br /&gt; echo "Please enter 1 to do a 'pwd', or 2 to do a 'ls'" &lt;br /&gt; read choice &lt;br /&gt; if &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM: $choice -eq 1 ]&lt;/span&gt;; then    &lt;br /&gt; pwd &lt;br /&gt; else    ls &lt;br /&gt; fi&lt;/p&gt;
&lt;p&gt;Upon login, this is what "tunnel_user" will encounter&lt;/p&gt;
&lt;p&gt;workstation-shell# ssh tunnel_user@myblade -p 2022&lt;br /&gt; tunnel_user@myblade's password: &lt;br /&gt; ==Start of message from the Cisco AppRE Application SSH Support==&lt;br /&gt; Tunnel User (tunnel_user) has logged in successfully&lt;br /&gt; Application specific Tunnel User startup script will be &lt;br /&gt; invoked (if exists)&lt;br /&gt; ==End of message from the Cisco AppRE Application SSH Support==&lt;br /&gt; Welcome Tunnel User!&lt;br /&gt; Please enter 1 to do a 'pwd', or 2 to do a 'ls'&lt;br /&gt; 2&lt;br /&gt; tunnel_user_app_startup.sh         tunnel_user_startup.sh&lt;br /&gt; tunnel_user_app_startup.sh.sample&lt;br /&gt; Connection to myblade closed.&lt;br /&gt; workstation-shell#&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-c.DevelopingintheVServer"&gt;&lt;/a&gt;c. Developing in the VServer&lt;/h2&gt;
&lt;p&gt;I. Synchronizing them with the developer tree on the linux blade&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eric RsyncHowToUseIt? II. Identifying and gathering the files that have been changed in the VServer&lt;/li&gt;
&lt;li&gt;Eric IdentifyingChangedFiles?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-d.ExtendingtheCLI"&gt;&lt;/a&gt;d. Extending the CLI&lt;/h2&gt;
&lt;h3&gt;&lt;a name="Development-Details-ImplementingPluginCLI"&gt;&lt;/a&gt;Implementing Plugin CLI&lt;/h3&gt;
&lt;p&gt;Third party developers will use the CLI Plugin tool provided in the  SDK to implement Plugin CLI. The tool is located at /tools/custom_cli of  the SDK directory.&lt;/p&gt;
&lt;p&gt;In addition, developers will need to achieve the following:&lt;/p&gt;
&lt;p&gt;1. implement plugin CLI definitions&lt;br /&gt; 2. implement plugin CLI actions&lt;br /&gt; 3. Run the plugin CLI tool with the definitions and actions&lt;br /&gt; 4. Make changes in the third party main application to start the plugin CLI listener&lt;br /&gt; 5. Package and bundle the third party application with dependency on the plugin CLI add-on package&lt;br /&gt; 6. Install the bundled application&lt;br /&gt; 7. Run the main application, issue the CLI&lt;br /&gt; 8. Config CLIs&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-PluginCLIdefinitions"&gt;&lt;/a&gt;Plugin CLI definitions&lt;/h3&gt;
&lt;p&gt;Developers will need to write the plugin CLI definitions as XML  format. An example of plugin CLI definition file (please note that the  &amp;lt;xml&amp;gt; and &amp;lt;DOCTYPE&amp;gt; header tags must also present)&lt;/p&gt;
&lt;p&gt;-bash-3.00$ ls &lt;br /&gt; actions  app  cli_plugin.config  myapp1_cli.xml  proj  proj_src  sdk &lt;br /&gt; -bash-3.00$ cat myapp1_cli.xml&lt;/p&gt;
&lt;p&gt;&amp;lt;?xml version='1.0' encoding='UTF-8' ?&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!DOCTYPE cli_grammar SYSTEM "cli_grammar.dtd" [ &lt;br /&gt; &amp;lt;!ENTITY num '&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?'&amp;gt; &lt;br /&gt; &amp;lt;!ENTITY ipaddr '&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:1\-9]&lt;/span&gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?\.&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:1\-9]&lt;/span&gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?\.&lt;br /&gt; &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:1\-9]&lt;/span&gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?\.&lt;br /&gt; &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:1\-9]&lt;/span&gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?'&amp;gt; &lt;br /&gt; &amp;lt;!ENTITY portNum  '&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:1\-9]&lt;/span&gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;*'&amp;gt; &lt;br /&gt; &amp;lt;!ENTITY login '&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:a\-zA\-Z]&lt;/span&gt;+'&amp;gt; &lt;br /&gt; &amp;lt;!ENTITY password '&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:a\-zA\-Z0\-9]&lt;/span&gt;+'&amp;gt; &lt;br /&gt; &amp;lt;!ENTITY range '&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?'&amp;gt; ]&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;cli_grammar&amp;gt;     &lt;br /&gt; &amp;lt;mode&amp;gt;&lt;br /&gt; &amp;lt;pattern type='id'&amp;gt;exec&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;cmd&amp;gt;&lt;br /&gt; &amp;lt;pattern type='id'&amp;gt;math&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;help&amp;gt;Math operations with Java actions&amp;lt;/help&amp;gt;&lt;br /&gt; &amp;lt;param&amp;gt;&lt;br /&gt; &amp;lt;pattern type='regex'&amp;gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;pattern type='help'&amp;gt;NUM&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;help&amp;gt;0-99&amp;lt;/help&amp;gt; &lt;br /&gt; &amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;param&amp;gt;&lt;br /&gt; &amp;lt;pattern type='id'&amp;gt;add&amp;lt;/pattern&amp;gt; &lt;br /&gt; &amp;lt;help&amp;gt;Add operation&amp;lt;/help&amp;gt;&lt;br /&gt; &amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;param&amp;gt;&lt;br /&gt; &amp;lt;pattern type='regex'&amp;gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;pattern type='help'&amp;gt;NUM&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;help&amp;gt;0-99&amp;lt;/help&amp;gt;&lt;br /&gt; &amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;action paginate="yes" pipehelp="yes"&amp;gt;&lt;br /&gt; &amp;lt;class&amp;gt;exec_math.class&amp;lt;/class&amp;gt;&lt;br /&gt; &amp;lt;/action&amp;gt;&lt;br /&gt; &amp;lt;/cmd&amp;gt;&lt;br /&gt; &amp;lt;cmd&amp;gt;&lt;br /&gt; &amp;lt;pattern type='id'&amp;gt;math&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;help&amp;gt;Math operations with Java actions&amp;lt;/help&amp;gt;&lt;br /&gt; &amp;lt;param&amp;gt;&lt;br /&gt; &amp;lt;pattern type='regex'&amp;gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;pattern type='help'&amp;gt;NUM&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;help&amp;gt;0-99&amp;lt;/help&amp;gt;&lt;br /&gt; &amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;param&amp;gt;&lt;br /&gt; &amp;lt;pattern type='id'&amp;gt;sub&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;help&amp;gt;Subtract operation&amp;lt;/help&amp;gt;&lt;br /&gt; &amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;param&amp;gt;&lt;br /&gt; &amp;lt;pattern type='regex'&amp;gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;pattern type='help'&amp;gt;NUM&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;help&amp;gt;0-99&amp;lt;/help&amp;gt;&lt;br /&gt; &amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;action paginate="yes" pipehelp="yes"&amp;gt;&lt;br /&gt; &amp;lt;class&amp;gt;exec_math.class&amp;lt;/class&amp;gt;&lt;br /&gt; &amp;lt;/action&amp;gt;&lt;br /&gt; &amp;lt;/cmd&amp;gt;&lt;br /&gt; &amp;lt;/mode&amp;gt;&lt;br /&gt; &amp;lt;mode&amp;gt; &lt;br /&gt; &amp;lt;pattern type='id'&amp;gt;config&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;cmd&amp;gt; &lt;br /&gt; &amp;lt;pattern type='id'&amp;gt;store&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;help&amp;gt;Store a value&amp;lt;/help&amp;gt;&lt;br /&gt; &amp;lt;param&amp;gt; &lt;br /&gt; &amp;lt;pattern type='id'&amp;gt;key_1&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;help&amp;gt;Key 1&amp;lt;/help&amp;gt; &lt;br /&gt; &amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;param&amp;gt; &lt;br /&gt; &amp;lt;pattern type='regex'&amp;gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;&lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:0\-9]&lt;/span&gt;?&amp;lt;/pattern&amp;gt;&lt;br /&gt; &amp;lt;pattern type='help'&amp;gt;NUM&amp;lt;/pattern&amp;gt; &lt;br /&gt; &amp;lt;help&amp;gt;0-99&amp;lt;/help&amp;gt; &lt;br /&gt; &amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;action&amp;gt; &lt;br /&gt; &amp;lt;class&amp;gt;conf_store.class&amp;lt;/class&amp;gt;&lt;br /&gt; &amp;lt;/action&amp;gt;&lt;br /&gt; &amp;lt;/cmd&amp;gt;&lt;br /&gt; &amp;lt;/mode&amp;gt; &lt;br /&gt; &amp;lt;/cli_grammar&amp;gt;&lt;/p&gt;
&lt;p&gt;This will plugin 2 CLIs to the CLI console, one config CLI, another exec CLI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;exec CLI: math &amp;lt;num&amp;gt; [ add | APPLICATIONEXTENSIONPLATFORM:sub ] &amp;lt;num&amp;gt;&lt;/li&gt;
&lt;li&gt;config CLI: store key_1 &amp;lt;num&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Details-PluginCLIactions"&gt;&lt;/a&gt;Plugin CLI actions&lt;/h3&gt;
&lt;p&gt;Developers should then implement the action classes referenced in the  CLI definitions. For example, implementing "exec_math.java":&lt;/p&gt;
&lt;div class="code panel" style="border-style: solid; border-width: 1px;"&gt;
&lt;div class="codeHeader panelHeader" style="border-bottom-width: 1px; border-bottom-style: solid;"&gt;&lt;strong&gt;exec_math.java&lt;/strong&gt;&lt;/div&gt;
&lt;div class="codeContent panelContent"&gt;
&lt;pre class="code-java"&gt;&lt;span class="code-keyword"&gt;import&lt;/span&gt; java.lang.&lt;span class="code-object"&gt;Integer&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="code-keyword"&gt;public&lt;/span&gt; class exec_math{&lt;br /&gt;   &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; &lt;span class="code-object"&gt;String&lt;/span&gt;[] eval(&lt;span class="code-object"&gt;String&lt;/span&gt; tokens[], &lt;span class="code-object"&gt;String&lt;/span&gt; grammar[]){&lt;br /&gt;      &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(&lt;span class="code-quote"&gt;"exec_math.eval: called"&lt;/span&gt;);      &lt;br /&gt;      /*&lt;br /&gt;      math_j  add &lt;br /&gt;      math_j  sub &lt;br /&gt;      */&lt;br /&gt;      &lt;span class="code-object"&gt;int&lt;/span&gt; num1 = &lt;span class="code-object"&gt;Integer&lt;/span&gt;.parseInt(tokens[1]);&lt;br /&gt;      &lt;span class="code-object"&gt;int&lt;/span&gt; num2 = &lt;span class="code-object"&gt;Integer&lt;/span&gt;.parseInt(tokens[3]);&lt;br /&gt;      &lt;span class="code-object"&gt;String&lt;/span&gt; operation = grammar[2];&lt;br /&gt;      &lt;span class="code-object"&gt;int&lt;/span&gt; result = 0;&lt;br /&gt;      &lt;span class="code-keyword"&gt;if&lt;/span&gt; (operation.equals(&lt;span class="code-quote"&gt;"add"&lt;/span&gt;)){&lt;br /&gt;         result = num1 + num2;&lt;br /&gt;      } &lt;span class="code-keyword"&gt;else&lt;/span&gt; {&lt;br /&gt;         result = num1 - num2;&lt;br /&gt;      }&lt;br /&gt;      &lt;br /&gt;      &lt;span class="code-object"&gt;String&lt;/span&gt; retStrArray[] = &lt;span class="code-keyword"&gt;new&lt;/span&gt; &lt;span class="code-object"&gt;String&lt;/span&gt;[2];&lt;br /&gt;      retStrArray[0] = &lt;span class="code-quote"&gt;"0"&lt;/span&gt;;&lt;br /&gt;      retStrArray[1] = &lt;span class="code-quote"&gt;"exec_math.eval: answer is "&lt;/span&gt; + result + &lt;span class="code-quote"&gt;"."&lt;/span&gt;;&lt;br /&gt;      &lt;span class="code-keyword"&gt;return&lt;/span&gt; retStrArray;&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;An example Makefile to compile these action classes:&lt;/p&gt;
&lt;p&gt;JAVAC = javac  &lt;br /&gt; default: bundle  &lt;br /&gt; bundle: compile    &lt;br /&gt; mv *.class actions/  &lt;br /&gt; compile: action_dir    &lt;br /&gt; $(JAVAC) exec_math.java conf_store.java  &lt;br /&gt; action_dir:    &lt;br /&gt; mkdir actions  &lt;br /&gt; clean:    &lt;br /&gt; @rm -rf *~ actions&lt;/p&gt;
&lt;p&gt;The following is an example how developers compile the actions&lt;/p&gt;
&lt;p&gt;-bash-3.00$ ls &lt;br /&gt; actions  app  cli_plugin.config  myapp1_cli.xml  proj  proj_src  sdk&lt;br /&gt; -bash-3.00$ cd actions/&lt;br /&gt; -bash-3.00$ ls&lt;br /&gt; conf_store.java  exec_math.java  Makefile&lt;br /&gt; -bash-3.00$ make&lt;br /&gt; mkdir actions&lt;br /&gt; javac exec_math.java conf_store.java&lt;br /&gt; mv *.class actions/&lt;br /&gt; -bash-3.00$ cd actions/&lt;br /&gt; -bash-3.00$ ls&lt;br /&gt; conf_store.class  exec_math.class&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-RunningtheCLIPlugintool"&gt;&lt;/a&gt;Running the CLI Plugin tool&lt;/h3&gt;
&lt;p&gt;After defining the CLI definitions and implementing the CLI actions,  developers should now use the CLI Plugin tool to package the CLIs into  the project source directory. They need to copy the CLI definitions and  CLI actions into the appropiate directories, as well as edit the  cli_plugin.config file with the correct values&lt;/p&gt;
&lt;p&gt;bash-3.00$ cd ../../sdk/tools/custom_cli/&lt;br /&gt; bash-3.00$ ls&lt;br /&gt; actions          cli_plugin.config  definitions&lt;br /&gt; cli_grammar.dtd  cli_plugin.py      internal&lt;br /&gt; bash-3.00$ cp ../../../actions/actions/* actions/&lt;br /&gt; bash-3.00$ cp ../../../myapp1_cli.xml definitions/&lt;br /&gt; bash-3.00$ cat cli_plugin.config&lt;br /&gt; file=myapp1_cli.xml&lt;br /&gt; javapath=/usr/java/java/bin&lt;br /&gt; vm=myapp1&lt;br /&gt; proj_src=/tmp/proj_src&lt;br /&gt; bash-3.00$ python cli_plugin.py&lt;br /&gt; cli_plugin.py ran successfully, please check the packages at output/&lt;br /&gt; package has been bundled into the project source directory at &lt;br /&gt; /tmp/proj_src&lt;/p&gt;
&lt;p&gt;Developers may verify that certain directories (e.g. cli_comm) are created in the project source directory&lt;/p&gt;
&lt;p&gt;-bash-3.00$ cd /tmp/proj_src/&lt;br /&gt; -bash-3.00$ ls&lt;br /&gt; cli_comm  etc  usr&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-StartthepluginCLIlistenerinthemainapplication"&gt;&lt;/a&gt;Start the plugin CLI listener in the main application&lt;/h3&gt;
&lt;p&gt;Developers should make changes in their main application to start the  CLI listener. This CLI listener will listen for CLIs from the host CLI  server, and dispatch them to the appropiate CLI actions. The following  example illustrate how to start the CLI listener in the main application&lt;/p&gt;
&lt;div class="code panel" style="border-style: solid; border-width: 1px;"&gt;
&lt;div class="codeHeader panelHeader" style="border-bottom-width: 1px; border-bottom-style: solid;"&gt;&lt;strong&gt;MyApp1Main.java&lt;/strong&gt;&lt;/div&gt;
&lt;div class="codeContent panelContent"&gt;
&lt;pre class="code-java"&gt;&lt;span class="code-keyword"&gt;package&lt;/span&gt; com.myApp1;&lt;br /&gt;&lt;br /&gt;&lt;span class="code-keyword"&gt;import&lt;/span&gt; com.cisco.aesop.apphosting.cli_distribution.CLIDistributionVM;&lt;br /&gt;&lt;br /&gt;&lt;span class="code-keyword"&gt;public&lt;/span&gt; class MyApp1Main {&lt;br /&gt;&lt;br /&gt;   &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; void main(&lt;span class="code-object"&gt;String&lt;/span&gt;[] args) {&lt;br /&gt;      &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(&lt;span class="code-quote"&gt;"MyApp1Main.main: called"&lt;/span&gt;);&lt;br /&gt;      CLIDistributionVM.startCLIDistributionVMThread(&lt;span class="code-quote"&gt;"myapp1"&lt;/span&gt;);&lt;br /&gt;      &lt;br /&gt;      &lt;span class="code-object"&gt;int&lt;/span&gt; num = 0;&lt;br /&gt;      &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(&lt;span class="code-quote"&gt;"MyApp1Main.main: entering loop"&lt;/span&gt;);&lt;br /&gt;      &lt;span class="code-keyword"&gt;while&lt;/span&gt;(&lt;span class="code-keyword"&gt;true&lt;/span&gt;){&lt;br /&gt;         &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(&lt;span class="code-quote"&gt;"MyApp1Main.main: "&lt;/span&gt; + num++);&lt;br /&gt;         &lt;span class="code-keyword"&gt;try&lt;/span&gt; {&lt;br /&gt;            &lt;span class="code-object"&gt;Thread&lt;/span&gt;.sleep(10 * 1000);&lt;br /&gt;         } &lt;span class="code-keyword"&gt;catch&lt;/span&gt; (InterruptedException e) {&lt;br /&gt;            &lt;span class="code-object"&gt;System&lt;/span&gt;.out.println(&lt;span class="code-quote"&gt;"MyApp1Main.main: done"&lt;/span&gt;);&lt;br /&gt;            &lt;span class="code-object"&gt;System&lt;/span&gt;.exit(1);&lt;br /&gt;         }&lt;br /&gt;      }   &lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A example Makefile to compile the main application. Notice that the  main application now needs "cli_distribution_vm.jar" to compile. This  jar file is found in the SDK, under sdk/jar/cli_distribution_vm.jar&lt;/p&gt;
&lt;p&gt;JAVAC = javac&lt;/p&gt;
&lt;p&gt;default: build_app&lt;/p&gt;
&lt;p&gt;build_app:&lt;br /&gt; mkdir classes/&lt;br /&gt; $(JAVAC) -classpath cli_distribution_vm.jar com/myApp1/MyApp1Main.java &lt;br /&gt; -d classes&lt;br /&gt; mkdir jar/&lt;br /&gt; jar cf jar/myApp1.jar -C classes/ com/&lt;/p&gt;
&lt;p&gt;clean:&lt;br /&gt; @rm -rf classes/ jar/ *~&lt;/p&gt;
&lt;p&gt;Make sure that the third party application is included in the project source directory&lt;/p&gt;
&lt;p&gt;-bash-3.00$ cd /tmp/proj_src/&lt;br /&gt; -bash-3.00$ ls&lt;br /&gt; app_bin  cli_comm  etc  usr&lt;br /&gt; -bash-3.00$ ls app_bin/&lt;br /&gt; myApp1.jar&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-PackagingandbundlingapplicationwithdependencyonpluginCLIaddon"&gt;&lt;/a&gt;Packaging and bundling application with dependency on plugin CLI add-on&lt;/h3&gt;
&lt;p&gt;Finally, developers should use the packaging and bundling tool to  package and bundle the application with dependency on the plugin CLI  add-on package. For more information, please refer to the SDK packaging  and bundling section.&lt;/p&gt;
&lt;p&gt;Developers first make sure that under the project directory, a pkg/  directory is created, and it contains the plugin CLI add-on package&lt;/p&gt;
&lt;p&gt;bash-3.00$ cd /tmp/proj/pkg/&lt;br /&gt; bash-3.00$ ls&lt;br /&gt; cli_plugin.0.0.2.45.prt1  cli_plugin.pkg&lt;/p&gt;
&lt;p&gt;Then, developers can run the packaging tool. Notice it contains a dependency on the plugin CLI SSID&lt;/p&gt;
&lt;p&gt;/tmp/sdk/tools/pkg_build.sh --project-dir '/tmp/proj' --dev-cert &lt;br /&gt; '/tmp/devcert/dev_certificate.jvln' &lt;br /&gt; --dev-auth '/tmp/devcert/dev_authorization.jvln' --private-key &lt;br /&gt; '/tmp/devcert/private.key' &lt;br /&gt; --name 'myapp1' --version '45.5' --source-dir '/tmp/proj_src' --deps &lt;br /&gt; 'b4b0ee92-cf8e-472b-8434-e8e7412ec71a,all' &lt;br /&gt; --disk-limit 'min=5000M,opt=6000M' --memory-limit '128M' --cpu-limit &lt;br /&gt; 'min=4000,opt=5000'&lt;/p&gt;
&lt;p&gt;Then, developers can run the bundling tool to bundle the third party application and the plugin CLI add-on together&lt;/p&gt;
&lt;p&gt;/tmp/sdk/tools/pkg_bundle.sh --project-dir '/tmp/proj' &lt;br /&gt; --private-key '/tmp/devcert/private.key' &lt;br /&gt; --output 'myapp1_cli.pkg' '/tmp/proj/pkg/cli_plugin.pkg' &lt;br /&gt; '/tmp/proj/pkg/myapp1.45.5.pkg'&lt;/p&gt;
&lt;p&gt;The project pkg directory now contains the bundled application&lt;/p&gt;
&lt;p&gt;-bash-3.00$ cd ../proj/pkg/&lt;br /&gt; -bash-3.00$ ls&lt;br /&gt; cli_plugin.0.0.2.45.prt1  myapp1.45.5.pkg   myapp1_cli.pkg&lt;br /&gt; cli_plugin.pkg            myapp1.45.5.prt1  myapp1_cli.prt1&lt;/p&gt;
&lt;p&gt;Install the bundled application&lt;/p&gt;
&lt;p&gt;Developers can try install this package via the CLI:&lt;/p&gt;
&lt;p&gt;se-1-100-50-147.unspecified&amp;gt; software install add url &lt;a href="../../../web/axp/wikidocs?src=/wiki/ftp%3A//myworstation" target="_top"&gt;ftp://myworstation&lt;/a&gt;&lt;br /&gt; /pub/apps/myapp1_cli.pkg ...&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-Runthemainapplication,issuetheCLIs"&gt;&lt;/a&gt;Run the main application, issue the CLIs&lt;/h3&gt;
&lt;p&gt;During installation, the blade should reboot. After rebooted, make  sure that the third party main application, which runs the CLI listener,  is started. The following startup command (run in the third party  application vserver context) in Java serves as example of what library  files and path are needed with starting the CLI listener in the main  application&lt;/p&gt;
&lt;p&gt;-bash-2.05b# cd app/&lt;br /&gt; -bash-2.05b# ls&lt;br /&gt; myApp1.jar&lt;br /&gt; -bash-2.05b# java -cp ./myApp1.jar:/usr/lib/java/localsocket.jar:/usr/lib&lt;br /&gt; /java/cli_distribution_vm.jar:/cli_comm com.myApp1.MyApp1Main&lt;/p&gt;
&lt;p&gt;On the CLI console, the new CLIs should be available&lt;/p&gt;
&lt;p&gt;se-1-100-50-147.unspecified&amp;gt; app-service custom myapp1&lt;br /&gt; se-1-100-50-147.unspecified(exec-appservice-myapp1)&amp;gt; ?&lt;/p&gt;
&lt;p&gt;end          Leave app-service exec mode&lt;br /&gt; math         Math operations with Java actions&lt;br /&gt; no           Negate the command&lt;br /&gt; se-1-100-50-147.unspecified(exec-appservice-myapp1)&amp;gt;&lt;br /&gt; se-1-100-50-147.unspecified(exec-appservice-myapp1)&amp;gt; end&lt;br /&gt; se-1-100-50-147.unspecified&amp;gt; config terminal&lt;br /&gt; Enter configuration commands, one per line.  End with CNTL/Z.&lt;br /&gt; se-1-100-50-147.unspecified(config)&amp;gt; app-service custom myapp1&lt;br /&gt; se-1-100-50-147.unspecified(config-appservice-myapp1)&amp;gt; ?&lt;/p&gt;
&lt;p&gt;end          Leave app-service config mode&lt;br /&gt; no           Negate the command&lt;br /&gt; store        Store a value&lt;br /&gt; se-1-100-50-147.unspecified(config-appservice-myapp1)&amp;gt;&lt;/p&gt;
&lt;p&gt;When user invoke the CLI, they should see the response from the CLI action:&lt;/p&gt;
&lt;p&gt;se-1-100-50-147.unspecified&amp;gt; app-service custom myapp1&lt;br /&gt; se-1-100-50-147.unspecified(exec-appservice-myapp1)&amp;gt; math 12 add 34&lt;br /&gt; exec_math.eval: answer is 46.&lt;br /&gt; se-1-100-50-147.unspecified(exec-appservice-myapp1)&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-ConfigCLIs"&gt;&lt;/a&gt;Config CLIs&lt;/h3&gt;
&lt;p&gt;Configuration CLIs are CLIs that can be persistently stored in the  blade's flash memory. In the above example, "store key_1 &amp;lt;num&amp;gt;" is  a config CLI. Executing config CLIs is similar to that of exec CLIs&lt;/p&gt;
&lt;p&gt;se-1-100-50-147.unspecified&amp;gt; config terminal&lt;br /&gt; Enter configuration commands, one per line.  End with CNTL/Z.&lt;br /&gt; se-1-100-50-147.unspecified(config)&amp;gt; app-service custom myapp1&lt;br /&gt; se-1-100-50-147.unspecified(config-appservice-myapp1)&amp;gt; store key_1 34&lt;br /&gt; se-1-100-50-147.unspecified(config-appservice-myapp1)&amp;gt;&lt;/p&gt;
&lt;p&gt;Issuing a config CLI will not display the response, but it  nevertheless will invoke the CLI action. Also, this CLI can be seen by  doing "show run" in the app-service. User can do "write memory" to write  this CLI to flash.&lt;/p&gt;
&lt;p&gt;se-1-100-50-147.unspecified&amp;gt; app-service system myapp1&lt;br /&gt; se-1-100-50-147.unspecified(exec-appservice)&amp;gt; show run&lt;br /&gt; Generating running configuration:&lt;/p&gt;
&lt;p&gt;app-service system myapp1&lt;br /&gt; hostname se-1-100-50-147.unspecified&lt;br /&gt; shutdown&lt;br /&gt; status-monitor interval_threshold 12 recovery_threshold 5&lt;br /&gt; exit&lt;br /&gt; app-service custom myapp1&lt;br /&gt; store key_1 34&lt;br /&gt; end&lt;br /&gt; se-1-100-50-147.unspecified(exec-appservice)&amp;gt;&lt;/p&gt;
&lt;p&gt;The way to retrieve the config CLI the next time the blade is  rebooted, or the application is resetted, is by using the application  status notifier. Application status notifier is a command to signal the  application health state (more info can be found in the "Health Monitor"  section). Anytime the application status monitor is invoked to set the  application to "ALIVE" state will triggered all the plugin config CLIs  to be sent over to the CLI actions.&lt;/p&gt;
&lt;p&gt;-bash-2.05b# /bin/app_status_notifier myapp1 ALIVE&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-e.Healthmonitor"&gt;&lt;/a&gt;e. Health monitor&lt;/h2&gt;
&lt;h3&gt;&lt;a name="Development-Details-CheckingandChangingApplicationHealth"&gt;&lt;/a&gt;Checking and Changing Application Health&lt;/h3&gt;
&lt;p&gt;There is a CLI to display the health of application:&lt;/p&gt;
&lt;p&gt;blade# appservice system &lt;br /&gt; (myapp)# show state&lt;br /&gt; APPLICATION                STATE               HEALTH&lt;br /&gt; myapp               online                  &amp;mdash;&lt;/p&gt;
&lt;p&gt;The column marks "HEALTH" indicates the current application health state.&lt;/p&gt;
&lt;p&gt;There are 4 HEALTH states:&lt;/p&gt;
&lt;p&gt;1. "---" default health state when application is reset or shutdown&lt;br /&gt; 2. "INITIALIZING" indicates application is starting up&lt;br /&gt; 3. "ALIVE" indicates application is up and running&lt;br /&gt; 4. "DOWN" indicates application is down&lt;/p&gt;
&lt;p&gt;This application health state should be changed by application  itself. For example, application can change it from "INITIALIZING" to  "ALIVE" when it knows that all the initializing is done.&lt;/p&gt;
&lt;p&gt;Application can use the command /bin/app_status_notifier to change the health state:&lt;/p&gt;
&lt;p&gt;vserver-shell# /bin/app_status_notifier myapp ALIVE&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-ApplicationStatusMonitoring"&gt;&lt;/a&gt;Application Status Monitoring&lt;/h3&gt;
&lt;h4&gt;&lt;a name="Development-Details-Watchdogscripts"&gt;&lt;/a&gt;Watchdog scripts&lt;/h4&gt;
&lt;p&gt;If the application state is "online" and application health is not  "DOWN", the application will be monitored by the application status  monitor.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application needs to provide one or more health check  script(s)/executable(s) and bundled in their package, if it wants to  leverage this application status monitor functionality. The number of  scripts/executables is application dependent. Shell scripts and c  executables are supported.&lt;/li&gt;
&lt;li&gt;Each application has its own way to determine whether the  application is running or not. The logic of health check  scripts/executables is application dependent. For example, it can be  based on Process Identifier (PID), or some response to an application  "ping".&lt;/li&gt;
&lt;li&gt;The watchdog script(s) need to be placed in the predefined  directory, /opt/app_status_monitor/watchdogs/ in the application vserver  directory, and needs to be executable. All watchdog scripts inside that  directory will be invoked, and if application developer wants to ensure  correct ordering for script invocation, they can follow the template  watchdog script format, which is W**.sh, where ** is a two digit number.  The template script is named W00template.sh and is provided for every  vserver.&lt;/li&gt;
&lt;li&gt;Application status monitor has a heartbeat of 5 seconds, this is  the minimum interval application status monitor performs any monitoring.  Given a monitor interval of 12, the monitor will perform monitoring on  each vserver every 12 heartbeat intervals (i.e. 1 minute). There is a  CLI to configure this monitor interval. For example, specifying a value  of "3" for this vserver means that application status monitor will wait  for every 3 heartbeat to monitoring this vserver.&lt;/li&gt;
&lt;li&gt;The script(s) or executable(s) need to return the status code. A  zero (0) status code indicates the application is healthy and alive. A  non-zero status code indicates to the monitoring system, the application  is not functional (i.e. crashed etc.). Example of a watchdog script:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;#!/bin/bash&lt;br /&gt; if &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM: -e /var/run/myapp.pid ]&lt;/span&gt;; then&lt;br /&gt; exit 0&lt;br /&gt; else&lt;br /&gt; exit 1&lt;br /&gt; fi&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When any one watchdog returns a non-zero status code, information  of this failed watchdog will be logged, such as name of watchdog, return  status, and the time of failure. There is a recovery counter that  counts how many times failure occurs, and it works like a delay in  taking any actions. A recovery counter of 3 means that the application  monitor has run the monitoring for 3 iterations and was either getting  non zero return status, or the watchdog has been running for over 3  monitor interval and is not returning. There is a configurable recovery  threshold that decides how many recovery counter before taking the next  action. When the recovery threshold is reached vserver will be  restarted.&lt;/li&gt;
&lt;li&gt;After vserver restarted, application status monitor shall continue  to run, and the steps described above will be repeated. There is no  limit on how many times the vserver restarts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;a name="Development-Details-CLIsandconfigurations"&gt;&lt;/a&gt;CLIs and configurations&lt;/h4&gt;
&lt;p&gt;There are CLIs to show the status monitor, as well as configure the monitor interval and recovery threshold.&lt;/p&gt;
&lt;p&gt;1. Show status monitor&lt;/p&gt;
&lt;p&gt;blade# appservice system myapp&lt;br /&gt; (myapp)# show status&lt;br /&gt; Application:                   myapp1&lt;br /&gt; Monitor status:                PASSED&lt;br /&gt; Monitor in progress:           No&lt;br /&gt; Last executed watchdog:        W01myapp1_test.sh&lt;br /&gt; Last executed date:            Tue Jul 10 10:22:06 PDT 2007&lt;br /&gt; Last failed watchdog:          W01myapp1_test.sh&lt;br /&gt; Last failed return code:       4&lt;br /&gt; Last failed date:              Mon Jul  9 12:34:18 PDT 2007&lt;br /&gt; Last restarted date:           Mon Jul  9 12:33:32 PDT 2007&lt;br /&gt; Recovery threshold:            6&lt;br /&gt; Monitor interval:              2&lt;/p&gt;
&lt;p&gt;2. Change the monitor interval and recovery threshold&lt;/p&gt;
&lt;p&gt;blade# config terminal&lt;br /&gt; (config)# appservice system myapp&lt;br /&gt; (config-myapp)# status-monitor monitor_interval 24 &lt;br /&gt; recovery_threshold 10&lt;br /&gt; (config-myapp)# end&lt;/p&gt;
&lt;p&gt;In addition, third party developers can provide a default  configurations via a config file packaged together with the third party  application. This file name and path is  /opt/app_status_monitor/config/config, and it should look like this:&lt;/p&gt;
&lt;p&gt;monitor_interval 50 &lt;br /&gt; recovery_threshold 10&lt;/p&gt;
&lt;p&gt;The two configuration values "monitor_interval" and  "recovery_threshold", followed by a space, and then a number ranges from  1 to 99. Both must be present.&lt;/p&gt;
&lt;p&gt;The CLI configuration values takes precedence over the config file  values, since the config file only serves as a default at application is  installed.&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-f.SSHtunneling"&gt;&lt;/a&gt;f. SSH tunneling&lt;/h2&gt;
&lt;p&gt;Given that AXP supports vserver SSH connection, AXP also supports  third party developers to utilize SSH tunnelling to enhance their  applications. Third party developers can run applications such as X  services that are tunnelled through SSH. In addition, developers and  application administrators can use the SSH tunnelling to debug their own  applications and vserver environment. Given that user can login to the  vserver SSH server, we support two SSH tunnelling options&lt;/p&gt;
&lt;p&gt;1. "ssh -L" - Port Forwarding&lt;br /&gt; 2. "ssh -X" - X11 Forwarding&lt;/p&gt;
&lt;p&gt;Detail explanation on these two options are best found on the manual  pages for SSH. The link below provides one example of online resources:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.die.net/doc/linux/man/man1/ssh.1.html" target="_top"&gt;http://www.die.net/doc/linux/man/man1/ssh.1.html&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-PortForwarding"&gt;&lt;/a&gt;Port Forwarding&lt;/h3&gt;
&lt;p&gt;One example to connect with "-L" port forwarding option:&lt;/p&gt;
&lt;p&gt;workstation-shell# ssh -L :: @ -p &lt;br /&gt; workstation-shell# ssh -L 7777:localhost:8888 tunnel_root@myblade -p 2022&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-X11Forwarding"&gt;&lt;/a&gt;X11 Forwarding&lt;/h3&gt;
&lt;p&gt;One example to connect with "-X" X11 forwarding option:&lt;/p&gt;
&lt;p&gt;workstation-shell# ssh -X @ -p &lt;br /&gt; workstation-shell# ssh -X tunnel_root@myblade -p 2022&lt;br /&gt; vserver-shell# xterm &amp;amp;&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-g.UtilizingthePromiscuouspacketAPI"&gt;&lt;/a&gt;g. Utilizing the Promiscuous packet API&lt;/h2&gt;
&lt;h3&gt;&lt;a name="Development-Details-NAMNetworkAnalysisModule"&gt;&lt;/a&gt;NAM - Network Analysis Module&lt;/h3&gt;
&lt;h4&gt;&lt;a name="Development-Details-Overview"&gt;&lt;/a&gt;Overview&lt;/h4&gt;
&lt;p&gt;Currently Cisco IOS enables a configuration to duplicate packets for  network analysis when it detects the presence of the network analysis  module (NAM) or intrusion detection module (IDS). Cisco IOS is notified  through a card type cookie which consists of the product ID and a  controller ID. The Cisco ISR service module cookie is similarly  programmed to contain the same controller ID as a NAM to enable the  Cisco IOS packet analysis CLI to be turned on for the service module.&lt;/p&gt;
&lt;h4&gt;&lt;a name="Development-Details-HowtoconfigureNAM"&gt;&lt;/a&gt;How to configure NAM&lt;/h4&gt;
&lt;p&gt;Under the interface you would like to monitor traffic, configure  analysis-module monitoring. Both incoming and outgoing traffic are  monitored.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;p&gt;interface GigabitEthernet0/0&lt;br /&gt; description $ETH-LAN$$ETH-SW-LAUNCH$$INTF-INFO-GE 0/0$&lt;br /&gt; ip address 1.100.50.221 255.255.255.0&lt;br /&gt; duplex auto&lt;br /&gt; speed auto&lt;br /&gt; analysis-module monitoring&lt;br /&gt; no keepalive&lt;br /&gt; end&lt;/p&gt;
&lt;h4&gt;&lt;a name="Development-Details-AdvantagesofNAM"&gt;&lt;/a&gt;Advantages of NAM&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Easy to configure&lt;/li&gt;
&lt;li&gt;Lightweight Export.&lt;/li&gt;
&lt;li&gt;Exports BOTH inbound/outbound traffic on the configured interface&lt;/li&gt;
&lt;li&gt;Exports locally generated packets (router generated) (i.e. ping reply from the ISR)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;a name="Development-Details-LimitationsofNAM"&gt;&lt;/a&gt;Limitations of NAM&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;No ACL support&lt;/li&gt;
&lt;li&gt;No Sampling rate support&lt;/li&gt;
&lt;li&gt;Can only export to an attached NAM or IDS module. (sufficient for AXP).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Details-RITERouterIPTrafficExport"&gt;&lt;/a&gt;RITE - Router IP Traffic Export&lt;/h3&gt;
&lt;h4&gt;&lt;a name="Development-Details-Overview"&gt;&lt;/a&gt;Overview&lt;/h4&gt;
&lt;p&gt;RITE is a lightweight mechanism for duplicating and exporting  monitored traffic on an interface to an analysis module. The analysis  module need not be attached to the ISR (unlike NAM), they can be  connected over a physical interface with different encapsulations such  as Ethernet, PPP, and many more. The Integrated-Service-Engine interface  used by the AXP service module behaves like an Ethernet interface and  is therefore a supported export interface for RITE.&lt;/p&gt;
&lt;p&gt;RITE provides a more granular traffic capture over NAM. One can  specify ACL, sampling rate, and also the direction of the capture to  export more specific traffic on an interface. There is however one  limitation on RITE; router generated traffic will not be captured by  RITE. Router generated packets are process switched and not cef  switched, and is not along the capture path of RITE.&lt;/p&gt;
&lt;h4&gt;&lt;a name="Development-Details-HowtoconfigureRITE"&gt;&lt;/a&gt;How to configure RITE&lt;/h4&gt;
&lt;p&gt;The high level steps to configure RITE are:&lt;/p&gt;
&lt;p&gt;1. Create a RITE capture profile&lt;br /&gt; 2. Configure the parameters of the profile&lt;br /&gt; 3. Apply the profile on the interface one wishes to monitor&lt;/p&gt;
&lt;h4&gt;&lt;a name="Development-Details-CreateaRITEcaptureprofile"&gt;&lt;/a&gt;Create a RITE capture profile&lt;/h4&gt;
&lt;p&gt;Create a profile with ip traffic-export profile &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:any name]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Configure the interface you wish to export to. This should be interface Integrated-Service-Engine 1/0.&lt;/p&gt;
&lt;p&gt;Configure the mac-address of the Integrated-Service-Engine1/0 interface with the mac-address &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:address]&lt;/span&gt; command.&lt;/p&gt;
&lt;p&gt;One can optionally configure bidirectional if one wishes to capture  both inbound and outbound traffic. Inbound only capture is default.&lt;/p&gt;
&lt;p&gt;A Note on the mac-address: Conceptually, the mac-address should be  the valid mac-address of the service module. However, since the  service-module is configured with promiscuous mode, invalid mac-address  will also work. There is however still a problem since the service  module is set to route packets by default, configuring a valid  mac-address will actually cause the routing stack of the service-module  to route the traffic which is not a desired behavior (this will cause  duplicated packets to be routed). So to eliminate this problem, it is  recommended that you configure an invalid mac-address (something other  than the mac-address of the service-module - such as a.a.a), this way  your traffic will reach the service module but will not be routed.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;jc1(config)#ip traffic-export profile rite-bi&lt;br /&gt; jc1(conf-rite)#?&lt;br /&gt; IP traffic export profile configuration commands&lt;br /&gt; bidirectional  Enable bidirectional traffic export&lt;br /&gt; exit           Exit from ip traffic export profile sub mode&lt;br /&gt; incoming       Configure incoming IP traffic export&lt;br /&gt; interface      Specify outgoing interface for exporting traffic&lt;br /&gt; mac-address    Specify ethernet address of destination host&lt;br /&gt; no             Negate or set default values of a command&lt;br /&gt; outgoing       Configure outgoing IP traffic export&lt;/p&gt;
&lt;p&gt;ip traffic-export profile rite-bi&lt;br /&gt; interface Integrated-Service-Engine1/0&lt;br /&gt; bidirectional&lt;br /&gt; mac-address a.a.a&lt;br /&gt; !&lt;/p&gt;
&lt;h4&gt;&lt;a name="Development-Details-ConfigureRITEexportparameters"&gt;&lt;/a&gt;Configure RITE export parameters&lt;/h4&gt;
&lt;p&gt;One can configure incoming or outgoing parameters by entering each  menu. You can apply a regular access-list, or configure the sample rate  of the export traffic.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;jc1(config)#ip traffic-export profile rite-bi&lt;br /&gt; jc1(conf-rite)#incoming ?&lt;br /&gt; access-list  Apply standard or extended access lists to exported traffic&lt;br /&gt; sample       Enable sampling of exported traffic&lt;/p&gt;
&lt;p&gt;ip traffic-export profile rite-bi&lt;br /&gt; interface Integrated-Service-Engine1/0&lt;br /&gt; bidirectional&lt;br /&gt; incoming access-list 4&lt;br /&gt; outgoing access-list 4&lt;br /&gt; mac-address a.a.a&lt;br /&gt; incoming sample one-in-every 2&lt;br /&gt; outgoing sample one-in-every 2&lt;br /&gt; !&lt;/p&gt;
&lt;h4&gt;&lt;a name="Development-Details-Applytheprofiletoaninterface"&gt;&lt;/a&gt;Apply the profile to an interface&lt;/h4&gt;
&lt;p&gt;Configure ip traffic-export apply &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:profile name]&lt;/span&gt; on the interface you wish to monitor.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;interface GigabitEthernet0/0&lt;br /&gt; description $ETH-LAN$$ETH-SW-LAUNCH$$INTF-INFO-GE 0/0$&lt;br /&gt; ip address 1.100.50.221 255.255.255.0&lt;br /&gt; ip traffic-export apply rite-bi&lt;br /&gt; duplex auto&lt;br /&gt; speed auto&lt;br /&gt; no keepalive&lt;br /&gt; end&lt;/p&gt;
&lt;h4&gt;&lt;a name="Development-Details-AdvantagesofRITE"&gt;&lt;/a&gt;Advantages of RITE&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Lightweight export&lt;/li&gt;
&lt;li&gt;Can capture incoming or bidirectional traffic&lt;/li&gt;
&lt;li&gt;Allow user to configure ACL&lt;/li&gt;
&lt;li&gt;Allow user to configure sampling rate&lt;/li&gt;
&lt;li&gt;Can export to interfaces with different encapsulation types (though  for AXP, we're only interested in the Integrated-Service-Engine type).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;a name="Development-Details-LimitationsofRITE"&gt;&lt;/a&gt;Limitations of RITE&lt;/h4&gt;
&lt;p&gt;&amp;iquest; Due to design of RITE, router generated packets cannot be exported  since it does not go through the CEF switching path. (i.e. If someone  pings the ISR, the ping reply that the ISR generates will not be  exported even if you have bidirectional configured). If capturing this  traffic is important for your application, consider using NAM.&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-HowtodecidewhethertouseNAMorRITEforyourapplication"&gt;&lt;/a&gt;How to decide whether to use NAM or RITE for your application&lt;/h3&gt;
&lt;p&gt;Both packet monitoring features have its pros and cons. The  advantages and limitations for each is listed in their respective  sections. Here is an attempt to provide some suggestions on which to use  for your application:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If your application requires monitoring router-generated packets then use NAM as RITE cannot support this.&lt;/li&gt;
&lt;li&gt;If you just want to quickly configure something and get it to work, use NAM.&lt;/li&gt;
&lt;li&gt;If you want more granular control on your exported traffic, then  RITE would be the choice for you. Keep in mind the above limitation. In  general, if you don't care about router-generated packets I would  recommend RITE as it provides more feature set.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: Both features are allowed to be configured at the same time,  however, it is not recommended to do so. Each feature does its own  duplication, you will receive two duplicated packets if you configured  both of them at the same time.&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-PacketCaptureAPIsupport:"&gt;&lt;/a&gt;Packet Capture API support:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Refer to section on NAM and RITE for configuration of packet  diversion technology that will capture and divert replicated packets to  the AXP blade.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;In terms of API support, AXP enables application to capture packet  through the use of promiscuous mode thorough the use of raw socket the  following kernel configuration have been enabled for packet capturing:&lt;br /&gt; o raw socket interface (CONFIG_RAW) - &lt;a href="http://en.wikipedia.org/wiki/Raw_socket" target="_top"&gt;http://en.wikipedia.org/wiki/Raw_socket&lt;/a&gt;&lt;br /&gt; o raw socket memory mapped mode (CONFIG_RAW_MMAP) -&lt;br /&gt; o socket filtering (CONFIG_FILTER).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These features can be accessible directly by 3rd party developer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AXP also provides the libpcap library as higher level abstraction for packet capture.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;libpcap references:&lt;br /&gt; o Libpcap library(&lt;a href="http://www.tcpdump.org/" target="_top"&gt;http://www.tcpdump.org&lt;/a&gt;)&lt;br /&gt; o "man 3 pcap" for further details.&lt;br /&gt; o &lt;a href="http://www.cet.nau.edu/%7Emc8/Socket/Tutorials/section1.html" target="_top"&gt;http://www.cet.nau.edu/~mc8/Socket/Tutorials/section1.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;A cavaet to this is that the linux-vserver technology does not  fully virtualize networking interfaces as a result, with raw socket  being used, all available network interface created under AXP can be  monitored by the an application running inside a vsever container.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;a name="Development-Details-ExampleofusingRawSocket"&gt;&lt;/a&gt;Example of using Raw Socket&lt;/h4&gt;
&lt;p&gt;s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));&lt;br /&gt; struct sockaddr_ll socket_address;&lt;br /&gt; socket_address.sll_family   = AF_PACKET;&lt;br /&gt; socket_address.sll_protocol = htons(ETH_P_ALL);&lt;br /&gt; bind(s, (struct sockaddr *) &amp;amp; socket_address, sizeof(socket_address));&lt;br /&gt; recvfrom(s, buffer, ETH_FRAME_LEN, 0, NULL, NULL);&lt;/p&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-h.Loggingsupportandrecommendations"&gt;&lt;/a&gt;h. Logging support and recommendations&lt;/h2&gt;
&lt;h3&gt;&lt;a name="Development-Details-VirtualInstanceLoggingSupport"&gt;&lt;/a&gt;Virtual Instance Logging Support&lt;/h3&gt;
&lt;p&gt;Syslog is used as the tracing/logging facility for the applications inside the virtual instance (VI).&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-1.ConfigureApplicationLoggingFacility"&gt;&lt;/a&gt;1. Configure Application Logging Facility&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;syslog-ng, an improved syslogd daemon, is used for VI logging service.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;The syslog file, /var/log/messages.log, is pre-configured by the system.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;AXP syslog supports file rotation - rotation of two files is supported.&lt;br /&gt; o messages.log (primary log file)&lt;br /&gt; o messages.log.prev (backup log flie)&lt;br /&gt; o User is able to configure the log file size limit. Once  /var/log/messages.log reaches the configured limit, its contents is  moved to a backup log file, messages.log.prev. A new  /var/log/messages.log file is started.&lt;br /&gt; + conf t&lt;br /&gt; + app-service &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:appname]&lt;/span&gt;&lt;br /&gt; + limit log-file size &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:MegaBytes]&lt;/span&gt; ( default 5MB)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;AXP syslog supports syslog levels&lt;br /&gt; o Even though all log levels are support, but CLI reduces configuration to 4 log levels.&lt;br /&gt; + conf t&lt;br /&gt; + app-service &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:appname]&lt;/span&gt;&lt;br /&gt; + log level &lt;span class="error"&gt;[error ]&lt;/span&gt; (default warning)&lt;br /&gt; + error - Events with LOG_ERR, LOG_EMERG, LOG_ALERT, and LOG_CRIT are logged.&lt;br /&gt; + warning - Events with LOG_WARNING, LOG_ERR, LOG_EMERG, LOG_ALERT, LOG_CRIT are logged.&lt;br /&gt; + notice - Events with LOG_NOTICE, LOG_WARNING, LOG_ERR, LOG_EMERG, LOG_ALERT, LOG_CRIT are logged.&lt;br /&gt; + info - Events with LOG_INFO, LOG_NOTICE, LOG_WARNING, LOG_ERR, LOG_EMERG, LOG_ALERT, LOG_CRIT are logged&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;AXP syslog supports remote logging&lt;br /&gt; o Logging support is default to log locally to /var/log/messages.log file.&lt;br /&gt; o User is able to configure the logging to remote syslog server.&lt;br /&gt; + conf t&lt;br /&gt; + app-service &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:appname]&lt;/span&gt;&lt;br /&gt; + log server address &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:a.b.c.d]&lt;/span&gt; (default disabled)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Details-2.ApplicationLoggingUsage"&gt;&lt;/a&gt;2. Application Logging Usage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Third party applications can use either the C syslog API or Java  log4j Syslog Appender for logging. As mentioned, log messages goes to  /var/log/messages.log&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Syslog for C&lt;br /&gt; o See syslog API&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;*&lt;br /&gt; o Examples:&lt;br /&gt; + setlogmask (LOG_UPTO (LOG_DEBUG));&lt;br /&gt; + openlog("myapp", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);&lt;br /&gt; + syslog(LOG_DEBUG, "myapp_user_management.eval() processing CLI message\n");&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log4j for Java&lt;br /&gt; o See Syslog Appender in the Log4J document&lt;br /&gt; o If an application uses log4j, it might use multiple  appenders for the logging. To leverage AXP logging facility (syslog),  application need to specify the Syslog Appender to log to syslog.&lt;br /&gt; o SyslogAppender can specify its own log level in the  log4j.properties file. The log will first be filtered by the  SyslogAppender level configuration. Then, the log will be send to the  syslog on the vserver, which will then be filtered by the syslog level  configuration (i.e. log level &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:level]&lt;/span&gt; CLI as above). Hence, both level configuration is in effect, and the logs are filtered first by the log4j then by the syslog.&lt;br /&gt; o Currently, if an application chooses to use the AXP syslog  mechanism, they can set the log level in its log4j SyslogAppender to be  of lowest priority (e.g. DEBUG), then control the filtering through the  syslog CLI on AXP.&lt;br /&gt; o In the future release, AXP will provide plugin for  application to dynamic change Log4J syslog appender to the log level  configured via CLI.&lt;br /&gt; o Examples: log4j.properties to enable Syslog Appender:&lt;br /&gt; + # Set root logger level to DEBUG and its only appender to A1.&lt;br /&gt; + log4j.rootLogger=DEBUG, mySyslog&lt;br /&gt; + # mySyslog config&lt;br /&gt; + log4j.appender.mySyslog.layout=org.apache.log4j.PatternLayout&lt;br /&gt; + log4j.appender.mySyslog.layout.ConversionPattern=%p %t %c - %m%n&lt;br /&gt; + log4j.appender.mySyslog.SyslogHost=localhost&lt;br /&gt; + log4j.appender.mySyslog.Facility=USER&lt;br /&gt; + log4j.appender.mySyslog.threshold=INFO&lt;br /&gt; o (new) For any APIs and libraries provided by AXP, logs are  redirected to stdout (via System.out.println). If an application that  uses these APIs and libraries and wants to redirect such logs to syslog,  the application can be executed with its output piped to /bin/logger.  Given the example of starting an application that uses CLI Plugin&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;java -cp ./app_bin/myApp.jar:/cli_comm/:/usr/lib/java&lt;br /&gt; /localsocket.jar:/usr/lib/java/cli_distribution_vm.jar &lt;br /&gt; com.myApp.MyAppMain | /bin/logger -p info &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This will redirect stdout of the CLI Plugin (as well as  any System.out.println called by the application itself) to the syslog  as priority INFO&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-3.ApplicationLoggingViewing"&gt;&lt;/a&gt;3. Application Logging Viewing&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CLIs are provided to display the contents of all log files under /var/log directory in the Vserver context.&lt;br /&gt; o &amp;gt;app-service &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:appname]&lt;/span&gt;&lt;br /&gt; o exec-appname&amp;gt; show logs&lt;br /&gt; + Show all the files under /var/log directory&lt;br /&gt; o exec-appname&amp;gt; show log name &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:log name]&lt;/span&gt;&lt;br /&gt; + show the content of the spcified log file&lt;br /&gt; + wild card &lt;img class="emoticon" src="../../../wiki/images/icons/emoticons/star_yellow.gif" border="0" width="16" height="16" align="absmiddle" /&gt; is supported for the file name (i.e. *.log)&lt;br /&gt; + output modifiers (i.e. paged, containing, tail, |, and less) are supported for easier viewing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-i.CreatingaapplicationconsolewithintheCLI"&gt;&lt;/a&gt;i. Creating a application console within the CLI&lt;/h2&gt;
&lt;h3&gt;&lt;a name="Development-Details-Overview"&gt;&lt;/a&gt;Overview&lt;/h3&gt;
&lt;p&gt;A CLI command, connect console , is provided to allow application to  create console access in its own vserver instance (Merwan: please use  consistent term to name a Vserver through out the document. Whatever  term is decided). Application can leverage this capability to&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Access the shell inside its own vserver context, or&lt;/li&gt;
&lt;li&gt;Launch their own CLI console access, or&lt;/li&gt;
&lt;li&gt;Run an application program inside vserver&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Details-Usage"&gt;&lt;/a&gt;Usage&lt;/h3&gt;
&lt;p&gt;1. To leverage this capability, application needs to provide a  "console" file which can be a executable or a script. Please see the  sample files below.&lt;br /&gt; 2. The file needs to be placed under /bin directory in the source files to be packaged. (i.e. /bin/console)&lt;br /&gt; 3. After application is installed, execute the connect console  command under the application context. This will trigger the execution  of /bin/console file.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;gt;app-service sampleApp&lt;/li&gt;
&lt;li&gt;exec-sampleApp&amp;gt;connect console&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Details-Sample"&gt;&lt;/a&gt;Sample&lt;/h3&gt;
&lt;p&gt;The following provides some sample /bin/console files for references:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Used to access the shell&lt;br /&gt; o One way is to link the bash program to this file using post-install script or application startup script&lt;br /&gt; + ln -s /bin/bash /bin/console&lt;br /&gt; o The other way is to have one line in the /bin/console file as follows:&lt;br /&gt; + #!/bin/bash&lt;br /&gt; + bash&lt;/li&gt;
&lt;li&gt;Used to cross connect to application CLI console&lt;br /&gt; o #!/bin/bash&lt;br /&gt; o telnet 127.0.0.1 34567&lt;/li&gt;
&lt;li&gt;Used to run a application program&lt;br /&gt; o build application program as executable and named as console, or&lt;br /&gt; o launch the application program in the console file&lt;br /&gt; o #!/bin/bash&lt;br /&gt; o start_myapp.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="Development-Details-LinuxShellaccessviaCLI"&gt;&lt;/a&gt;Linux Shell access via CLI&lt;/h3&gt;
&lt;p&gt;Another optional packaged CLI command, linux shell , is also provided to allow application to access the guest os shell.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This CLI is bundled in infrastructure add-on package, app_debug.pkg.&lt;/li&gt;
&lt;li&gt;After intalling the package, user can go into linux shell by doing the following:&lt;br /&gt; o &amp;gt;app-servcie &lt;span class="error"&gt;[APPLICATIONEXTENSIONPLATFORM:appname]&lt;/span&gt;&lt;br /&gt; + linux shell&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a name="Development-Details-3.Applicationdebugging"&gt;&lt;/a&gt;3. Application debugging&lt;/h1&gt;
&lt;h2&gt;&lt;a name="Development-Details-a.Vservercommands"&gt;&lt;/a&gt;a. Vserver commands&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Not Sure what is required here we do not expose Vserver command in GuestOS?. We have provided wrappers in CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="../../../wiki/display/AXP/Development%20-%20Details?#Development-Details-top"&gt;APPLICATIONEXTENSIONPLATFORM:Return To Top&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name="Development-Details-b.GDBDebugging"&gt;&lt;/a&gt;b. GDB Debugging&lt;/h2&gt;
&lt;h3&gt;&lt;a name="Development-Details-SetupGDBDebuggingSession"&gt;&lt;/a&gt;Set up GDB Debugging Session&lt;/h3&gt;
&lt;p&gt;GDB debugging capability is provided through the "gdbserver" and  "gdb" commands. The GDB connection is done through the vserver SSH  connection. The steps are:&lt;/p&gt;
&lt;p&gt;1. Setup a debugging session on the application running in the vserver, using "gdbserver"&lt;br /&gt; 2. Make a SSH tunnel connection ("-L" option for port forwarding)&lt;br /&gt; 3. Run "gdb" on the workstation and connect to the SSH tunnel&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-Setupdebuggingsession"&gt;&lt;/a&gt;Set up debugging session&lt;/h3&gt;
&lt;p&gt;There are two ways to setup gdb debugging session&lt;/p&gt;
&lt;p&gt;1. Login to vserver SSH server as "tunnel_root" and run  "gdbserver" manually. Given that the application name is /my_app/debug&lt;/p&gt;
&lt;p&gt;workstation-shell# ssh tunnel_root@myblade -p 2022&lt;br /&gt; tunnel_root@myblade's password: &lt;br /&gt; vserver-shell# gdbserver localhost:2222 /my_app/debug &lt;br /&gt; Process /my_app/debug created; pid = 29165&lt;br /&gt; Listening on port 2222&lt;/p&gt;
&lt;p&gt;2. Setup the "tunnel_user" startup script to do runtime "gdbserver" binding, using the application process ID&lt;/p&gt;
&lt;p&gt;This requires changing the "tunnel_user" startup script, as example like this (given my application process name is "debug"):&lt;/p&gt;
&lt;p&gt;#!/bin/bash&lt;br /&gt; pid=`ps -ef | grep debug | awk '{print $2}'`&lt;br /&gt; echo "gdbserver will be running on process ${pid}, binded to port 2222"&lt;br /&gt; gdbserver localhost:2222 --attach $&lt;/p&gt;
&lt;div class="error"&gt;&lt;span class="error"&gt;Unknown macro: {pid}&lt;/span&gt;&lt;/div&gt;
&lt;h3&gt;&lt;a name="Development-Details-MakingSSHtunnelconnection"&gt;&lt;/a&gt;Making SSH tunnel connection&lt;/h3&gt;
&lt;p&gt;Given that port 2222 is binded to the gdbserver on the vserver side,  the following command will establish SSH tunnel from the workstation's  port 4567 to blade's 2222&lt;/p&gt;
&lt;p&gt;workstation-shell# ssh -L 4567:localhost:2222 tunnel_root@myblade -p 2022&lt;/p&gt;
&lt;h3&gt;&lt;a name="Development-Details-Run&amp;quot;gdb&amp;quot;ontheworkstationandconnecttoSSHtunnel"&gt;&lt;/a&gt;Run "gdb" on the workstation and connect to SSH tunnel&lt;/h3&gt;
&lt;p&gt;Given that port 4567 is binded to the SSH tunnel on the workstation&lt;/p&gt;
&lt;p&gt;workstation-shell-2# gdb&lt;br /&gt; (gdb) file debug&lt;br /&gt; (gdb) target remote localhost:4567&lt;br /&gt; (gdb)&lt;/p&gt;
&lt;p&gt;After that you can use gdb commands like "break", "continue", "step". Below list one online resource regarding GDB usage: &lt;a href="http://www.cucy.net/lacp/archives/000024.html" target="_top"&gt;http://www.cucy.net/lacp/archives/000024.html&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 06 Aug 2010 17:44:20 GMT</pubDate>
      <guid isPermaLink="false">http://developer.cisco.com/web/axp/wikidocs?p_p_auth=0htfMz0L&amp;p_p_id=36&amp;p_p_lifecycle=0&amp;p_r_p_185834411_nodeId=803283&amp;p_r_p_185834411_title=&amp;Development+-+Details</guid>
      <dc:creator>Matthew J Denapoli</dc:creator>
      <dc:date>2010-08-06T17:44:20Z</dc:date>
    </item>
  </channel>
</rss>

