Initial checkin
git-svn-id: http://test.kernel.org/svn/autotest/trunk@2 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/bin/autotest_utils.py b/bin/autotest_utils.py
new file mode 100755
index 0000000..e58c984
--- /dev/null
+++ b/bin/autotest_utils.py
@@ -0,0 +1,161 @@
+import os,os.path,shutil,urllib,sys,signal
+
+def grep(pattern, file):
+# This is mainly to fix the return code inversion from grep
+ return not os.system('grep "' + pattern + '" "' + file + '"')
+
+
+def difflist(list1, list2):
+# returns items in list 2 that are not in list 1
+ diff = [];
+ for x in list2:
+ if x not in list1:
+ diff.append(x)
+ return diff
+
+
+def cat_file_to_cmd(file, command):
+ if file.endswith('.bz2'):
+ os.system('bzcat ' + file + ' | ' + command)
+ elif file.endswith('.gz'):
+ os.system('zcat ' + file + ' | ' + command)
+ else:
+ os.system('cat ' + file + ' | ' + command)
+
+
+def get_file(src, dest):
+ # get a file, either from url or local
+ if (src.startswith('http://')) or (src.startswith('ftp://')):
+ print 'PWD: ' + os.getcwd()
+ print 'Fetching \n\t', src, '\n\t->', dest
+ try:
+ urllib.urlretrieve(src, dest)
+ except IOError:
+ sys.stderr.write("Unable to retrieve %s (to %s)\n" % (src, dest))
+ sys.exit(1)
+ return dest
+ # elif os.path.isfile(src):
+ shutil.copyfile(src, dest)
+ return dest
+
+def basename(path):
+ i = path.rfind('/');
+ return path[i+1:]
+
+
+def force_copy(src, dest):
+ if os.path.isfile(dest):
+ os.remove(dest)
+ return shutil.copyfile(src, dest)
+
+
+def get_target_arch():
+# Work out which CPU architecture we're running on
+ if not os.system("egrep '^cpu.*(RS64|POWER(3|4|5)|PPC970|Broadband Engine)' /proc/cpuinfo"):
+ return 'ppc64'
+ elif not os.system("grep -q 'Opteron' /proc/cpuinfo"):
+ # THIS IS WRONG, needs Intel too
+ return 'x86_64'
+ else:
+ return 'i386'
+
+
+def kernelexpand(kernel):
+ # if not (kernel.startswith('http://') or kernel.startswith('ftp://') or os.path.isfile(kernel)):
+ if kernel.find('/'):
+ w, r = os.popen2('./kernelexpand ' + kernel)
+
+ kernel = r.readline().strip()
+ r.close()
+ w.close()
+ return kernel
+
+
+def count_cpus():
+ f = file('/proc/cpuinfo', 'r')
+ cpus = 0
+ for line in f.readlines():
+ if line.startswith('processor'):
+ cpus += 1
+ return cpus
+
+
+# We have our own definiton of system here, as the stock os.system doesn't
+# correctly handle sigpipe (ie things like "yes | head" will hang because
+# yes doesn't get the SIGPIPE).
+def system(cmd):
+ signal.signal(signal.SIGPIPE, signal.SIG_DFL)
+ try:
+ os.system(cmd)
+ finally:
+ signal.signal(signal.SIGPIPE, signal.SIG_IGN)
+
+
+def where_art_thy_filehandles():
+ os.system("ls -l /proc/%d/fd >> /dev/tty" % os.getpid())
+
+
+def print_to_tty(string):
+ os.system("echo " + string + " >> /dev/tty")
+
+
+class fd_stack:
+ # Note that we need to redirect both the sys.stdout type descriptor
+ # (which print, etc use) and the low level OS numbered descriptor
+ # which os.system() etc use.
+
+ def __init__(self, fd, filehandle):
+ self.fd = fd # eg 1
+ self.filehandle = filehandle # eg sys.stdout
+ self.stack = [(fd, filehandle)]
+
+
+ def redirect(self, filename):
+ fdcopy = os.dup(self.fd)
+ self.stack.append( (fdcopy, self.filehandle) )
+ # self.filehandle = file(filename, 'w')
+ if (os.path.isfile(filename)):
+ newfd = os.open(filename, os.O_WRONLY)
+ else:
+ newfd = os.open(filename, os.O_WRONLY | os.O_CREAT)
+ os.dup2(newfd, self.fd)
+ os.close(newfd)
+ self.filehandle = os.fdopen(self.fd, 'w')
+
+
+ def tee_redirect(self, filename):
+ print_to_tty("tee_redirect to " + filename)
+ where_art_thy_filehandles()
+ fdcopy = os.dup(self.fd)
+ self.stack.append( (fdcopy, self.filehandle) )
+ r, w = os.pipe()
+ pid = os.fork()
+ if pid: # parent
+ os.close(r)
+ os.dup2(w, self.fd)
+ os.close(w)
+ else: # child
+ os.close(w)
+ os.dup2(r, 0)
+ os.dup2(2, 1)
+ os.execlp('tee', 'tee', filename)
+ self.filehandle = os.fdopen(self.fd, 'w')
+ where_art_thy_filehandles()
+ print_to_tty("done tee_redirect to " + filename)
+
+
+ def restore(self):
+ print_to_tty("ENTERING RESTORE %d" % self.fd)
+ # where_art_thy_filehandles()
+ (old_fd, old_filehandle) = self.stack.pop()
+ # print_to_tty("old_fd %d" % old_fd)
+ # print_to_tty("self.fd %d" % self.fd)
+ self.filehandle.close() # seems to close old_fd as well.
+ # where_art_thy_filehandles()
+ os.dup2(old_fd, self.fd)
+ # print_to_tty("CLOSING FD %d" % old_fd)
+ os.close(old_fd)
+ # where_art_thy_filehandles()
+ self.filehandle = old_filehandle
+ # where_art_thy_filehandles()
+ # print_to_tty("EXIT RESTORE %d" % self.fd)