Exemple #1
0
    def get_process_for_ros_node(self, node_name):
        target_node = None
        caller_id = '/experiment_manager'
        master = rosgraph.Master(caller_id)
        running_nodes = rosnode.get_node_names()
        for node in running_nodes:
            if node_name in node:
                if target_node is None:
                    target_node = node
                else:
                    rospy.logwarn("Multiple nodes found whose name "
                                  "contains " + node_name)
                    return None
        if target_node is None:
            rospy.logwarn("Could not find a node whose name contains " +
                          node_name)
            return None
        target_node_api = rosnode.get_api_uri(master, target_node)
        if not target_node_api:
            rospy.logwarn("Could not connect to " + target_node + "'s API")
            return None

        target_node = ServerProxy(target_node_api)
        target_node_pid = rosnode._succeed(
            target_node.getPid(caller_id))  # NOLINT
        rospy.loginfo('Registered %s node PID %i for resource '
                      'usage tracking' % (node_name, target_node_pid))
        return psutil.Process(target_node_pid)
Exemple #2
0
    def getnodepkg1(self, node_name):
        socket.setdefaulttimeout(1.0)
        master = roslib.scriptutil.get_master()
        node_api = rosnode.get_api_uri(master, node_name)
        host = node_api.split(':')[1].lstrip('/')
        node = xmlrpclib.ServerProxy(node_api)
        try:
            pid = rosnode._succeed(node.getPid(rosnode.ID))
        except socket.error:
            print("Communication with [%s=%s] failed!"%(node_name,node_api))
            return ['']

        cmd = ['ps','ww','--pid',str(pid)]
        if os.environ['ROS_IP'] != host and os.environ['ROS_HOSTNAME'] != host:
            ssh_target = self.user + '@' + host if self.user else hostname
            cmd = ['ssh', ssh_target] + cmd
            self.add_pkginfo_remote(host)

        ps = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
        res = ps[ps.find('/'):]
        node_args = res.split(' ')
        parsed = node_args[0].split('/')
        pkgnames = [pkg[0] for pkg in self.pkginfo[host]]
        result = [dirname for dirname in parsed if (dirname in pkgnames)]
        if len(result) == 0:
            result = ['']
        return result
def main():
    rospy.init_node('start_user_mon', anonymous=True)
    try:
        from xmlrpc.client import ServerProxy
    except ImportError:
        from xmlrpclib import ServerProxy

    ID = '/rosnode'
    master = rosgraph.Master(ID, master_uri=None)
    global process, loc
    process = {}
    loc = rospy.get_param("/script_location")

    while not rospy.is_shutdown():
        nodes = rosnode.get_node_names()

        for node in nodes:
            name = " " + node
            name = name[2:]
            node_api = rosnode.get_api_uri(master, node)
            if not node_api:
                continue

            node = ServerProxy(node_api)
            pid = rosnode._succeed(node.getPid(ID))

            if process.has_key(pid):
                continue
            process[pid] = name
            print("nohup " + loc + "/usage-mon " + str(pid) + " " + name +
                  " &")
            os.system("nohup " + loc + "/usage-mon " + str(pid) + " " + name +
                      " &")
Exemple #4
0
    def getnodepkg1(self, node_name):
        socket.setdefaulttimeout(1.0)
        master = roslib.scriptutil.get_master()
        node_api = rosnode.get_api_uri(master, node_name)
        host = node_api.split(':')[1].lstrip('/')
        node = xmlrpclib.ServerProxy(node_api)
        try:
            pid = rosnode._succeed(node.getPid(rosnode.ID))
        except socket.error:
            print("Communication with [%s=%s] failed!" % (node_name, node_api))
            return ['']

        cmd = ['ps', 'ww', '--pid', str(pid)]
        if os.environ['ROS_IP'] != host and os.environ['ROS_HOSTNAME'] != host:
            ssh_target = self.user + '@' + host if self.user else hostname
            cmd = ['ssh', ssh_target] + cmd
            self.add_pkginfo_remote(host)

        ps = subprocess.Popen(cmd,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE).communicate()[0]
        res = ps[ps.find('/'):]
        node_args = res.split(' ')
        parsed = node_args[0].split('/')
        pkgnames = [pkg[0] for pkg in self.pkginfo[host]]
        result = [dirname for dirname in parsed if (dirname in pkgnames)]
        if len(result) == 0:
            result = ['']
        return result
Exemple #5
0
def get_topicname_by_node(nodename):
    master = xmlrpclib.ServerProxy(os.environ['ROS_MASTER_URI'])
    try:
        state = rosnode._succeed(master.getSystemState(rospy.get_name()))
    except socket.error:
        raise ROSNodeIOException("Unable to communicate with master!")
    pubs = [t for t, l in state[0] if nodename in l]
    subs = [t for t, l in state[1] if nodename in l]
    return pubs, subs # in,out
Exemple #6
0
 def discover_ros_nodes(self):
     self.nodes = {}
     node_names = rosnode.get_node_names()
     logging.info("Known nodes: " + ', '.join(node_names))
     for node_name in node_names:
         logging.info("   " + node_name)
         node_api = rosnode.get_api_uri(self.master, node_name)
         if not node_api:
             sys.stderr.write("    API URI: error (unknown node: %s)" %
                              str(node_name))
             continue
         logging.info("    API URI: " + node_api)
         node = ServerProxy(node_api)
         pid = rosnode._succeed(node.getPid(ID))
         logging.info("    PID    : " + str(pid))
         self.nodes[node_name] = {}
         self.nodes[node_name]['uri'] = node_api
         self.nodes[node_name]['pid'] = pid
Exemple #7
0
    def check(self):
        while not rospy.is_shutdown():
            ID = '/rosnode'
            master = rosgraph.Master(ID, master_uri="http://tbw:11311/")

            node_api = rosnode.get_api_uri(master, '/gazebo')
            msg = Bool()

            try:
                node = ServerProxy(node_api)
                pid = rosnode._succeed(node.getPid(ID))
                if not self._pid_running(pid):
                    msg.data = False
                    self._pid_pub.publish(msg)
                else:
                    msg.data = True
                    self._pid_pub.publish(msg)
            except TypeError:
                os.system("killall gzserver")
                msg.data = False
                self._pid_pub.publish(msg)
                exit()
Exemple #8
0
# lots of things 'borrowed' from rosnode

try:
    from xmlrpc.client import ServerProxy
except ImportError:
    from xmlrpclib import ServerProxy

parser = argparse.ArgumentParser()
parser.add_argument('ROS_MASTER_URI', type=str, nargs='?', metavar='URI', help='ROS master URI to use.')
args = parser.parse_args()

ID = '/rosnode'
master = rosgraph.Master(ID, master_uri=args.ROS_MASTER_URI)
print ("Using master at {}".format(master.getUri()))

nodes = rosnode.get_node_names()
print ("Known nodes: " + ', '.join(nodes))

for node in nodes:
    print ("  " + node)

    node_api = rosnode.get_api_uri(master, node)
    if not node_api:
        print("    API URI: error (unknown node: {}?)".format(node))
        continue
    print ("    API URI: " + node_api)

    node = ServerProxy(node_api)
    pid = rosnode._succeed(node.getPid(ID))
    print ("    PID    : {}".format(pid))