#!/usr/bin/env python
import os
import sys
import subprocess
import datetime
SYSCALLS_DESC = """Following is an overview of available syscall probes and
convenience variables they offer. By default, each syscall probe has name and
argstr convenience variables, which are not included in the overview in order
to keep it short. Non dwarf-based nd_syscall probes are supposed to have the
same convenience variables. """
DESTDIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../doc/SystemTap_Tapset_Reference')
def getManContent(body):
return """.\" -*- nroff -*-
.TH TAPSET::SYSCALLS 3stap \"""" + datetime.date.today().strftime("%B %Y") + """\" "Systemtap Tapset Reference"
.SH NAME
tapset::syscalls \- systemtap syscall tapset
.SH DESCRIPTION
{0}
.TP
.P
.TP
{1}
.SH SEE ALSO
.BR
.IR \%stap (1),
.IR \%stapprobes (3stap)
""".format(SYSCALLS_DESC, body)
def getXmlContent(body):
return """
syscalls
{0}
Syscalls list
syscall
params
{1}
""".format(SYSCALLS_DESC, body)
def execShellCmd(cmd):
p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = p.communicate()
sys.stderr.write(err)
return [line for line in out.split('\n') if line]
def getSyscallsList(output_type):
cmd = ['stap', '-L', 'nd_syscall.*']
out = execShellCmd(cmd)
retval = ""
for line in sorted(out):
tokens = line.split(' ')
tokens.reverse()
scname = tokens.pop().replace('nd_syscall.', '')
tokens = [t.split(':')[0] for t in sorted(tokens)]
tokens = [t for t in tokens if t not in ['argstr', 'name']]
tokens = [t for t in tokens if t[:1] != '_']
scargs = ", ".join(tokens)
if output_type=="xml":
retval += """
{0}
{1}
""".format(scname, scargs)
else: # OUTPUT_TYPE=="man"
retval += """.P
.TP
.B syscall.{0}
{1}
""".format(scname, scargs)
return retval
def main():
xmlfile = os.path.join(DESTDIR, 'syscalls.xmlpart')
print "Re-generating {0}...".format(xmlfile)
xml = open(xmlfile, 'w')
xml.write(getXmlContent(getSyscallsList("xml")))
xml.close()
manfile = os.path.join(DESTDIR, 'syscalls.3stap')
print "Re-generating {0}...".format(manfile)
man = open(manfile, 'w')
man.write(getManContent(getSyscallsList("man")))
man.close()
print "Done."
if __name__ == "__main__":
main()