# How do I define a NETCONF RPC operation that executes a shell script?

**URL:** <https://dmap-community.ductus.global/t/how-do-i-define-a-netconf-rpc-operation-that-executes-a-shell-script/102>\
**Category:** YANG\
**Created:** [May 25, 2015, 1:30pm UTC](https://dmap-community.ductus.global/t/how-do-i-define-a-netconf-rpc-operation-that-executes-a-shell-script/102 "2015-05-25T13:30:25Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![cohult](https://yyz2.discourse-cdn.com/flex010/user_avatar/dmap-community.ductus.global/cohult/32/221_2.png) [@cohult](https://dmap-community.ductus.global/u/cohult)\
**Post date:** [May 25, 2015, 1:30pm UTC](https://dmap-community.ductus.global/t/how-do-i-define-a-netconf-rpc-operation-that-executes-a-shell-script/102/1 "2015-05-25T13:30:25Z")

</div>

Similar to the $(CONFD\_DIR)/examples.confd/intro/7-action example that show you how to define an action in your YANG model that executes a pearl script, you can define a NETCONF RPC operation in your YANG model that use the tailf:exec YANG extension to execute a shell script.

YANG model example that implements an RPC which executes a simple ping shell script:

```
module config {
  namespace "http://tail-f.com/ns/example/ping";
  prefix config;

  import tailf-common {
    prefix tailf;
  }
  rpc ping {
    tailf:exec "./ping.sh" {
      tailf:args "-c $(context)";
      tailf:wd ".";
    }
    input {
      leaf count {
	type uint32;
	default "3";
      }
      leaf host {
	type string;
	default "localhost";
      }
    } 
    output {
      leaf ping-result {
	type string;
      }
    }
  }
}

```

Now you place a shell script called ping.sh in the same working directory:

```
#!/bin/sh

context=$2
i=0
for a in "$@" ; do
  	if [$i = 5]; then
		host=$a
  	fi
    if [$i = 3]; then
    	count=$a
    fi
    i=`expr $i + 1`
done

if ping -q -c $count $host >/dev/null
then
    result_ping="was successful"
else
    result_ping="failed"
fi
mesg="Ping to host ${host} count ${count} ${result_ping}."

echo "ping-result 'Invoked from $2. $mesg'"

```

We use the netconf-console tool that ships with ConfD to test the RPC:

```
$ netconf-console cmd-invoke-ping.xml

```

The cmd-invoke-ping.xml content where we implement our RPC:

```
<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <capabilities>
    <capability>urn:ietf:params:netconf:base:1.0</capability>
  </capabilities>
</hello>
]]>]]>
<?xml version="1.0" encoding="UTF-8"?>
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
  <ping xmlns="http://tail-f.com/ns/example/ping">
    <count>5</count>
  </ping>
</rpc>
]]>]]>
<?xml version="1.0" encoding="UTF-8"?>
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2">
  <close-session/>
</rpc>
]]>]]>

```

The resulting NETCONF RPC that we sent will look like this:

```
<rpc message-id="1" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <ping xmlns="http://tail-f.com/ns/example/ping">
    <count>5</count>
  </ping>
</rpc>

```

And the reply:

```
<rpc-reply message-id="1" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <ping-result xmlns="http://tail-f.com/ns/example/ping">Invoked from netconf. Ping to host localhost count 5 was successful.</ping-result>
</rpc-reply>
```
