Introduction

  • Need to add one tab(DAC Demo) in left panel in landing page of RDKB WebUI(http://10.0.0.1).
  • Upon clicking "DAC Demo" tab, new page should be loaded in right panel.
  • New page should have a Text field and a button.
  • On clicking the Execute button, the script mentioned in the text field should be executed in the running target and the result should be notified in local WebUI (perhaps through alert).

Build Procedure

             Need to flash base build as rpi3 on rpi3 target ,

rpi3-repo commands
$ mkdir <workspace dir>
$ cd <workspace dir>
$ repo init -u https://code.rdkcentral.com/r/manifests -b dunfell -m rdkb-extsrc.xml
$ repo sync -j`nproc` --no-clone-bundle

Add Dobby package in RDK-B build -  meta-cmf-raspberrypi/recipes-core/packagegroups/packagegroup-rdk-ccsp-broadband.bbappend 


Dobby Package
+++ b/recipes-core/packagegroups/packagegroup-rdk-ccsp-broadband.bbappend
@@ -6,6 +6,9 @@ RDEPENDS_packagegroup-rdk-ccsp-broadband_append = "\
     libseshat \
     notify-comp \
     start-parodus \
+    dobby \
+    crun \
     \
 "
Build steps
$ MACHINE=raspberrypi-rdk-broadband source meta-cmf-raspberrypi/setup-environment
$ bitbake rdk-generic-broadband-image

Flashing Procedure :  RPI 3B/3B+ Model Reference Platform

Create an OCI image for a sample application using meta-dac-sdk(Ex: helloworld-test)

Please refer the below link,

Containerization using META DAC SDK in RDK-B RPI

Note : For helloworld-test , we can use below config.json (by default config.json is not worked)


config.json - helloworld-test
root@RaspberryPi-Gateway:/dac#$ cat /rpi3_reference-dac-image-helloworld-test-raspberrypi-rdk-broadband-20230403072115.rootfs-oci-latest-arm-linux.oci-image/config.json 
{
    "ociVersion": "1.0.2-dobby",
    "process": {
        "terminal": true,
        "user": {
            "uid": 0,
            "gid": 0
        },
        "args": [
            "/usr/libexec/DobbyInit",
            "/usr/bin/helloworld-test"
        ],
        "env": [
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "cwd": "/",
        "capabilities": {
            "bounding": [ ],
            "effective": [ ],
            "inheritable": [ ],
            "permitted": [ ],
            "ambient": [ ]
        },
        "rlimits": [ ],
        "noNewPrivileges": true
    },
    "root": {
        "path": "rootfs"
    },
    "hostname": "umoci-default",
    "mounts": [
        {
            "destination": "/proc",
            "type": "proc",
            "source": "proc"
        },
        {
            "destination": "/dev",
            "type": "tmpfs",
            "source": "tmpfs",
            "options": [
                "nosuid",
                "strictatime",
                "mode=755",
                "size=65536k"
            ]
        },
        {
            "destination": "/dev/pts",
            "type": "devpts",
            "source": "devpts",
            "options": [
                "nosuid",
                "noexec",
                "newinstance",
                "ptmxmode=0666",
                "mode=0620"
            ]
        },
        {
            "destination": "/dev/shm",
            "type": "tmpfs",
            "source": "shm",
            "options": [
                "nosuid",
                "noexec",
                "nodev",
                "mode=1777",
                "size=65536k"
            ]
        },
        {
            "destination": "/sys",
            "type": "bind",
            "source": "/sys",
            "options": [
                "rbind",
                "nosuid",
                "noexec",
                "nodev",
                "ro"
            ]
        },
        {
            "destination": "/etc/resolv.conf",
            "type": "bind",
            "source": "/etc/resolv.conf",
            "options": [
                "noexec",
                "nosuid",
                "nodev",
                "rbind",
                "ro"
            ]
        },
        {
            "source": "/usr/libexec/DobbyInit",
            "destination": "/usr/libexec/DobbyInit",
            "type": "bind",
            "options": [
                "rbind",
                "nosuid",
                "nodev",
                "ro"
            ]
        },
        {
            "source": "/usr/share/",
            "destination": "/usr/share/",
            "type": "bind",
            "options": [
                "rbind",
                "nosuid",
                "nodev",
                "ro",
                "X-mount.mkdir"
            ]
        }
    ],
    "annotations": {
        "org.opencontainers.image.architecture": "arm",
        "org.opencontainers.image.author": "info@lgi.com",
        "org.opencontainers.image.created": "2023-03-24T08:33:59Z",
        "org.opencontainers.image.exposedPorts": "",
        "org.opencontainers.image.os": "linux",
        "org.opencontainers.image.stopSignal": "",
        "run.oci.hooks.stderr": "/dev/stderr",
        "run.oci.hooks.stdout": "/dev/stdout"
    },
    "linux": {
        "namespaces": [
            {
                "type": "pid"
            },
            {
                "type": "ipc"
            },
            {
                "type": "uts"
            },
            {
                "type": "mount"
            }
        ],
        "maskedPaths": [
        ],
        "readonlyPaths": [
        ],
        "resources": {
            "devices": [ ]
        },
        "devices": [ ]
    },
    "rdkPlugins": {
        "networking": {
            "required": true,
            "data": {
                "type": "open"
            }
        },
        "logging": {
            "required": true,
            "data": {
                "sink": "file",
                "fileOptions": {
                    "path": "/var/log/rpi3_reference-dac-image-helloworld-test-raspberrypi-rdk-broadband-20230324083330.rootfs-oci-latest-arm-linux.oci-image.log"
                }
            }
        }
    }
}

Source Code Creation 

          We have developed jst code for Sample DAC  . For that, we need to place below jst files in respective directories in running rpi3 target.

  1. create dac.jst  under /usr/www2
dac.jst
<?%
/*
 If not stated otherwise in this file or this component's Licenses.txt file the
 following copyright and licenses apply:

 Copyright 2018 RDK Management

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
*/
?>
<?% include('includes/header.jst'); ?>
<?% include('includes/utility.jst'); ?>
<div id="sub-header">
	<?% include('includes/userbar.jst'); ?>
</div><!-- end #sub-header -->
<?% include('includes/nav.jst'); ?>

<script type="text/javascript">                                                                                                             
$(document).ready(function() {    
   $("#execute").click(function(){ 
	var scriptName = $('#script-name').val();
       $.ajax({
    url : 'dac_demo/'+scriptName,
    type : 'GET',
    dataType : 'text',
    success : function(text) {
        alertLocale(text);
    }
});
});
});
</script>

<div id="content">                                                                                                                            
        <h1 id="dachead">Demo DAC > Sample DAC</h1>                                                                                                   
        <div id="educational-tip">                                                                                                            
                <p class="tip" id="dactip">Downloadable Application Containers (DAC) is a pan-RDK initiative to develop a container solution that allows binary applications to be downloaded and run on GW without modification.</p>              
        </div>
<form method="post" id="pageForm">                                                                                                     
        <div class="module forms">                                                                                                           
                <h2>DAC</h2>       
        <div class="form-row dac" id="mylocal">                                
                <label for="script-name">Script Name:</label>                                                                               
                <input type="text" id="script-name" name="script-name"/>  
                </div>                                          
        </div> <!-- end .module -->                                                                                                           
        <div class="form-row form-btn">
                <input type="button" value="Execute" id="execute"/>                                                              
                <input id="cancel_dac" type="reset" value="Cancel" onclick="cancel_Execute('#mylocal')" class="btn alt" />
        </div>  
</form>                                                                                                                              
</div>                                                                                                                                           
<?% include('includes/footer.jst'); ?>


2. Replace nav.jst under /usr/www2/include

nav.jst
<?%
/*
 If not stated otherwise in this file or this component's Licenses.txt file the
 following copyright and licenses apply:

 Copyright 2018 RDK Management

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
*/
?>
<!-- $Id: nav.dory.jst 3155 2010-01-06 19:36:01Z slemoine $ -->
<!--Nav-->
<?% include('includes/utility.jst'); ?>
<?%
/*
 *  set initial value for all pages to true(display)
 */
$partnerId = "";
$partnerId = getStr("Device.DeviceInfo.X_RDKCENTRAL-COM_Syndication.PartnerId");
$modelName = getStr("Device.DeviceInfo.ModelName");
$local_ip_config  	= true;
$firewall         	= true;
$parental_control 	= true;
$dmz              	= true;
$port_forwarding  	= true;
$port_triggering  	= true;
$MoCA             	= true;
$battery            	= true;
$radius_servers   	= false;
$local_users      	= false;
$remote_management  	= true;		//for xb3, all user will have this page, but different content
$eMTA               	= true;		//for mso
$routing          	= true;		//for mso
$hs_port_forwarding 	= true;		//for mso
$dynamic_dns        	= true;		//for mso
$nat		        = false;	//for mso
$wifi_spectrum_analyzer = true;
$password_change	= false;	//for admin only
$wifi_spec_analyzer	= true;
$advanced_tab		= true;
$wan_network        = true;
$moca_diagnostics   = true;
$voice_Dig = false;
$device_discovery = true;
$hwselftest_enabled = false;
$hwselftest = getStr("Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.hwHealthTest.Enable");
$partnersId = getStr("Device.DeviceInfo.X_RDKCENTRAL-COM_Syndication.PartnerId");
$voice_dev = getStr('Device.DeviceInfo.SoftwareVersion');
$telco_vm = file_exists("/tmp/RDKB_TELCOVOICEMANAGER_ENABLED");
$voice_debug_global = !$telco_vm;
/*
 * The difference between  bridge mode and router mode
 * In bridge mode, local ip config page, firewall page, parental control pages,
 * routing page(mso), dmz page, wizard pages, port fowarding and port triggering pages removed
 */
if (isset($_SESSION['lanMode']) && $_SESSION["lanMode"] == "bridge-static") {
	$advanced_tab		= true;
	$remote_management      = true;
	$dynamic_dns            = false;
	$device_discovery       = false; 
	$local_ip_config  	= false;
	$firewall         	= false;
	$parental_control 	= false;
	$routing          	= false;
	$dmz              	= false;
	$port_forwarding  	= false;
	$port_triggering  	= false;
	$hs_port_forwarding = false;
	$wizard		 		= false;
	$MoCA				= true;
	$moca_diagnostics   = false;
	$wifi_spec_analyzer	= false;
}
if (isset($_SESSION['loginuser']) && $_SESSION['loginuser'] == 'admin') {
	$eMTA 			= false;
	$routing 		= false;
	$nat				= false;
	$dynamic_dns 		= false;
	$hs_port_forwarding	= false;
	$password_change	= true;
}


if (strpos($partnerId, "sky-") === false) {
	/* Grab XBB or other MTA Legacy Battery Install Status */
	$batteryInstalled = getStr("Device.X_CISCO_COM_MTA.Battery.Installed");

	/* Show Battery Icon based on XBB or other MTA Legacy Battery Install Status */
	if (strstr($batteryInstalled, "true"))  {
	  $battery = true;
	}
	else {
	  $battery = false;
	}
}
else {
	/* Turn off Battery and MoCA based on Partner devices */
    $moca_diagnostics   = false;
    $MoCA = false;
    $battery = false;
    if(strpos($voice_dev, "_DEV_") !== false){ $voice_Dig = true;}
    else{$voice_Dig = false;}
}

/*
* Allow navigation to HWSelfTest link only if user is MSO
* and Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.hwHealthTest.Enabe is set
*/
if (isset($_SESSION['loginuser']) && $_SESSION['loginuser'] == 'mso') {
	if (strstr($hwselftest, "true")) {
		$hwselftest_enabled = true;
	}
	else {
		$hwselftest_enabled = false;
	}
}

/*
 * generate menu and submenu accroding to above configuration
 */
$allowEthWan= "";
$allowEthWan= getStr("Device.DeviceInfo.X_RDKCENTRAL-COM_Syndication.RDKB_UIBranding.AllowEthernetWAN");
$autoWanEnable= getStr("Device.DeviceInfo.X_RDKCENTRAL-COM_AutowanFeatureSupport");
$RemoteMgt = getStr("Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.WebUIRemoteMgtOption.Enable");
$http_mode = getStr("Device.UserInterface.X_CISCO_COM_RemoteAccess.HttpEnable");
$https_mode = getStr("Device.UserInterface.X_CISCO_COM_RemoteAccess.HttpsEnable");
if($http_mode == "true" || $https_mode == "true") {
        $_SESSION['rm'] = false;
}

echo( '<div id="nav">');
echo( '<ul>');
echo( '<li class="nav-gateway">');
	echo( '<a role="menuitem"  title="click to toggle sub menu" class="top-level" href="at_a_glance.jst" id="gatewayloc">Gateway</a>');
	echo( '<ul>');
	echo( '<li class="nav-at-a-glance"><a role="menuitem"  href="at_a_glance.jst" id="ataglanceloc">At a Glance</a></li>');
	echo( '<li class="nav-connection"><a role="menuitem"  title="click to toggle sub menu"  href="javascript:;" id="connloc">Connection</a>');
		echo( '<ul>');
		echo( '<li class="nav-connection-status"><a role="menuitem"  href="connection_status.jst" id="statloc">Status</a></li>');
		$Connection_MSOmenu = "";
		$Connection_MSOmenu = getStr("Device.DeviceInfo.X_RDKCENTRAL-COM_Syndication.RDKB_UIBranding.Connection.MSOmenu");
		echo( '<li class="nav-gateway-network"><a role="menuitem"  href="network_setup.jst">'+$Connection_MSOmenu+'</a></li>');
		if($local_ip_config) echo( '<li class="nav-local-ip-network"><a role="menuitem"  href="local_ip_configuration.jst" id="locip">Local IP Network</a></li>');
		echo( '<li class="nav-wifi-config"><a role="menuitem"  href="wireless_network_configuration.jst" id="wifiloc">Wi-Fi</a></li>');
		if ($eMTA) {
			echo( '<li class="nav-mta"><a role="menuitem"  title="click to toggle sub menu"  href="javascript:;" id="mtaloc">MTA</a>');
				echo( '<ul style="padding-left:10px">');
				echo( '<li class="nav-line-status"><a role="menuitem"  href="mta_Line_Status.jst" id="line_status">Line Status</a></li>');
				echo( '<li class="nav-mta-line-diagnostics"><a role="menuitem"  href="mta_Line_Diagnostics.jst" id="lindiagloc">Line Diagnostics</a></li>');
				echo( '<li class="nav-service-sip"><a role="menuitem"  href="mta_sip_packet_log.jst" id="sippacloc">SIP Packet Log</a></li>');
				echo( '</ul>');
			echo( '</li>');
			echo( '<li class="nav-qos"><a role="menuitem"  href="qos.jst">CallP/QoS</a></li>');
			echo( '<li class="nav-gateway-voice"><a role="menuitem"  href="voice_quality_metrics.jst">VQM</a></li>');
		}
		if ($MoCA) {
		  echo( '<li class="nav-moca"><a role="menuitem"  href="moca.jst">MoCA</a></li>');
		}
		if((($autoWanEnable=="true") || ($allowEthWan=="true")) && (($modelName=="CGM4140COM") || ($modelName=="CGM4331COM") || ($modelName=="CGM4981COM") || ($modelName=="TG4482A"))){
			if($wan_network) echo( '<li class="nav-wan-network"><a role="menuitem"  href="wan_network.jst" id="wannet">WAN Network</a></li>');
		}
		echo( '</ul>');
	echo( '</li>');
	/*if($firewall) echo( '<li class="nav-firewall"><a role="menuitem"  href="firewall_settings.jst">Firewall</a></li>');*/
	if($firewall) echo( '<li class="nav-firewall"><a role="menuitem"  title="click to toggle sub menu"  href="javascript:;" id="firwlloc">Firewall</a>\
			<ul> \
				<li class="nav-firewall-ipv4"><a role="menuitem"  href="firewall_settings_ipv4.jst">IPv4</a></li>\
				<li class="nav-firewall-ipv6"><a role="menuitem"  href="firewall_settings_ipv6.jst">IPv6</a></li>\
			</ul>	 \
		</li>');
	echo( '<li class="nav-software"><a role="menuitem"  href="software.jst">Software</a></li>');
	echo( '<li class="nav-hardware"><a role="menuitem"  title="click to toggle sub menu"  href="javascript:;" id="hrdloc">Hardware</a>');
		echo( '<ul>');
		echo( '<li class="nav-system-hardware"><a role="menuitem"  href="hardware.jst" id="hardmess1">System Hardware</a></li>');
		if($battery) echo( '<li class="nav-battery"><a role="menuitem"  href="battery.jst" id="battloc">Battery</a></li>');
		echo( '<li class="nav-lan"><a role="menuitem"  href="lan.jst">LAN</a></li>');
		echo( '<li class="nav-wifi"><a role="menuitem"  href="wifi.jst">Wireless</a></li>');
		echo( '</ul>');
	echo( '</li>');
	echo( '</ul>');
echo( '</li>');
echo( '<li class="nav-connected-devices">');
	echo( '<a role="menuitem"  title="click to toggle sub menu"  class="top-level" href="connected_devices_computers.jst" id="conndev">Connected Devices</a>');
	echo( '<ul>');
	echo( '<li class="nav-cdevices"><a role="menuitem"  href="connected_devices_computers.jst" id="devloc">Devices</a></li>');
	echo( '</ul>');
echo( '</li>');
if($parental_control){
 echo( '<li class="nav-parental-control">');
	if($partnerId =="cox"){
		echo( '<a role="menuitem"  title="click to toggle sub menu"  class="top-level" href="managed_services.jst" id="parloc">Parental Control</a>');
	} else {
		echo( '<a role="menuitem"  title="click to toggle sub menu"  class="top-level" href="managed_sites.jst" id="parloc">Parental Control</a>');
	}
	echo( '<ul>');
	if($partnerId !="cox"){
		echo( '<li class="nav-sites"><a role="menuitem"  href="managed_sites.jst" id="mansitesloc">Managed Sites</a></li>');
	}
		echo( '<li class="nav-services"><a role="menuitem"  href="managed_services.jst" id="manserloc">Managed Services</a></li>');
		echo( '<li class="nav-devices"><a role="menuitem"  href="managed_devices.jst" id="mandevloc">Managed Devices</a></li>');
		echo( '<li class="nav-parental-reports"><a role="menuitem"  href="parental_reports.jst" id="reploc">Reports</a></li>');
	echo( '</ul>');
echo( '</li>');
}
if($advanced_tab) {
	echo( '<li class="nav-advanced">');
		if (isset($_SESSION['lanMode']) && $_SESSION["lanMode"] == "bridge-static"){
			if ($RemoteMgt == "false" && $http_mode == "false" && $https_mode == "false" && ($_SESSION['rm'] == false || typeof($_SESSION['rm']) == "undefined")) echo('');
			else echo( '<a role="menuitem"  title="click to toggle sub menu"  class="top-level" href="remote_management.jst" id="advloc">Advanced</a>');
		}
		else {
			echo( '<a role="menuitem"  title="click to toggle sub menu"  class="top-level" href="port_forwarding.jst" id="advloc">Advanced</a>');
		}
		echo( '<ul>');
		if($port_forwarding) echo( '<li class="nav-port-forwarding"><a role="menuitem"  href="port_forwarding.jst">Port Forwarding</a></li>');
		if($hs_port_forwarding) echo( '<li class="nav-HS-port-forwarding"><a role="menuitem"  href="hs_port_forwarding.jst" id="hsportmess2">HS Port Forwarding</a></li>');
		if($port_triggering) echo( '<li class="nav-port-triggering"><a role="menuitem"  href="port_triggering.jst">Port Triggering</a></li>');
		if($remote_management){
			if ($RemoteMgt == "false" && $http_mode == "false" && $https_mode == "false"){
				if ($_SESSION['rm'] == false || typeof($_SESSION['rm']) == "undefined")
					echo('');
				else
					echo( '<li class="nav-remote-management"><a role="menuitem"  href="remote_management.jst" id="remloc">Remote Management</a></li>');
			}
			else {
				echo( '<li class="nav-remote-management"><a role="menuitem"  href="remote_management.jst" id="remloc">Remote Management</a></li>');
			}
		}
		echo( '<!--li class="nav-qos1"><a role="menuitem"  href="qos1.jst">QoS</a></li-->');
		if($dmz) echo( '<li class="nav-dmz"><a role="menuitem"  href="dmz.jst">DMZ</a></li>');
		if($nat) echo( '<li class="nav-nat"><a role="menuitem"  href="nat.jst">NAT</a></li>');
		if($routing) echo( '<li class="nav-routing"><a role="menuitem"  href="routing.jst">Routing</a></li>');
		if($dynamic_dns) echo( '<li class="nav-Dynamic-dns"><a role="menuitem"  href="dynamic_dns.jst" id="dyndnshead2">Dynamic DNS</a></li>');
	 	if($device_discovery)	echo( '<li class="nav-device-discovery"><a role="menuitem"  href="device_discovery.jst" id="devdishead">Device Discovery</a></li>');
		if($radius_servers) echo( '<li class="nav-radius-servers"><a role="menuitem"  href="radius_servers.jst">Radius Servers</a></li>');
		if($local_users)  echo( '<li class="nav-local-users"><a role="menuitem"  href="local_users.jst" id="localuserloc">Local Users</a></li>');
		echo( '</ul>');
	echo( '</li>');
}
echo( '<li class="nav-troubleshooting">');
	echo( '<a role="menuitem"  title="click to toggle sub menu"  class="top-level" href="troubleshooting_logs.jst" id="troubleloc">Troubleshooting</a>');
	echo( '<ul>');
		echo( '<li class="nav-logs"><a role="menuitem"  href="troubleshooting_logs.jst" id="logsloc">Logs</a></li>');
		echo( '<li class="nav-diagnostic-tools"><a role="menuitem"  href="network_diagnostic_tools.jst" id="diagloc">Diagnostic Tools</a></li>');
		if($wifi_spec_analyzer) echo( '<li class="nav-wifi-spectrum-analyzer"><a role="menuitem"  href="wifi_spectrum_analyzer.jst" id="wifispecloc">Wi-Fi Spectrum Analyzer</a></li>');
		if($moca_diagnostics) echo( '<li class="nav-moca-diagnostics"><a role="menuitem"  href="moca_diagnostics.jst" id="mocdiagloc">MoCA Diagnostics</a></li>');
		echo( '<li class="nav-restore-reboot"><a role="menuitem"  href="restore_reboot.jst" id="resetloc">Reset/Restore Gateway</a></li>');
		if($password_change) echo( '<li class="nav-password"><a role="menuitem"  href="password_change.jst" id="chPass">Change Password</a></li>');
		if($hwselftest_enabled) echo( '<li class="nav-hwselftest"><a role="menuitem"  href="hwselftest.jst">Hardware Health Test</a></li>')
	echo( '</ul>');
		echo( '</li>');

		if($voice_Dig){
		echo( '<li class="nav-voice">');
		echo( '<a role="menuitem"  title="click to toggle sub menu" class="top-level" href="Voip_SipBasic_GlobalParamaters.jst" id="voiceloc">Voice Diagnostics</a>');
		echo( '<ul>');
			echo( '<li class="nav-voice-sip"><a role="menuitem"  title="click to toggle sub menu"  href="javascript:;" id="siploc">SIP Basic Setup</a>');
			    echo( '<ul>');
					echo( '<li class="nav-voice-sip-global"><a role="menuitem"  href="Voip_SipBasic_GlobalParamaters.jst">Global Parameters</a></li>');
					echo( '<li class="nav-voice-sip-service"><a role="menuitem"  href="Voip_SipBasic_ServiceProvider.jst">SIP Service Provider</a></li>');
				echo( '</ul>');
			echo( '</li>');
			echo( '<li class="nav-voice-advance"><a role="menuitem"  title="click to toggle sub menu"  href="javascript:;">Advance Setup</a>\
					<ul>\
						<li class="nav-voice-advance-service"><a role="menuitem"  href="Voip_SipAdvanced_ServiceProvider.jst">Adv Service Provider</a></li>\
					</ul>\
				</li>');
			echo( '<li class="nav-voice-debug"><a role="menuitem"  title="click to toggle sub menu"  href="javascript:;">Debug</a>');
			    echo( '<ul>');
					if($voice_debug_global) echo( '<li class="nav-voice-debug-global"><a role="menuitem"  href="Voip_Debug_GlobalParameter.jst">Global Parameters</a></li>');
					echo( '<li class="nav-voice-debug-service"><a role="menuitem"  href="Voip_Debug_ServiceProvider.jst">Service Provider</a></li>');
				echo( '</ul>');
			echo( '</li>');
		echo( '</ul>');
                echo( '</li>');
              }
echo( '</ul>');
echo( '<li class="nav-Demo-DAC">');
	echo( '<a role="menuitem"  title="click to toggle sub menu"  class="top-level" href="dac.jst" id="ddac">DAC Demo</a>');
echo( '</li>');
echo( '</div>');
?>

3. create dac_demo directory under /usr/www2

4. Place dac_test.sh under /usr/www2/dac_demo

dac_test.sh
root@RaspberryPi-Gateway:/usr/www2/dac_demo# cat dac_test.sh 
#!/bin/sh

cd /dac
FILE="/dac/rpi3_reference-dac-image-helloworld-test-raspberrypi-rdk-broadband-20230403072115.rootfs-oci-latest-arm-linux.oci-image/rootfs/my_file.txt"
DOBBY_PID=`DobbyTool list | grep running | wc -l`
if [ "$DOBBY_PID" == 0 ]; then
rm "$FILE"
chmod -R 777 rpi3_reference-dac-image-helloworld-test-raspberrypi-rdk-broadband-20230403072115.rootfs-oci-latest-arm-linux.oci-image
DobbyTool start helloworld-test rpi3_reference-dac-image-helloworld-test-raspberrypi-rdk-broadband-20230403072115.rootfs-oci-latest-arm-linux.oci-image/ > /tmp/dac_output.txt
DobbyTool list >> /tmp/dac_output.txt
fi
cat "$FILE"

root@RaspberryPi-Gateway:/usr/www2/dac_demo# 

Note :  Replace timestamp  with your local OCI image.

Testing Procedure

  1. Go to DAC Demo tab in local RDKB WebUI 

        2. Enter script name in Text field (here, we tested as dac_test.sh)

 

         3. click Execute button to execute the mentioned script in text field and the result should be notified in local WebUI through alert pop-up.

Troubleshoot

        Below commands are helpful for debugging purpose.

                   1. DobbyTool list shows

DobbyTool list
root@RaspberryPi-Gateway:/usr/www2/dac_demo# DobbyTool  list
 descriptor | id                               | state
------------|----------------------------------|-------------
         91 | helloworld-test                  | running
root@RaspberryPi-Gateway:/usr/www2/dac_demo# 

                  2. log file path as /var/log/

log file
root@RaspberryPi-Gateway:/usr/www2/dac_demo# cat /var/log/rpi3_reference-dac-image-helloworld-test-raspberrypi-rdk-broadband-20230324083330.rootfs-oci-latest-arm-linux.oci-image.log 
0000009302.552032 <T-29135> MIL: < M:Main.cpp F:main L:476 > Running hook createRuntime for container 'helloworld-test'
0000009302.553289 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'devicemapper' from '/usr/lib/plugins/dobby/libDeviceMapperPlugin.so.1'
0000009302.553957 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'ipc' from '/usr/lib/plugins/dobby/libIpcPlugin.so.1'
0000009302.555296 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'logging' from '/usr/lib/plugins/dobby/libLoggingPlugin.so.1'
0000009302.556063 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'minidump' from '/usr/lib/plugins/dobby/libMinidumpPlugin.so.1'
0000009302.568569 <T-29135> WRN: < M:NetworkingHelper.cpp F:NetworkingHelper L:38 > both IPv4 and IPv6 mode are disabled in config, defaulting to IPv4 only
0000009302.568782 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'networking' from '/usr/lib/plugins/dobby/libNetworkingPlugin.so.1'
0000009302.569721 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'oomcrash' from '/usr/lib/plugins/dobby/libOOMCrashPlugin.so.1'
0000009302.570686 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'storage' from '/usr/lib/plugins/dobby/libStoragePlugin.so.1'
root@RaspberryPi-Gateway:/var/log# cat rpi3_reference-dac-image-helloworld-test-raspberrypi-rdk-broadband-20230324083330.rootfs-oci-latest-arm-linux.oci-image.log 
0000009302.552032 <T-29135> MIL: < M:Main.cpp F:main L:476 > Running hook createRuntime for container 'helloworld-test'
0000009302.553289 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'devicemapper' from '/usr/lib/plugins/dobby/libDeviceMapperPlugin.so.1'
0000009302.553957 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'ipc' from '/usr/lib/plugins/dobby/libIpcPlugin.so.1'
0000009302.555296 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'logging' from '/usr/lib/plugins/dobby/libLoggingPlugin.so.1'
0000009302.556063 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'minidump' from '/usr/lib/plugins/dobby/libMinidumpPlugin.so.1'
0000009302.568569 <T-29135> WRN: < M:NetworkingHelper.cpp F:NetworkingHelper L:38 > both IPv4 and IPv6 mode are disabled in config, defaulting to IPv4 only
0000009302.568782 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'networking' from '/usr/lib/plugins/dobby/libNetworkingPlugin.so.1'
0000009302.569721 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'oomcrash' from '/usr/lib/plugins/dobby/libOOMCrashPlugin.so.1'
0000009302.570686 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'storage' from '/usr/lib/plugins/dobby/libStoragePlugin.so.1'
0000009302.570960 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:runPlugins L:906 > Plugin logging has nothing to do at createRuntime
0000009302.571179 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:runPlugins L:912 > Running networking plugin
0000009302.576707 <T-29135> NFO: < M:DobbyRdkPluginManager.cpp F:runPlugins L:938 > Plugin networking has createRuntime hook run successfully
0000009302.578066 <T-29135> NFO: < M:Main.cpp F:main L:504 > Hook createRuntime completed
0000009302.600499 <T-2> MIL: < M:Main.cpp F:main L:476 > Running hook createContainer for container 'helloworld-test'
0000009302.601947 <T-2> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'devicemapper' from '/usr/lib/plugins/dobby/libDeviceMapperPlugin.so.1'
0000009302.602604 <T-2> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'ipc' from '/usr/lib/plugins/dobby/libIpcPlugin.so.1'
0000009302.603542 <T-2> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'logging' from '/usr/lib/plugins/dobby/libLoggingPlugin.so.1'
0000009302.604163 <T-2> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'minidump' from '/usr/lib/plugins/dobby/libMinidumpPlugin.so.1'
0000009302.617209 <T-2> WRN: < M:NetworkingHelper.cpp F:NetworkingHelper L:38 > both IPv4 and IPv6 mode are disabled in config, defaulting to IPv4 only
0000009302.617427 <T-2> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'networking' from '/usr/lib/plugins/dobby/libNetworkingPlugin.so.1'
0000009302.618164 <T-2> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'oomcrash' from '/usr/lib/plugins/dobby/libOOMCrashPlugin.so.1'
0000009302.618891 <T-2> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'storage' from '/usr/lib/plugins/dobby/libStoragePlugin.so.1'
0000009302.619136 <T-2> NFO: < M:DobbyRdkPluginManager.cpp F:runPlugins L:906 > Plugin logging has nothing to do at createContainer
0000009302.619246 <T-2> NFO: < M:DobbyRdkPluginManager.cpp F:runPlugins L:906 > Plugin networking has nothing to do at createContainer
0000009302.620302 <T-2> NFO: < M:Main.cpp F:main L:504 > Hook createContainer completed
---------------------------------------------
0000009302.668287 <T-29142> MIL: < M:Main.cpp F:main L:476 > Running hook poststart for container 'helloworld-test'
0000009302.669630 <T-29142> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'devicemapper' from '/usr/lib/plugins/dobby/libDeviceMapperPlugin.so.1'
0000009302.670562 <T-29142> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'ipc' from '/usr/lib/plugins/dobby/libIpcPlugin.so.1'
0000009302.671567 <T-29142> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'logging' from '/usr/lib/plugins/dobby/libLoggingPlugin.so.1'
0000009302.672224 <T-29142> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'minidump' from '/usr/lib/plugins/dobby/libMinidumpPlugin.so.1'
0000009302.684664 <T-29142> WRN: < M:NetworkingHelper.cpp F:NetworkingHelper L:38 > both IPv4 and IPv6 mode are disabled in config, defaulting to IPv4 only
0000009302.684901 <T-29142> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'networking' from '/usr/lib/plugins/dobby/libNetworkingPlugin.so.1'
0000009302.685610 <T-29142> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'oomcrash' from '/usr/lib/plugins/dobby/libOOMCrashPlugin.so.1'
0000009302.686332 <T-29142> NFO: < M:DobbyRdkPluginManager.cpp F:loadPlugins L:333 > Loaded plugin 'storage' from '/usr/lib/plugins/dobby/libStoragePlugin.so.1'
0000009302.686581 <T-29142> NFO: < M:DobbyRdkPluginManager.cpp F:runPlugins L:906 > Plugin logging has nothing to do at postStart
0000009302.686690 <T-29142> NFO: < M:DobbyRdkPluginManager.cpp F:runPlugins L:906 > Plugin networking has nothing to do at postStart
0000009302.687675 <T-29142> NFO: < M:Main.cpp F:main L:504 > Hook poststart completed
---------------------------------------------
root@RaspberryPi-Gateway:/var/log# 

                    3.  crun.log file will capture all error logs if container is not started properly.  It will located under /opt/logs           

Demo Video

Dac_test.webm


         

  • No labels