5 import os, os.path, re, signal, shutil, socket, subprocess, tempfile
7 __all__ = ["python", "ssh_path"]
8 __all__ += ["rsh", "tcpdump_path", "sshd_path"]
9 __all__ += ["execute", "backticks"]
12 # Unittest from Python 2.6 doesn't have these decorators
13 def _bannerwrap(f, text):
15 def banner(*args, **kwargs):
16 sys.stderr.write("*** WARNING: Skipping test %s: `%s'\n" %
22 return lambda f: _bannerwrap(f, text)
24 def skipUnless(cond, text):
25 return (lambda f: _bannerwrap(f, text)) if not cond else lambda f: f
27 def skipIf(cond, text):
28 return (lambda f: _bannerwrap(f, text)) if cond else lambda f: f
30 def find_bin(name, extra_path = None):
32 if "PATH" in os.environ:
33 search += os.environ["PATH"].split(":")
34 for pref in ("/", "/usr/", "/usr/local/"):
35 for d in ("bin", "sbin"):
36 search.append(pref + d)
42 os.stat(d + "/" + name)
45 if e.errno != os.errno.ENOENT:
49 def find_bin_or_die(name, extra_path = None):
52 raise RuntimeError(("Cannot find `%s' command, impossible to " +
56 def find_bin(name, extra_path = None):
58 if "PATH" in os.environ:
59 search += os.environ["PATH"].split(":")
60 for pref in ("/", "/usr/", "/usr/local/"):
61 for d in ("bin", "sbin"):
62 search.append(pref + d)
68 os.stat(d + "/" + name)
71 if e.errno != os.errno.ENOENT:
75 ssh_path = find_bin_or_die("ssh")
76 python_path = find_bin_or_die("python")
79 rsh_path = find_bin("rsh")
80 tcpdump_path = find_bin("tcpdump")
81 sshd_path = find_bin("sshd")
84 # FIXME: create a global debug variable
85 #print "[pid %d]" % os.getpid(), " ".join(cmd)
86 null = open("/dev/null", "r+")
87 p = subprocess.Popen(cmd, stdout = null, stderr = subprocess.PIPE)
88 out, err = p.communicate()
90 raise RuntimeError("Error executing `%s': %s" % (" ".join(cmd), err))
93 p = subprocess.Popen(cmd, stdout = subprocess.PIPE,
94 stderr = subprocess.PIPE)
95 out, err = p.communicate()
97 raise RuntimeError("Error executing `%s': %s" % (" ".join(cmd), err))
103 def gen_ssh_keypair(filename):
104 ssh_keygen = nepi.util.environ.find_bin_or_die("ssh-keygen")
105 args = [ssh_keygen, '-q', '-N', '', '-f', filename]
106 assert subprocess.Popen(args).wait() == 0
107 return filename, "%s.pub" % filename
109 def add_key_to_agent(filename):
110 ssh_add = nepi.util.environ.find_bin_or_die("ssh-add")
111 args = [ssh_add, filename]
112 null = file("/dev/null", "w")
113 assert subprocess.Popen(args, stderr = null).wait() == 0
118 s.bind(("127.0.0.1", 0))
119 port = s.getsockname()[1]
122 _SSH_CONF = """ListenAddress 127.0.0.1:%d
125 UsePrivilegeSeparation no
126 PubkeyAuthentication yes
127 PasswordAuthentication no
128 AuthorizedKeysFile %s
130 AllowAgentForwarding yes
133 PermitUserEnvironment yes
136 def gen_sshd_config(filename, port, server_key, auth_keys):
137 conf = open(filename, "w")
138 text = _SSH_CONF % (port, server_key, auth_keys)
143 def gen_auth_keys(pubkey, output, environ):
144 #opts = ['from="127.0.0.1/32"'] # fails in stupid yans setup
146 for k, v in environ.items():
147 opts.append('environment="%s=%s"' % (k, v))
149 lines = file(pubkey).readlines()
150 pubkey = lines[0].split()[0:2]
151 out = file(output, "w")
152 out.write("%s %s %s\n" % (",".join(opts), pubkey[0], pubkey[1]))
156 def start_ssh_agent():
157 ssh_agent = nepi.util.environ.find_bin_or_die("ssh-agent")
158 proc = subprocess.Popen([ssh_agent], stdout = subprocess.PIPE)
159 (out, foo) = proc.communicate()
160 assert proc.returncode == 0
162 for l in out.split("\n"):
163 match = re.search("^(\w+)=([^ ;]+);.*", l)
166 k, v = match.groups()
171 def stop_ssh_agent(data):
172 # No need to gather the pid, ssh-agent knows how to kill itself; after we
173 # had set up the environment
174 ssh_agent = nepi.util.environ.find_bin_or_die("ssh-agent")
175 null = file("/dev/null", "w")
176 proc = subprocess.Popen([ssh_agent, "-k"], stdout = null)
178 assert proc.wait() == 0