<div dir="ltr">Hi Guillaume, <div><br></div><div>Thank you very much for the example. I will have a look on that. Actually I already developed a C++ plugin but now I am trying to figure out how to simulate the robot side (create and publish information on a diagnostic topic) for test integration with Nagios.</div>
<div><br></div><div>Let me know if my source code could be useful and I can send here too.</div><div><br></div><div>Regards,</div><div>Roman<br><table cellpadding="0" class="" style="font-family:arial,sans-serif;font-size:13px">
<tbody><tr class=""><td class="" style="width:1187px"><table cellpadding="0" class="" style="width:1187px"><tbody></tbody></table></td></tr></tbody></table></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Wed, Jun 25, 2014 at 10:06 AM, Guillaume Schreiner <span dir="ltr"><<a href="mailto:schreiner@unistra.fr" target="_blank">schreiner@unistra.fr</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word">Hello,<div><br></div><div>here’s an example of Nagios plugin written in Python interacting with ROS framework.</div><div> </div><div><div>#!/usr/bin/env python</div><div><br></div><div>import sys</div>
<div>sys.path.append("/home/schreiner/catkin_ws_hydro/install/lib/python2.7/dist-packages")</div><div>sys.path.append("/opt/ros/hydro/lib/python2.7/dist-packages")</div><div><br></div><div>import os</div>
<div>os.environ['PATH'] = "/opt/ros/hydro/bin:" + os.environ['PATH']</div><div>os.environ['ROS_PACKAGE_PATH']= '/home/schreiner/catkin_ws_hydro/install/share:/home/schreiner/catkin_ws_hydro/install/stacks:/opt/ros/hydro/share:/opt/ros/hydro/stacks'</div>
<div><br></div><div>from optparse import OptionParser</div><div><br></div><div>import rospy</div><div>import rosnode</div><div>import os</div><div>import roslib</div><div>import sys</div><div>roslib.load_manifest('linux_hardware')</div>
<div>from linux_hardware.msg import LaptopChargeStatus</div><div>from diagnostic_msgs.msg import DiagnosticStatus, DiagnosticArray, KeyValue</div><div><br></div><div># Exit statuses recognized by Nagios</div><div>UNKNOWN = -1</div>
<div>OK = 0</div><div>WARNING = 1</div><div>CRITICAL = 2</div><div><br></div><div># TEMPLATE FOR READING PARAMETERS FROM COMMANDLINE</div><div>parser = OptionParser()</div><div>parser.add_option("-H", "--host", dest="host", default='localhost', help="A message to print after OK - ")</div>
<div>parser.add_option("-w", "--warning", dest="warning", default='40', help="A message to print after OK - ")</div><div>parser.add_option("-c", "--critical", dest="critical", default='20', help="A message to print after OK - ")</div>
<div>(options, args) = parser.parse_args()</div><div><br></div><div># Set turtlebot ROS Master URI</div><div>os.environ['ROS_MASTER_URI'] = '<a href="http://'" target="_blank">http://'</a> + options.host  + ':11311'</div>
<div><br></div><div>kobuki_charge = None</div><div>kobuki_percentage = None</div><div><br></div><div>def callback_kobuki(data):</div><div>    global kobuki_charge</div><div>    global kobuki_percentage</div><div><br></div>
<div>    ready = False</div><div><br></div><div>    while not ready:</div><div>        for current in data.status:</div><div>            if <a href="http://current.name" target="_blank">current.name</a> == "mobile_base_nodelet_manager: Battery":</div>
<div>  <span style="white-space:pre-wrap">       </span>         for value in current.values:</div><div><span style="white-space:pre-wrap">        </span>             if value.key == "Charge (Ah)":</div><div><span style="white-space:pre-wrap">              </span>          kobuki_charge = value.value</div>
<div><span style="white-space:pre-wrap">  </span>             if value.key == "Percent":</div><div><span style="white-space:pre-wrap">          </span>          kobuki_percentage = value.value</div><div>                          ready = True</div>
<div><br></div><div>    time = rospy.get_time()</div><div>    kobuki_percentage = int(float(kobuki_percentage))</div><div>    rospy.signal_shutdown(0)</div><div><br></div><div>def listener():</div><div>    rospy.init_node('check_battery_kobuki', anonymous=True,  disable_signals=True)</div>
<div>    rospy.Subscriber("diagnostics", DiagnosticArray , callback_kobuki)</div><div>    rospy.spin()</div><div><br></div><div>def myhook():</div><div>    if kobuki_percentage < int(options.critical):</div><div>
        print "CRITICAL - Kobuki Charge Percent %s | kobuki_battery=%s" % (kobuki_percentage,kobuki_percentage)</div><div>        exiting(CRITICAL)</div><div>    elif kobuki_percentage < int(options.warning):</div>
<div>        print "WARNING - Kobuki Charge Percent %s | kobuki_battery=%s" % (kobuki_percentage,kobuki_percentage)</div><div>        exiting(WARNING)</div><div>    else:</div><div>        print "OK - Kobuki Charge Percent %s | kobuki_battery=%s" % (kobuki_percentage,kobuki_percentage)</div>
<div>        exiting(OK)</div><div><br></div><div>def exiting(value):</div><div>    try:</div><div><span style="white-space:pre-wrap">        </span>sys.stdout.flush()</div><div><span style="white-space:pre-wrap">       </span>os._exit(value)</div>
<div>    except:</div><div>        pass</div><div><br></div><div>if __name__ == '__main__':</div><div>    try:</div><div>        master = rospy.get_master()</div><div>        master.getPid()</div><div>    except Exception:</div>
<div>        print "UNKNOWN - Roscore not available"</div><div><span style="white-space:pre-wrap">      </span>exiting(UNKNOWN)</div><div><br></div><div>    try:</div><div>        if len(sys.argv) < 5:</div><div>            print "usage %s -c <critical> -w <warning>" % (sys.argv[0])</div>
<div><span style="white-space:pre-wrap">  </span>    exiting(UNKNOWN)</div><div>        rospy.on_shutdown(myhook)</div><div>        listener()</div><div>    except rospy.ROSInterruptException:</div><div>        exit</div></div>
<span class="HOEnZb"><font color="#888888"><div><br></div></font></span><div><span class="HOEnZb"><font color="#888888"><div>-- <br>Guillaume Schreiner<br>Research Engineer<br>Network Research Group<span style="white-space:pre-wrap">  </span><br>
ICube - UMR CNRS 7357<br>Strasbourg University <br></div><div><br></div>
<br></font></span><div><span class="HOEnZb"><font color="#888888"><div>Le 25 juin 2014 à 13:47, Dominik Kirchner <<a href="mailto:kirchner@vs.uni-kassel.de" target="_blank">kirchner@vs.uni-kassel.de</a>> a écrit :</div>
</font></span><div><div class="h5"><br><blockquote type="cite">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    Hi,<br>
    <br>
    the Nagios plugin needs to pubish its monitoring data on the
    /diagnostic topic. Msg type needs to be a DiagnosticArray with
    DiagnosticStatus items for each entity you have monitored. <br>
    <br>
    You will find good tutorials on how use the ROS diagnostic stack on
    <a href="http://wiki.ros.org/diagnostics/Tutorials" target="_blank">http://wiki.ros.org/diagnostics/Tutorials</a>.<br>
    <br>
    Best Regards,<br>
        Dominik Kirchner<br>
    <br>
    <br>
    <div>On <a href="tel:24.06.2014%2022" value="+12406201422" target="_blank">24.06.2014 22</a>:40, Felipe Roman
      wrote:<br>
    </div>
    <blockquote type="cite">
      <div dir="ltr">Hi Everyone,
        <div><br>
        </div>
        <div>Has anyone have used ROS diagnostics before ? I am working
          on a research work to integrate ROS with one IT monitoring
          tool (Nagios). Basically this IT monitoring tool will be able
          to get information about the Robot Sensor Status.</div>
        <div><br>
        </div>
        <div>I already have implemented the communication between them
          (Nagios plugin reading ROS service information) and now I
          would like to know how to create and configure a ROS
          diagnostic topic to test it.</div>
        <div><br>
        </div>
        <div>Any ideas will be welcome, thanks in advance<br clear="all">
          <div><br>
          </div>
          -- <br>
          Best Regards,<br>
          Felipe Roman<br>
          Phone 55 51 8454 8110<br>
          LinkedIn <a href="http://au.linkedin.com/in/feliperoman" target="_blank">http://au.linkedin.com/in/feliperoman</a>
        </div>
      </div>
      <br>
      <fieldset></fieldset>
      <br>
      <pre>_______________________________________________
ros-users mailing list
<a href="mailto:ros-users@lists.ros.org" target="_blank">ros-users@lists.ros.org</a>
<a href="http://lists.ros.org/mailman/listinfo/ros-users" target="_blank">http://lists.ros.org/mailman/listinfo/ros-users</a>
</pre>
    </blockquote>
    <br>
    <pre cols="72">-- 
--
--  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  -- -- --
--  Dominik Kirchner - <a href="mailto:kirchner@vs.uni-kassel.de" target="_blank">kirchner@vs.uni-kassel.de</a>  -  T. <a href="tel:%2B49%20561%20804-6279" value="+495618046279" target="_blank">+49 561 804-6279</a>
--  Univ. Kassel - FB 16,   Wilhelmshöher Allee 73,   D-34121 Kassel
--  <a href="http://www.uni-kassel.de/eecs/fachgebiete/vs/team/person/677-Dominik-Kirchner.html" target="_blank">http://www.uni-kassel.de/eecs/fachgebiete/vs/team/person/677-Dominik-Kirchner.html</a>
------------------------------------------------------------------------
</pre>
  </div>

_______________________________________________<br>ros-users mailing list<br><a href="mailto:ros-users@lists.ros.org" target="_blank">ros-users@lists.ros.org</a><br><a href="http://lists.ros.org/mailman/listinfo/ros-users" target="_blank">http://lists.ros.org/mailman/listinfo/ros-users</a><br>
</blockquote></div></div></div><br></div></div><br>_______________________________________________<br>
ros-users mailing list<br>
<a href="mailto:ros-users@lists.ros.org">ros-users@lists.ros.org</a><br>
<a href="http://lists.ros.org/mailman/listinfo/ros-users" target="_blank">http://lists.ros.org/mailman/listinfo/ros-users</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br>Best Regards,<br>Felipe Roman<br>Phone 55 51 8454 8110<br>LinkedIn <a href="http://au.linkedin.com/in/feliperoman" target="_blank">http://au.linkedin.com/in/feliperoman</a>
</div>