#!/bin/bash # Compile server manager for systemtap # # Copyright (C) 2008, 2009 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 publishes its presence on the network and then listens for # incoming connections. When a connection is detected, the stap-server script # is run to handle the request. # Catch ctrl-c and other termination signals trap 'terminate' SIGTERM SIGINT #----------------------------------------------------------------------------- # Helper functions. #----------------------------------------------------------------------------- # function: initialization PORT function initialization { # Default settings. avahi_type=_stap._tcp # What port will we listen on? port=$1 test "X$port" = "X" && port=65000 while netstat -atn | awk '{print $4}' | cut -f2 -d: | egrep -q "^$port\$"; do # Whoops, the port is busy; try another one. echo "$0: Port $port is busy" port=$((1024+($port + $RANDOM)%64000)) done # Where is the ssl certificate/key database? ssl_db=$2 if test "X$ssl_db" = "X"; then # If no certificate/key database has been specified, then find/create # a local one. if test $EUID = 0; then ssl_db=`dirname $0`/../etc/systemtap/ssl/server else ssl_db=$HOME/.systemtap/ssl/server fi if ! test -f $ssl_db/stap-server.cert; then stap-gen-server-cert `dirname $ssl_db` || exit 1 fi fi nss_pw=$ssl_db/pw nss_cert=stap-server } # function: advertise_presence # # Advertise the availability of the server on the network. function advertise_presence { # Build up a string representing our server's properties. # TODO: this needs fleshing out. local sysinfo=`uname -rvm` local txt="sysinfo=$sysinfo" # Call avahi-publish-service to advertise our presence. avahi-publish-service "Systemtap Compile Server on `uname -n`" \ $avahi_type $port "$txt" > /dev/null 2>&1 & echo "Systemtap Compile Server on `uname -n` listening on port $port" } # function: listen # # Listen for and handle requests to the server. function listen { # The stap-server-connect program will listen forever # accepting requests. stap-server-connect -p $port -n $nss_cert -d $ssl_db -w $nss_pw 2>&1 & wait '%stap-server-connect' >/dev/null 2>&1 } # function: fatal [ MESSAGE ] # # Fatal error # Prints its arguments to stderr and exits function fatal { echo "$@" >&2 terminate exit 1 } # function: terminate # # Terminate gracefully. function terminate { echo "$0: Exiting" # Kill the running 'avahi-publish-service' job kill -s SIGTERM %avahi-publish-service 2> /dev/null wait '%avahi-publish-service' >/dev/null 2>&1 # Kill any running 'stap-server-connect' job. kill -s SIGTERM "%stap-server-connect" 2> /dev/null wait "%stap-server-connect" >/dev/null 2>&1 exit } #----------------------------------------------------------------------------- # Beginning of main line execution. #----------------------------------------------------------------------------- initialization "$@" advertise_presence listen