summaryrefslogtreecommitdiffstats
path: root/stap-find-servers
diff options
context:
space:
mode:
authorDave Brolley <brolley@redhat.com>2008-07-29 13:40:08 -0400
committerDave Brolley <brolley@redhat.com>2008-07-29 13:40:08 -0400
commit0e47827d5f461ceb0e67540adba7bc2fe3a360da (patch)
tree804fe937a06c7ee71ec6d438d8d8bf6d1a70f32d /stap-find-servers
parentb1af668d224b0673f27f991a77455d6e0ecb6891 (diff)
downloadsystemtap-steved-0e47827d5f461ceb0e67540adba7bc2fe3a360da.tar.gz
systemtap-steved-0e47827d5f461ceb0e67540adba7bc2fe3a360da.tar.xz
systemtap-steved-0e47827d5f461ceb0e67540adba7bc2fe3a360da.zip
Ensure that a systemtap server is available if 'server' is specified
in EXTRA_TOOL_OPTS for 'make check' and 'make installcheck'
Diffstat (limited to 'stap-find-servers')
-rwxr-xr-xstap-find-servers128
1 files changed, 128 insertions, 0 deletions
diff --git a/stap-find-servers b/stap-find-servers
new file mode 100755
index 00000000..9e7b633d
--- /dev/null
+++ b/stap-find-servers
@@ -0,0 +1,128 @@
+#!/bin/bash
+
+# Find compile servers for systemtap
+#
+# Copyright (C) 2008 Red Hat Inc.
+#
+# This file is part of systemtap, and is free software. You can
+# redistribute it and/or modify it under the terms of the GNU General
+# Public License (GPL); either version 2, or (at your option) any
+# later version.
+
+# This script uses avahi to find systemtap compile servers on the local
+# network. Information about each server found is printed to stdout.
+
+#-----------------------------------------------------------------------------
+# Helper functions.
+#-----------------------------------------------------------------------------
+# function: configuration
+function configuration {
+ avahi_service_tag=_stap._tcp
+}
+
+# function: initialization
+function initialization {
+ rc=1 # not found yet
+ if test "X$1" = "X--all"; then
+ find_all=1
+ else
+ find_all=0
+ fi
+}
+
+# function: find_and_connect_to_server
+#
+# Find and establish connection with a compatibale stap server.
+function find_servers {
+ # Find a server
+ avahi-browse $avahi_service_tag --terminate -r 2>/dev/null | match_server
+ rc=$?
+}
+
+# function: match_server
+#
+# Find a suitable server using the avahi-browse output provided on stdin.
+function match_server {
+ local server_ip
+ local server_name
+ local server_sysinfo
+ local server_port
+ local rc=1 # not found yet
+
+ # Loop over the avahi service descriptors.
+ while read
+ do
+ # Examine the next service descriptor
+ # Is it a stap server?
+ (echo $REPLY | grep -q "^=.*_stap") || continue
+
+ # Get the details of the service
+ local service_tag equal data
+ while read service_tag equal service_data
+ do
+ case $service_tag in
+ '=' )
+ break ;;
+ hostname )
+ server_name=`expr "$service_data" : '\[\([^]]*\)\]'`
+ ;;
+ address )
+ # Sometimes (seems random), avahi-resolve-host-name resolves a local server to its
+ # hardware address rather its ip address. Keep trying until we get
+ # an ip address.
+ server_ip=`expr "$service_data" : '\[\([^]]*\)\]'`
+ local attempt
+ for ((attempt=0; $attempt < 5; ++attempt))
+ do
+ server_ip=`expr "$server_ip" : '^\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)$'`
+ if test "X$server_ip" != "X"; then
+ break
+ fi
+ # Resolve the server.domain to an ip address.
+ server_ip=`avahi-resolve-host-name $hostname`
+ server_ip=`expr "$server_ip" : '.* \(.*\)$'`
+ done
+ ;;
+ port )
+ server_port=`expr "$service_data" : '\[\([^]]*\)\]'`
+ ;;
+ txt )
+ server_sysinfo=`expr "$service_data" : '\[\"\([^]]*\)\"\]'`
+ ;;
+ * )
+ break ;;
+ esac
+ done
+
+ # It is a stap server, but is it compatible?
+ if test $find_all = 0 -a "$server_sysinfo" != "`client_sysinfo`"; then
+ continue
+ fi
+
+ # It's compatible, or we're finding all servers. Print a summary line
+ echo $server_name $server_ip $server_port "'$server_sysinfo'"
+ rc=0
+ done
+
+ exit $rc
+}
+
+# function client_sysinfo
+#
+# Generate the client's sysinfo and echo it to stdout
+function client_sysinfo {
+ if test "X$sysinfo_client" = "X"; then
+ # Add some info from uname
+ sysinfo_client="`uname -rvm`"
+ fi
+ echo $sysinfo_client
+}
+
+#-----------------------------------------------------------------------------
+# Beginning of main line execution.
+#-----------------------------------------------------------------------------
+configuration
+initialization "$@"
+find_servers
+
+exit $rc