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)