+def get_kvm_binary():
+ """Returns the path to the kvm binary and some extra arguments if needed"""
+
+ uname = get_command('uname')
+ which = get_command('which')
+
+ machine = str(uname('-m')).strip()
+ if re.match('i[3-6]86', machine):
+ machine = 'i386'
+
+ binary = which('qemu-system-%s' % machine)
+
+ needed_args = "--enable-kvm",
+
+ if binary is None:
+ return which('kvm'), tuple()
+
+ return binary, needed_args
+
+
+def try_fail_repeat(command, *args):
+ """Execute a command multiple times until it succeeds"""
+ times = (0.1, 0.5, 1, 2)
+ i = iter(times)
+ while True:
+ try:
+ command(*args)
+ return
+ except sh.ErrorReturnCode:
+ try:
+ wait = i.next()
+ except StopIteration:
+ break
+ time.sleep(wait)
+
+ raise FatalError("Command: `%s %s' failed" % (command, " ".join(args)))
+
+
+def free_space(dirname):
+ """Compute the free space in a directory"""
+ stat = os.statvfs(dirname)
+ return stat.f_bavail * stat.f_frsize
+
+