systemtap perf dep.
This commit is contained in:
+138866
-138694
File diff suppressed because it is too large
Load Diff
@@ -1 +1 @@
|
||||
dc5632deff225beeaf6c964845071a0bef49d1f4
|
||||
9b73d0676312cfc437701a07be601e1de84d5439
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
9e2556e56d6270bf5bd53f0bebf918c0d63f6ad7
|
||||
4fc8a550c7626ff4b3aa6cb4a0bb501a23a62e04
|
||||
@@ -0,0 +1,54 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Licensed under the GNU General Public License, version 3.
|
||||
# See the file http://www.gnu.org/licenses/gpl.txt
|
||||
|
||||
from pisi.actionsapi import shelltools
|
||||
from pisi.actionsapi import pisitools
|
||||
from pisi.actionsapi import autotools
|
||||
from pisi.actionsapi import get
|
||||
|
||||
def setup():
|
||||
pisitools.dosed("configure.ac", "-Werror")
|
||||
pisitools.dosed("Makefile.am", "-Werror")
|
||||
autotools.autoreconf("-vfi")
|
||||
|
||||
autotools.configure("--enable-sqlite \
|
||||
--enable-pie \
|
||||
--disable-docs \
|
||||
--disable-publican \
|
||||
--disable-crash \
|
||||
--disable-silent-rules \
|
||||
--docdir=/%s/%s \
|
||||
--without-rpm" % (get.docDIR(), get.srcNAME()))
|
||||
|
||||
def build():
|
||||
autotools.make()
|
||||
|
||||
def install():
|
||||
autotools.rawInstall("DESTDIR=%s" % get.installDIR())
|
||||
|
||||
pisitools.dodir("/var/cache/systemtap")
|
||||
pisitools.dodir("/run/systemtap")
|
||||
pisitools.dodir("/var/log/stap-server")
|
||||
pisitools.dodir("/etc/logrotate.d")
|
||||
pisitools.dodir("/etc/stap-server/conf.d")
|
||||
pisitools.dodir("/etc/systemtap/conf.d")
|
||||
pisitools.dodir("/etc/systemtap/script.d")
|
||||
|
||||
pisitools.dobin("stap-prep")
|
||||
|
||||
pisitools.domove("/var/run/stap-server", "/run/")
|
||||
pisitools.removeDir("var/run")
|
||||
|
||||
shelltools.copytree("testsuite", "%s/usr/share/systemtap" % get.installDIR())
|
||||
|
||||
pisitools.insinto("/etc/logrotate.d", "initscript/logrotate.stap-server", "stap-server")
|
||||
pisitools.insinto("/etc/conf.d", "initscript/config.stap-server", "stap-server")
|
||||
pisitools.insinto("/etc/systemtap", "initscript/config.systemtap", "config")
|
||||
|
||||
# Clean uprobes directory
|
||||
#autotools.make("-C %s/usr/share/systemtap/runtime/uprobes clean" % get.installDIR())
|
||||
|
||||
pisitools.dodoc("COPYING", "HACKING", "INTERNALS", "README.*")
|
||||
@@ -0,0 +1,31 @@
|
||||
#/usr/bin/python
|
||||
|
||||
import os
|
||||
|
||||
LOGFILE = "/var/log/stap-server/log"
|
||||
|
||||
permissions = {
|
||||
"/usr/share/systemtap/runtime/uprobes" : ["0775", "root:stap-server"],
|
||||
LOGFILE : ["0664", "stap-server:stap-server"],
|
||||
}
|
||||
|
||||
# TODO
|
||||
# If it does not already exist, as stap-server, generate the certificate
|
||||
# used for signing and for ssl.
|
||||
#if test ! -e ~stap-server/.systemtap/ssl/server/stap.cert; then
|
||||
# runuser -s /bin/sh - stap-server -c %{_libexecdir}/%{name}/stap-gen-cert >/dev/null
|
||||
# Authorize the certificate as a trusted ssl peer and as a trusted signer
|
||||
# on the local host.
|
||||
# %{_libexecdir}/%{name}/stap-authorize-cert ~stap-server/.systemtap/ssl/server/stap.cert %{_sysconfdir}/systemtap/ssl/client >/dev/null
|
||||
# %{_libexecdir}/%{name}/stap-authorize-cert ~stap-server/.systemtap/ssl/server/stap.cert %{_sysconfdir}/systemtap/staprun >/dev/null
|
||||
#fi
|
||||
|
||||
def postInstall(fromVersion, fromRelease, toVersion, toRelease):
|
||||
if not os.path.exists(LOGFILE):
|
||||
open(LOGFILE, "w").write("")
|
||||
|
||||
for _file, perms in permissions.items():
|
||||
# The list above is general, some paths may not exist depending on the configuration
|
||||
if os.path.exists(_file):
|
||||
os.system("/bin/chown -R %s %s" % (perms[1], _file))
|
||||
os.system("/bin/chmod %s %s" % (perms[0], _file))
|
||||
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# stap-server init.d script for the systemtap compile server
|
||||
#
|
||||
# chkconfig: - 00 99
|
||||
# description: The systemtap compile server provides a centralized and secure \
|
||||
# environment for compiling systemtap scripts.
|
||||
# config: /etc/sysconfig/stap-server
|
||||
# config: /etc/stap-server/conf.d
|
||||
|
||||
# Call the installed stap-server script.
|
||||
STAP_USER=stap-server ${exec_prefix}/bin/stap-server "$@"
|
||||
@@ -0,0 +1,749 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# systemtap Startup script for SystemTap scripts
|
||||
#
|
||||
# chkconfig: - 00 99
|
||||
# description: SystemTap is a programmable kernel/application tracing tool.
|
||||
# config: /etc/systemtap/config
|
||||
# config: /etc/systemtap/conf.d
|
||||
### BEGIN INIT INFO
|
||||
# Provides: SystemTap scripts startup
|
||||
# Required-Start: $local_fs
|
||||
# Required-Stop: $local_fs
|
||||
# Short-Description: Start and stop SystemTap scripts
|
||||
# Description: SystemTap is a programmable kernel/application tracing tool.
|
||||
### END INIT INFO
|
||||
|
||||
# Source function library.
|
||||
if [ -f /etc/rc.d/init.d/functions ]; then
|
||||
# Red Hat init functions
|
||||
. /etc/rc.d/init.d/functions
|
||||
else
|
||||
# Default init functions
|
||||
success () {
|
||||
echo -n "OK"
|
||||
}
|
||||
failure () {
|
||||
echo -n "FAILED"
|
||||
}
|
||||
fi
|
||||
|
||||
prog=systemtap
|
||||
|
||||
# Commands
|
||||
STAP=${exec_prefix}/bin/stap
|
||||
STAPRUN=${exec_prefix}/bin/staprun
|
||||
UNAME=/bin/uname
|
||||
LSMOD=/sbin/lsmod
|
||||
|
||||
# Path setup
|
||||
SCRIPT_PATH=/etc/systemtap/script.d
|
||||
CONFIG_PATH=/etc/systemtap/conf.d
|
||||
CACHE_PATH=/var/cache/systemtap
|
||||
STAT_PATH=/run/systemtap
|
||||
TEMP_PATH=/tmp
|
||||
LOG_FILE=/var/log/systemtap.log
|
||||
|
||||
# FAIL unless all scripts succeeded to run
|
||||
PASSALL=yes
|
||||
|
||||
# Always follows script dependencies
|
||||
RECURSIVE=no
|
||||
|
||||
# Automatically recompile scripts if caches are old or do not exist.
|
||||
AUTOCOMPILE=yes
|
||||
|
||||
# Start these scripts by default. If omitted, all scripts are started.
|
||||
DEFAULT_START=
|
||||
|
||||
# Allow cache only scripts
|
||||
ALLOW_CACHEONLY=no
|
||||
|
||||
# Optional settings
|
||||
CONFIG=/etc/systemtap/config
|
||||
SCRIPTS=
|
||||
KRELEASE=`uname -r`
|
||||
OPT_RECURSIVE=
|
||||
OPT_SCRIPTS=
|
||||
OPTS=
|
||||
OPT_ASSUMEYES=
|
||||
|
||||
echo_usage () {
|
||||
echo $"Usage: $prog {start|stop|status|restart|compile|cleanup|condrestart|try-restart|reload|force-reload} [option]"
|
||||
echo $"Options:"
|
||||
echo $" -c configfile : specify config file"
|
||||
echo $" -r kernelrelease: specify kernel release version"
|
||||
echo $" -R : recursively dependency checking"
|
||||
echo $" -y : answer yes for all questions."
|
||||
echo $" script(s) : specify systemtap scripts"
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------
|
||||
# Helper functions
|
||||
#-----------------------------------------------------------------
|
||||
log () { # message
|
||||
echo `LC_ALL=en date +"%b %e %T"`": $1" >> "$LOG_FILE"
|
||||
}
|
||||
clog () { # message [-n]
|
||||
echo $2 "$1"
|
||||
log "$1"
|
||||
}
|
||||
slog () { # message
|
||||
logger "$1" # if syslogd is running, this message will be sent to syslog.
|
||||
log "$1"
|
||||
}
|
||||
logex () { # command
|
||||
eval log \"Exec: $@\"
|
||||
"$@" >> "$LOG_FILE" 2>&1
|
||||
return $?
|
||||
}
|
||||
do_warning () { # message
|
||||
slog "Warning: $1"
|
||||
warning "$1"
|
||||
}
|
||||
do_failure () { # message
|
||||
slog "Error: $1"
|
||||
failure "$1"
|
||||
}
|
||||
do_success () { # message
|
||||
log "Pass: $1"
|
||||
success "$1"
|
||||
}
|
||||
# Normalize options
|
||||
check_bool () { # value
|
||||
case $1 in
|
||||
n|N|no|No|NO|0)
|
||||
return 0;;
|
||||
y|Y|yes|Yes|YES|1)
|
||||
return 1;;
|
||||
*)
|
||||
return 2;;
|
||||
esac
|
||||
}
|
||||
ask_yesno () { # message
|
||||
local yn ret=2
|
||||
[ "$OPT_ASSUMEYES" ] && return 1
|
||||
while [ $ret -eq 2 ]; do
|
||||
echo -n "$1 [y/N]: "
|
||||
read yn
|
||||
[ -z "$yn" ] && return 0
|
||||
check_bool $yn
|
||||
ret=$?
|
||||
done
|
||||
return $ret
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------
|
||||
# Parameter parsing and setup options
|
||||
#------------------------------------------------------------------
|
||||
parse_args () { # arguments
|
||||
while [ -n "$1" ]; do
|
||||
case "$1" in
|
||||
-c)
|
||||
CONFIG=$2
|
||||
shift 1
|
||||
;;
|
||||
-r)
|
||||
KRELEASE=$2
|
||||
shift 1
|
||||
;;
|
||||
-R)
|
||||
OPT_RECURSIVE=1
|
||||
;;
|
||||
-y)
|
||||
OPT_ASSUMEYES=1
|
||||
;;
|
||||
--)
|
||||
;;
|
||||
*)
|
||||
OPT_SCRIPTS=$OPT_SCRIPTS\ $1
|
||||
;;
|
||||
esac
|
||||
shift 1
|
||||
done
|
||||
}
|
||||
|
||||
CMD=$1
|
||||
shift 1
|
||||
OPTS=`getopt -s bash -u -o 'r:c:Ry' -- $@`
|
||||
if [ $? -ne 0 ]; then
|
||||
slog "Error: Argument parse error: $@"
|
||||
failure $"parse error"
|
||||
echo_usage
|
||||
exit 3
|
||||
fi
|
||||
parse_args $OPTS
|
||||
|
||||
# Include configs
|
||||
. "$CONFIG"
|
||||
|
||||
for f in "$CONFIG_PATH"/*.conf; do
|
||||
if [ -f "$f" ]; then
|
||||
. "$f"
|
||||
fi
|
||||
done
|
||||
|
||||
check_bool $PASSALL
|
||||
PASSALL=$?
|
||||
check_bool $RECURSIVE
|
||||
RECURSIVE=$?
|
||||
if [ "$OPT_RECURSIVE" ]; then # -r option overrides RECURSIVE.
|
||||
RECURSIVE=1
|
||||
fi
|
||||
check_bool $AUTOCOMPILE
|
||||
AUTOCOMPILE=$?
|
||||
CACHE_PATH="$CACHE_PATH/$KRELEASE"
|
||||
|
||||
check_bool $ALLOW_CACHEONLY
|
||||
ALLOW_CACHEONLY=$?
|
||||
|
||||
__get_all_scripts () {
|
||||
local s
|
||||
if [ $ALLOW_CACHEONLY -eq 1 ]; then
|
||||
for s in "$CACHE_PATH"/*.ko; do
|
||||
if [ -f "$s" ]; then
|
||||
basename "$s" | sed s/\.ko$//g
|
||||
fi
|
||||
done
|
||||
fi
|
||||
for s in "$SCRIPT_PATH"/*.stp; do
|
||||
if [ -f "$s" ]; then
|
||||
basename "$s" | sed s/\.stp$//g
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
get_all_scripts() {
|
||||
__get_all_scripts | sort | uniq
|
||||
}
|
||||
|
||||
if [ -z "$OPT_SCRIPTS" ]; then
|
||||
SCRIPTS=`get_all_scripts | xargs`
|
||||
RECURSIVE=1
|
||||
else
|
||||
SCRIPTS="$OPT_SCRIPTS"
|
||||
fi
|
||||
|
||||
#------------------------------------------------------------------
|
||||
# Main routine
|
||||
#------------------------------------------------------------------
|
||||
NR_FAILS=0
|
||||
might_fail () { # message exitcode
|
||||
if [ $PASSALL -eq 1 ]; then
|
||||
do_failure "$1"
|
||||
echo
|
||||
[ -z "$2" ] && exit 1
|
||||
exit $2
|
||||
else
|
||||
log "Warning: "$1
|
||||
NR_FAILS=$((NR_FAILS+1))
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
might_success () { # message
|
||||
if [ $NR_FAILS -ne 0 ]; then
|
||||
log "Warning: $NR_FAILS failure occurred."
|
||||
do_warning "$1"
|
||||
else
|
||||
do_success "$1"
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
get_all_runnings () {
|
||||
local f
|
||||
for f in "$STAT_PATH"/*; do
|
||||
if [ -f "$f" ]; then
|
||||
basename "$f"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
get_daemon_pid () { # script
|
||||
cat "$STAT_PATH/$1"
|
||||
}
|
||||
|
||||
# Check whether a script is running. Returns:
|
||||
# 0: running
|
||||
# 4: running, but no pidfile
|
||||
# 3: not running
|
||||
# 1: not running, but pidfile remains
|
||||
check_running () { # script
|
||||
local m f
|
||||
f="$STAT_PATH/$1"
|
||||
m=`$LSMOD | grep "^$1 "`
|
||||
if [ -n "$m" ]; then
|
||||
[ -f "$f" ] && return 0 # running
|
||||
return 4 # another script is running
|
||||
else
|
||||
[ -f "$f" ] && return 1 # dead, but pidfile remains
|
||||
return 3 # dead
|
||||
fi
|
||||
}
|
||||
|
||||
# check whether a script cache need to be updated.
|
||||
check_cache () { # script opts
|
||||
local s tmp tmp2
|
||||
s=$1; shift 1
|
||||
[ ! -f "$CACHE_PATH/$s.ko" -o ! -f "$CACHE_PATH/$s.opts" ] && return 1
|
||||
if [ $ALLOW_CACHEONLY -ne 1 -o -f "$SCRIPT_PATH/$s.stp" ]; then
|
||||
[ "$SCRIPT_PATH/$s.stp" -nt "$CACHE_PATH/$s.ko" ] && return 2
|
||||
fi
|
||||
tmp=`head -n 1 "$CACHE_PATH/$s.opts"`
|
||||
tmp2=`$UNAME -a`
|
||||
[ "$tmp" != "$tmp2" ] && return 3
|
||||
tmp=`tail -n 1 "$CACHE_PATH/$s.opts"`
|
||||
tmp2="$*"
|
||||
[ "$tmp" != "$tmp2" ] && return 4
|
||||
return 0
|
||||
}
|
||||
|
||||
stap_getopt () { # opts
|
||||
local ret
|
||||
# TODO: support quoted options
|
||||
getopt -s bash -u \
|
||||
-l 'kelf,kmap::,ignore-vmlinux,ignore-dwarf,vp:' \
|
||||
-o 'hVvtp:I:e:o:R:r:m:kgPc:x:D:bs:uqwl:d:L:FS:' -- $@
|
||||
ret=$?
|
||||
[ $ret -ne 0 ] && slog "Failed to parse parameters. ($@)"
|
||||
return $ret
|
||||
}
|
||||
|
||||
get_compile_opts () { # opts
|
||||
local opts o skip
|
||||
opts=`stap_getopt $*`
|
||||
[ $? -ne 0 ] && return 1
|
||||
skip=0
|
||||
for o in $opts; do
|
||||
if [ $skip -ne 0 ]; then skip=0; continue; fi
|
||||
case $o in
|
||||
-p|-m|-r|-c|-x|-e|-s|-o|-S)
|
||||
skip=1 ;;
|
||||
-h|-V|-k|-F)
|
||||
;;
|
||||
*)
|
||||
echo -n $o" " ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
get_run_opts () { # normalized_opts
|
||||
local opts o show mode
|
||||
opts=`stap_getopt $*`
|
||||
[ $? -ne 0 ] && return 1
|
||||
mode='-L'
|
||||
show=0
|
||||
for o in $opts; do
|
||||
case $o in
|
||||
-c|-x|-s|-o|-S)
|
||||
[ $o == '-s' ] && o='-b'
|
||||
[ $o == '-o' ] && mode='-D'
|
||||
echo -n $o" "
|
||||
show=1
|
||||
;;
|
||||
*)
|
||||
if [ $show -ne 0 ]; then
|
||||
echo -n $o" "
|
||||
show=0
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
echo -n $mode
|
||||
}
|
||||
|
||||
prepare_cache_dir () {
|
||||
if [ ! -d "$CACHE_PATH" ]; then
|
||||
logex mkdir -p "$CACHE_PATH"
|
||||
[ $? -ne 0 ] && return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
prepare_stat_dir () {
|
||||
if [ ! -d "$STAT_PATH" ]; then
|
||||
logex mkdir -p "$STAT_PATH"
|
||||
[ $? -ne 0 ] && return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
compile_script () { # script checkcache
|
||||
local opts f tmpdir ret
|
||||
eval f="$SCRIPT_PATH/$1.stp"
|
||||
if [ ! -f "$f" ]; then
|
||||
if [ $ALLOW_CACHEONLY -eq 1 ]; then
|
||||
clog "Warning: no script file($f). Use compiled cache."
|
||||
return 0
|
||||
else
|
||||
clog "Error: no script file($f)."
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
eval opts=\$$1_OPT
|
||||
opts=`get_compile_opts $opts`
|
||||
[ $? -ne 0 ] && return 2
|
||||
|
||||
if [ "$2" = "check" ]; then
|
||||
check_cache $1 $opts
|
||||
[ $? -eq 0 ] && return 0 # already compiled
|
||||
if [ $AUTOCOMPILE -eq 0 ]; then
|
||||
slog "No valid cache for $1"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
clog " Compiling $1 ... " -n
|
||||
tmpdir=`mktemp -d -p "$TEMP_PATH" cache.XXXXXXXX`
|
||||
if [ $? -ne 0 ]; then
|
||||
clog "Failed to create temporary directory."
|
||||
return 1
|
||||
fi
|
||||
pushd "$tmpdir" &> /dev/null
|
||||
logex $STAP -m "$1" -p4 -r $KRELEASE $opts "$f"
|
||||
ret=$?
|
||||
if [ $ret -eq 0 ]; then
|
||||
$UNAME -a > "$1.opts"
|
||||
echo $opts >> "$1.opts"
|
||||
logex mv "$1.ko" "$1.opts" "$CACHE_PATH/"
|
||||
ret=$?
|
||||
else
|
||||
slog "Failed to compile script($1)."
|
||||
fi
|
||||
popd &> /dev/null
|
||||
rm -rf $tmpdir
|
||||
[ $ret -eq 0 ] && clog "done" || clog "error"
|
||||
return $ret
|
||||
}
|
||||
|
||||
# dependency resolver
|
||||
__SORTED=
|
||||
__follow_dependency () { # script requesters
|
||||
local opts r reqs s ret
|
||||
s=$1
|
||||
shift 1
|
||||
r=`echo \ $*\ | grep \ $s\ `
|
||||
if [ -n "$r" ]; then
|
||||
might_fail $"Dependency loop detected on $s"
|
||||
return 1
|
||||
fi
|
||||
r=`echo \ $__SORTED\ | grep \ $s\ `
|
||||
[ -n "$r" ] && return 0 # already listed up
|
||||
eval reqs=\$${s}_REQ
|
||||
if [ -n "$reqs" ]; then
|
||||
for r in $reqs; do
|
||||
__follow_dependency $r $s $*
|
||||
ret=$?
|
||||
if [ $ret -ne 0 ]; then
|
||||
return $ret # if one of requires failed, we can't run this script.
|
||||
fi
|
||||
done
|
||||
fi
|
||||
echo -n "$s "
|
||||
return 0
|
||||
}
|
||||
|
||||
sort_dependency () { # scripts
|
||||
local s r=0
|
||||
__SORTED=
|
||||
for s in $*; do
|
||||
__SORTED="$__SORTED "`__follow_dependency $s`
|
||||
[ $? -ne 0 ] && return 1
|
||||
done
|
||||
echo $__SORTED
|
||||
return 0
|
||||
}
|
||||
|
||||
start_script () { # script
|
||||
local tmpdir s=$1 ret count=0
|
||||
check_running $s
|
||||
ret=$?
|
||||
[ $ret -eq 0 ] && return 0 # already running
|
||||
if [ $ret -eq 4 ]; then
|
||||
clog "$s is dead, but another script is running."
|
||||
return 4
|
||||
fi
|
||||
|
||||
compile_script $s check
|
||||
ret=$?
|
||||
[ $ret -ne 0 ] && return $ret
|
||||
|
||||
eval opts=\$${s}_OPT
|
||||
opts=`get_run_opts $opts`
|
||||
[ $? -ne 0 ] && return 2
|
||||
|
||||
clog " Starting $1 ... " -n
|
||||
tmpdir=`mktemp -d -p "$TEMP_PATH" cache.XXXXXXXX` # bz7097
|
||||
if [ $? -ne 0 ]; then
|
||||
clog "Failed to create temporary directory."
|
||||
return 1
|
||||
fi
|
||||
pushd "$tmpdir" &> /dev/null
|
||||
eval log \"Exec: $STAPRUN $opts $CACHE_PATH/$s.ko\"
|
||||
$STAPRUN $opts "$CACHE_PATH/$s.ko" 2>> "$LOG_FILE" > ./pid
|
||||
ret=$?
|
||||
|
||||
# When the staprun '-D' option (run in background as a daemon) is
|
||||
# used, staprun detaches from the terminal and *then* prints the new
|
||||
# pid. So, it is possible to check the ./pid file before it has
|
||||
# been written. To avoid this, wait a bit (if necessary).
|
||||
while [ $count -lt 10 ]; do
|
||||
# when the file exists and has a size > 0, quit
|
||||
[ -s ./pid ] && break
|
||||
sleep 1
|
||||
count=`expr $count + 1`
|
||||
done
|
||||
|
||||
[ x`cat ./pid` = x ] && echo 0 > ./pid
|
||||
if [ $ret -eq 0 ]; then
|
||||
logex cp -f ./pid "$STAT_PATH/$s"
|
||||
fi
|
||||
popd &> /dev/null
|
||||
rm -rf "$tmpdir"
|
||||
[ $ret -eq 0 ] && clog "done" || clog "error"
|
||||
return $ret
|
||||
}
|
||||
|
||||
start () {
|
||||
local start_scripts s ret
|
||||
clog $"Starting $prog: " -n
|
||||
|
||||
start_scripts=$SCRIPTS
|
||||
if [ -n "$DEFAULT_START" -a -z "$OPT_SCRIPTS" ]; then
|
||||
start_scripts="$DEFAULT_START"
|
||||
fi
|
||||
|
||||
if [ -z "$start_scripts" ]; then
|
||||
do_warning $"No scripts exist."
|
||||
return 5 # program is not installed
|
||||
fi
|
||||
|
||||
prepare_stat_dir
|
||||
if [ $? -ne 0 ]; then
|
||||
do_failure $"Failed to make stat directory ($STAT_PATH)"
|
||||
return 1
|
||||
fi
|
||||
prepare_cache_dir
|
||||
if [ $? -ne 0 ]; then
|
||||
do_failure $"Failed to make cache directory ($CACHE_PATH)"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ $RECURSIVE -eq 1 ]; then
|
||||
start_scripts=`sort_dependency $start_scripts`
|
||||
if [ $? -ne 0 ]; then
|
||||
do_failure $"Failed to sort dependency"
|
||||
return 6 # program is not configured
|
||||
fi
|
||||
fi
|
||||
for s in $start_scripts; do
|
||||
start_script "$s"
|
||||
ret=$?
|
||||
if [ $ret -ne 0 ]; then
|
||||
might_fail $"Failed to run \"$s\". ($ret)"
|
||||
fi
|
||||
done
|
||||
might_success $"$prog startup"
|
||||
return 0
|
||||
}
|
||||
|
||||
stop_script () { # script
|
||||
local p f count=0
|
||||
|
||||
f="$STAT_PATH/$1"
|
||||
while [ $count -lt 10 ]; do
|
||||
check_running "$1"
|
||||
ret=$?
|
||||
|
||||
# If the module is isn't running, we're done.
|
||||
[ $ret -eq 3 ] && return 0
|
||||
# If the module isn't loaded but the pidfile remains, remove the
|
||||
# old pidfile and return.
|
||||
if [ $ret -eq 1 ]; then
|
||||
rm -f $f
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Try to either kill the stap process that is handling the
|
||||
# module (which will cause the module to be unloaded) or use
|
||||
# staprun to delete the module. (Note that staprun will only
|
||||
# delete systemtap modules.)
|
||||
p=`get_daemon_pid $1`
|
||||
if [ $p -ne 0 ]; then
|
||||
logex kill -TERM $p
|
||||
else
|
||||
logex $STAPRUN -d "$1"
|
||||
fi
|
||||
[ $? -ne 0 ] && return 1
|
||||
|
||||
# At this point the module should be unloaded, but the pidfile
|
||||
# will still be present. If so, remove the pidfile and return.
|
||||
# Otherwise, wait a bit for the module to unload and try again.
|
||||
check_running "$1"
|
||||
ret=$?
|
||||
[ $ret -eq 3 ] && return 0
|
||||
if [ $ret -eq 1 ]; then
|
||||
rm -f $f
|
||||
return 0
|
||||
fi
|
||||
sleep 1
|
||||
count=`expr $count + 1`
|
||||
done
|
||||
|
||||
do_failure $"Failed to stop script \"$1\" after $count attempts"
|
||||
return 1
|
||||
}
|
||||
|
||||
stop () {
|
||||
local stop_scripts s sl=
|
||||
clog $"Stopping $prog: " -n
|
||||
stop_scripts=$SCRIPTS
|
||||
[ -z "$OPT_SCRIPTS" ] && stop_scripts=`get_all_runnings`
|
||||
if [ $RECURSIVE -eq 1 ]; then
|
||||
stop_scripts=`sort_dependency $stop_scripts`
|
||||
if [ $? -ne 0 ]; then
|
||||
do_failure $"Failed to sort dependency"
|
||||
return 6 # program is not configured
|
||||
fi
|
||||
fi
|
||||
for s in $stop_scripts; do
|
||||
sl="$s $sl"
|
||||
done
|
||||
for s in $sl; do
|
||||
stop_script $s
|
||||
[ $? -ne 0 ] && might_fail $"Failed to stop \"$s\". "
|
||||
done
|
||||
might_success $"$prog stopping "
|
||||
return 0
|
||||
}
|
||||
|
||||
rh_status () {
|
||||
local status_scripts s pid ret r
|
||||
status_scripts=$SCRIPTS
|
||||
[ -z "$status_scripts" ] && status_scripts=`get_all_runnings`
|
||||
ret=3
|
||||
if [ -z "$status_scripts" ] ; then
|
||||
echo "No systemtap scripts are present"
|
||||
return $ret
|
||||
fi
|
||||
for s in $status_scripts; do
|
||||
check_running $s
|
||||
r=$?
|
||||
[ $ret -ne 0 ] && ret=$r
|
||||
case $r in
|
||||
0)
|
||||
pid=`get_daemon_pid $s`
|
||||
[ $pid -ne 0 ] && pid="($pid)" || pid=
|
||||
echo $"$s$pid is running..." ;;
|
||||
1|3) echo $"$s is stopped" ;;
|
||||
4) echo $"$s is dead, but another script is running.";;
|
||||
esac
|
||||
done
|
||||
return $ret
|
||||
}
|
||||
|
||||
rh_status_q () {
|
||||
rh_status >/dev/null 2>&1
|
||||
return $?
|
||||
}
|
||||
|
||||
compile () {
|
||||
local s ss
|
||||
clog $"Compiling systemtap scripts: " -n
|
||||
prepare_cache_dir
|
||||
if [ $? -ne 0 ]; then
|
||||
do_failure $"Failed to make cache directory ($CACHE_PATH)"
|
||||
return 1
|
||||
fi
|
||||
for s in $SCRIPTS; do
|
||||
ss="$ss "`ls "$CACHE_PATH/$s.ko" "$CACHE_PATH/$s.opts" 2> /dev/null`
|
||||
done
|
||||
ss=`echo -n $ss`
|
||||
if [ "$ss" ]; then
|
||||
clog "Updating caches: $ss"
|
||||
ask_yesno "Do you really want to update above caches"
|
||||
[ $? -eq 0 ] && return 0
|
||||
fi
|
||||
for s in $SCRIPTS; do
|
||||
compile_script $s nocheck
|
||||
[ $? -ne 0 ] && might_fail $"$s compilation failed "
|
||||
done
|
||||
might_success $"$prog compiled "
|
||||
return 0
|
||||
}
|
||||
|
||||
# Cleanup caches
|
||||
cleanup () {
|
||||
local s ss ret
|
||||
clog $"Cleaning up systemtap scripts: " -n
|
||||
if [ ! -d "$CACHE_PATH" ]; then
|
||||
do_success "no cache"
|
||||
return 0
|
||||
fi
|
||||
|
||||
for s in $SCRIPTS; do
|
||||
ss="$ss "`ls "$CACHE_PATH/$s.ko" "$CACHE_PATH/$s.opts" 2> /dev/null`
|
||||
done
|
||||
ss=`echo -n $ss`
|
||||
if [ "$ss" ]; then
|
||||
echo "Removing caches: $ss"
|
||||
ask_yesno "Do you really want to remove above caches"
|
||||
[ $? -eq 0 ] && return 0
|
||||
for s in $SCRIPTS; do
|
||||
logex rm -f "$CACHE_PATH/$s.ko" "$CACHE_PATH/$s.opts"
|
||||
[ $? -ne 0 ] && might_fail $"failed to clean cache $s.ko"
|
||||
done
|
||||
might_success "done"
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
# Restart scripts
|
||||
function restart () {
|
||||
stop
|
||||
echo # we need a newline
|
||||
start
|
||||
return $?
|
||||
}
|
||||
|
||||
RETVAL=0
|
||||
|
||||
case $CMD in
|
||||
start)
|
||||
start
|
||||
RETVAL=$?
|
||||
;;
|
||||
stop)
|
||||
stop
|
||||
RETVAL=$?
|
||||
;;
|
||||
restart|force-reload|reload)
|
||||
restart
|
||||
RETVAL=$?
|
||||
;;
|
||||
status)
|
||||
rh_status
|
||||
exit $?
|
||||
;;
|
||||
compile)
|
||||
compile
|
||||
RETVAL=$?
|
||||
;;
|
||||
cleanup)
|
||||
cleanup
|
||||
RETVAL=$?
|
||||
;;
|
||||
condrestart|try-restart)
|
||||
rh_status_q || exit 0
|
||||
restart
|
||||
RETVAL=$?
|
||||
;;
|
||||
*)
|
||||
echo_usage
|
||||
RETVAL=3
|
||||
;;
|
||||
esac
|
||||
|
||||
echo
|
||||
exit $RETVAL
|
||||
@@ -0,0 +1,10 @@
|
||||
--- ./runtime/linux/access_process_vm.h 2017-02-17 18:37:01.000000000 +0100
|
||||
+++ /usr/share/systemtap/runtime/linux/access_process_vm.h 2017-08-09 11:47:50.332532411 +0200
|
||||
@@ -4,6 +4,7 @@
|
||||
* we copied and pasted it here. Fortunately, everything it calls is exported.
|
||||
*/
|
||||
#include <linux/pagemap.h>
|
||||
+#include <linux/sched/mm.h>
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
static int
|
||||
@@ -0,0 +1,11 @@
|
||||
--- ./runtime/stp_utrace.c 2017-02-17 18:37:01.000000000 +0100
|
||||
+++ /usr/share/systemtap/runtime/stp_utrace.c 2017-08-09 11:59:21.542501780 +0200
|
||||
@@ -1105,7 +1105,7 @@
|
||||
*/
|
||||
spin_lock_irq(&target->sighand->siglock);
|
||||
if (likely(task_is_stopped(target)))
|
||||
- __set_task_state(target, TASK_TRACED);
|
||||
+ set_current_state(TASK_TRACED);
|
||||
spin_unlock_irq(&target->sighand->siglock);
|
||||
} else if (utrace->resume > UTRACE_REPORT) {
|
||||
utrace->resume = UTRACE_REPORT;
|
||||
@@ -0,0 +1,2 @@
|
||||
d /run/stap-server 0755 root root
|
||||
d /run/systemtap 0755 root root
|
||||
@@ -0,0 +1,109 @@
|
||||
<?xml version="1.0" ?>
|
||||
<!DOCTYPE PISI SYSTEM "http://www.pisilinux.org/projeler/pisi/pisi-spec.dtd">
|
||||
<PISI>
|
||||
<Source>
|
||||
<Name>systemtap</Name>
|
||||
<Homepage>http://sourceware.org/systemtap/</Homepage>
|
||||
<Packager>
|
||||
<Name>PisiLinux Community</Name>
|
||||
<Email>admins@pisilinux.org</Email>
|
||||
</Packager>
|
||||
<License>GPLv2+</License>
|
||||
<IsA>app:console</IsA>
|
||||
<Summary>Instrumentation System</Summary>
|
||||
<Description>systemtap is an instrumentation system for systems running Linux 2.6. Developers can write instrumentation to collect data on the operation of the system.</Description>
|
||||
<Archive sha1sum="cd4482870015b9429f9945588ea8846d4ace20d1" type="targz">ftp://sourceware.org/pub/systemtap/releases/systemtap-3.2.tar.gz</Archive>
|
||||
<BuildDependencies>
|
||||
<Dependency>python-devel</Dependency>
|
||||
<Dependency>sqlite-devel</Dependency>
|
||||
<Dependency>readline-devel</Dependency>
|
||||
<Dependency>ncurses-devel</Dependency>
|
||||
<Dependency>libxml2-devel</Dependency>
|
||||
<Dependency>json-c-devel</Dependency>
|
||||
<Dependency>boost-devel</Dependency>
|
||||
<Dependency>nss-devel</Dependency>
|
||||
<Dependency>python-setuptools</Dependency>
|
||||
</BuildDependencies>
|
||||
<Patches>
|
||||
</Patches>
|
||||
</Source>
|
||||
|
||||
<Package>
|
||||
<Name>systemtap</Name>
|
||||
<RuntimeDependencies>
|
||||
<Dependency>readline</Dependency>
|
||||
<Dependency>sqlite</Dependency>
|
||||
<Dependency>python</Dependency>
|
||||
<Dependency>nspr</Dependency>
|
||||
<Dependency>nss</Dependency>
|
||||
<Dependency>elfutils</Dependency>
|
||||
<Dependency>libgcc</Dependency>
|
||||
</RuntimeDependencies>
|
||||
<Files>
|
||||
<Path fileType="config">/etc</Path>
|
||||
<Path fileType="executable">/usr/bin</Path>
|
||||
<Path fileType="library">/usr/lib</Path>
|
||||
<Path fileType="man">/usr/share/man</Path>
|
||||
<Path fileType="doc">/usr/share/doc</Path>
|
||||
<Path fileType="data">/run/systemtap</Path>
|
||||
<Path fileType="data">/run/stap-server</Path>
|
||||
<Path fileType="data">/etc/logrotate.d</Path>
|
||||
<Path fileType="data">/var/log/stap-server</Path>
|
||||
<Path fileType="data">/var/cache/systemtap</Path>
|
||||
<Path fileType="localedata">/usr/share/locale</Path>
|
||||
<Path fileType="data">/usr/share/systemtap/tapset</Path>
|
||||
<Path fileType="data">/usr/share/systemtap/runtime</Path>
|
||||
<Path fileType="executable">/usr/libexec/systemtap</Path>
|
||||
<Path fileType="config">/usr/lib/tmpfiles.d/systemtap.conf</Path>
|
||||
<Path fileType="data">/usr/share/systemtap/examples</Path>
|
||||
</Files>
|
||||
<AdditionalFiles>
|
||||
<AdditionalFile owner="root" permission="0644" target="/usr/lib/tmpfiles.d/systemtap.conf">tmpfiles.conf</AdditionalFile>
|
||||
</AdditionalFiles>
|
||||
<Provides>
|
||||
<COMAR script="package.py">System.Package</COMAR>
|
||||
</Provides>
|
||||
</Package>
|
||||
|
||||
<Package>
|
||||
<Name>systemtap-testsuite</Name>
|
||||
<Summary>Testsuite allows testing of the entire SystemTap toolchain without having to rebuild from sources</Summary>
|
||||
<RuntimeDependencies>
|
||||
<Dependency release="current">systemtap</Dependency>
|
||||
<Dependency release="current">systemtap-sdt-devel</Dependency>
|
||||
</RuntimeDependencies>
|
||||
<Files>
|
||||
<Path fileType="data">/usr/share/systemtap/testsuite</Path>
|
||||
</Files>
|
||||
</Package>
|
||||
|
||||
<Package>
|
||||
<Name>systemtap-sdt-devel</Name>
|
||||
<Summary>Static probe support tools</Summary>
|
||||
<RuntimeDependencies>
|
||||
<Dependency release="current">systemtap</Dependency>
|
||||
<Dependency>python-devel</Dependency>
|
||||
<Dependency>sqlite-devel</Dependency>
|
||||
<Dependency>readline-devel</Dependency>
|
||||
<Dependency>ncurses-devel</Dependency>
|
||||
<Dependency>libxml2-devel</Dependency>
|
||||
<Dependency>json-c-devel</Dependency>
|
||||
<Dependency>boost-devel</Dependency>
|
||||
<Dependency>nss-devel</Dependency>
|
||||
</RuntimeDependencies>
|
||||
<Files>
|
||||
<Path fileType="executable">/usr/bin/dtrace</Path>
|
||||
<Path fileType="header">/usr/include</Path>
|
||||
</Files>
|
||||
</Package>
|
||||
|
||||
<History>
|
||||
<Update release="1">
|
||||
<Date>2017-11-24</Date>
|
||||
<Version>3.2</Version>
|
||||
<Comment>First release</Comment>
|
||||
<Name>Osman Erkan</Name>
|
||||
<Email>osman.erkan@pisilinux.org</Email>
|
||||
</Update>
|
||||
</History>
|
||||
</PISI>
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" ?>
|
||||
<PISI>
|
||||
<Source>
|
||||
<Name>systemtap</Name>
|
||||
<Summary xml:lang="tr">Enstrümantasyon sistemi</Summary>
|
||||
<Description xml:lang="tr">systemtap Linux 2.6 üzerinde çalışan sistemler için tasarlanmış bir enstrümantasyon altyapısıdır. Geliştiriciler, systemtap kullanarak, çalışmakta olan işletim sistemiyle ilgili veri toplamak için özel araçlar yazabilirler.</Description>
|
||||
</Source>
|
||||
|
||||
<Package>
|
||||
<Name>systemtap-sdt-devel</Name>
|
||||
<Summary xml:lang="tr">systemtap için statik deney desteği araçları</Summary>
|
||||
</Package>
|
||||
|
||||
<Package>
|
||||
<Name>systemtap-devel</Name>
|
||||
<Summary xml:lang="tr">systemtap için geliştirme dosyaları</Summary>
|
||||
</Package>
|
||||
</PISI>
|
||||
Reference in New Issue
Block a user