summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.examples/io
diff options
context:
space:
mode:
authorDavid Smith <dsmith@redhat.com>2009-06-11 16:29:13 -0500
committerDavid Smith <dsmith@redhat.com>2009-06-11 16:29:13 -0500
commit5dce84d4fe74644ef76004ff0402510b289a2778 (patch)
tree613deb4149bdfee88f48cc28d7a4b124946e5777 /testsuite/systemtap.examples/io
parent43229357282fd51eb1a3c7742932068873c27270 (diff)
parent749269040630f0f250f431a258e7967f54dc9a5c (diff)
downloadsystemtap-steved-5dce84d4fe74644ef76004ff0402510b289a2778.tar.gz
systemtap-steved-5dce84d4fe74644ef76004ff0402510b289a2778.tar.xz
systemtap-steved-5dce84d4fe74644ef76004ff0402510b289a2778.zip
Merge commit 'origin/master' into pr7043
Diffstat (limited to 'testsuite/systemtap.examples/io')
-rw-r--r--testsuite/systemtap.examples/io/ttyspy.meta6
-rwxr-xr-xtestsuite/systemtap.examples/io/ttyspy.stp46
2 files changed, 52 insertions, 0 deletions
diff --git a/testsuite/systemtap.examples/io/ttyspy.meta b/testsuite/systemtap.examples/io/ttyspy.meta
new file mode 100644
index 00000000..e29add1b
--- /dev/null
+++ b/testsuite/systemtap.examples/io/ttyspy.meta
@@ -0,0 +1,6 @@
+title: Monitor tty typing.
+name: ttyspy.stp
+keywords: io tty per-process monitor
+description: The ttyspy.stp script uses tty_audit hooks to monitor recent typing activity on the system, printing a scrolling record of recent keystrokes, on a per-tty basis.
+test_check: stap -gp4 ttyspy.stp
+test_installcheck: stap --skip-badvars -g ttyspy.stp -c "sleep 7"
diff --git a/testsuite/systemtap.examples/io/ttyspy.stp b/testsuite/systemtap.examples/io/ttyspy.stp
new file mode 100755
index 00000000..272d82e9
--- /dev/null
+++ b/testsuite/systemtap.examples/io/ttyspy.stp
@@ -0,0 +1,46 @@
+#! /usr/bin/stap -g
+# May also need --skip-badvars
+
+global activity_time, activity_log
+
+/* Concatenate head and tail, to a max of @num chars, preferring to keep the tail
+ (as if it were a recent history buffer). */
+function strcattail:string(head:string,tail:string,num:long) %{
+ unsigned taillen = strlen(THIS->tail);
+ unsigned headlen = strlen(THIS->head);
+ unsigned maxlen = THIS->num < MAXSTRINGLEN ? THIS->num : MAXSTRINGLEN;
+ unsigned headkeep = min(maxlen-taillen,headlen);
+ unsigned headdrop = headlen-headkeep;
+
+ if (headkeep)
+ strlcpy (THIS->__retvalue, &THIS->head[headdrop], headkeep+1); /* includes \0 */
+ strlcat (THIS->__retvalue, THIS->tail, maxlen);
+%}
+
+probe kernel.function("tty_audit_add_data") {
+ major=$tty->driver->major;
+ minor=$tty->driver->minor_start + $tty->index;
+ pgrp=$tty->pgrp %( kernel_v >= "2.6.24" %? ->numbers[0]->nr %: %);
+ data=kernel_string_n($data,$size);
+ uid=uid()
+
+ activity_time[major,minor,pgrp,uid] = gettimeofday_s();
+ activity_log[major,minor,pgrp,uid]
+ = strcattail(activity_log[major,minor,pgrp,uid],data,40);
+}
+
+probe timer.s(3) {
+ ansi_clear_screen ()
+ printf("(%3s,%2s,%5s,%5s)\n", "maj","min","pgrp","uid");
+ foreach ([x,y,z,u] in activity_time-) {
+ printf("(%3d,%3d,%5d,%5d) %s\n", x,y,z,u,
+ text_str(activity_log[x,y,z,u]))
+ }
+
+ /* delete last record, if older than 60 seconds */
+ if (activity_time[x,y,z,u]+60 < gettimeofday_s()) {
+ delete activity_time[x,y,z,u]
+ delete activity_log[x,y,z,u]
+ }
+}
+