fixed shebangs in non executable .py files
[nepi.git] / src / nepi / util / environ.py
1
2 import os, subprocess, os.path
3
4 __all__ =  ["python", "ssh_path"]
5 __all__ += ["rsh", "tcpdump_path", "sshd_path"]
6 __all__ += ["execute", "backticks"]
7
8 def find_bin(name, extra_path = None):
9     search = []
10     if "PATH" in os.environ:
11         search += os.environ["PATH"].split(":")
12     for pref in ("/", "/usr/", "/usr/local/"):
13         for d in ("bin", "sbin"):
14             search.append(pref + d)
15     if extra_path:
16         search += extra_path
17
18     for d in search:
19             try:
20                 os.stat(d + "/" + name)
21                 return d + "/" + name
22             except OSError, e:
23                 if e.errno != os.errno.ENOENT:
24                     raise
25     return None
26
27 def find_bin_or_die(name, extra_path = None):
28     r = find_bin(name)
29     if not r:
30         raise RuntimeError(("Cannot find `%s' command, impossible to " +
31                 "continue.") % name)
32     return r
33
34 ssh_path = find_bin_or_die("ssh")
35 python_path = find_bin_or_die("python")
36
37 # Optional tools
38 rsh_path = find_bin("rsh")
39 tcpdump_path = find_bin("tcpdump")
40 sshd_path = find_bin("sshd")
41
42 def execute(cmd):
43     # FIXME: create a global debug variable
44     #print "[pid %d]" % os.getpid(), " ".join(cmd)
45     null = open("/dev/null", "r+")
46     p = subprocess.Popen(cmd, stdout = null, stderr = subprocess.PIPE)
47     out, err = p.communicate()
48     if p.returncode != 0:
49         raise RuntimeError("Error executing `%s': %s" % (" ".join(cmd), err))
50
51 def backticks(cmd):
52     p = subprocess.Popen(cmd, stdout = subprocess.PIPE,
53             stderr = subprocess.PIPE)
54     out, err = p.communicate()
55     if p.returncode != 0:
56         raise RuntimeError("Error executing `%s': %s" % (" ".join(cmd), err))
57     return out
58
59 def homepath(path, app='.nepi', mode = 0500, directory = False):
60     home = os.environ.get('HOME')
61     if home is None:
62         home = os.path.join(os.sep, 'home', os.getlogin())
63     
64     path = os.path.join(home, app, path)
65     if directory:
66         dirname = path
67     else:
68         dirname = os.path.dirname(path)
69     if not os.path.exists(dirname):
70         os.makedirs(dirname)
71     
72     return path
73
74 def find_testbed(testbed_id):
75     mod_name = None
76     
77     # look for environment-specified testbeds
78     if 'NEPI_TESTBEDS' in os.environ:
79         try:
80             # parse testbed map
81             #   split space-separated items, filter empty items
82             testbed_map = filter(bool,os.environ['NEPI_TESTBEDS'].strip().split(' '))
83             #   split items, keep pairs only, build map
84             testbed_map = dict([map(str.strip,i.split(':',1)) for i in testbed_map if ':' in i])
85         except:
86             import traceback, sys
87             traceback.print_exc(file=sys.stderr)
88             
89             # ignore malformed environment
90             testbed_map = {}
91         
92         mod_name = testbed_map.get(testbed_id)
93     
94     if mod_name is None:
95         # no explicit map, load built-in testbeds
96         mod_name = "nepi.testbeds.%s" % (testbed_id.lower())
97
98     return mod_name
99