import types, os, sys, isys, select, string, stat def getArch (): arch = os.uname ()[4] if (len (arch) == 4 and arch[0] == 'i' and arch[2:4] == "86"): arch = "i386" if arch == "sparc64": arch = "sparc" return arch def getfd(filespec, readOnly = 0): if type(filespec) == types.IntType: return filespec if filespec == None: filespec = "/dev/null" flags = os.O_RDWR | os.O_CREAT if (readOnly): flags = os.O_RDONLY return os.open(filespec, flags) def execWithRedirect(command, argv, stdin = 0, stdout = 1, stderr = 2, searchPath = 0, root = '/'): stdin = getfd(stdin) if stdout == stderr: stdout = getfd(stdout) stderr = stdout else: stdout = getfd(stdout) stderr = getfd(stderr) if not os.access (root + command, os.X_OK): if not os.access (command, os.X_OK): raise RuntimeError, command + " can not be run" else: root = "" childpid = os.fork() if (not childpid): if (root and root != '/'): isys.chroot (root) if type(stdin) == type("a"): stdin == os.open(stdin, os.O_RDONLY) if type(stdout) == type("a"): stdout == os.open(stdout, os.O_RDWR) if type(stderr) == type("a"): stderr = os.open(stderr, os.O_RDWR) if stdin != 0: os.dup2(stdin, 0) os.close(stdin) if stdout != 1: os.dup2(stdout, 1) if stdout != stderr: os.close(stdout) if stderr != 2: os.dup2(stderr, 2) os.close(stderr) if (searchPath): os.execvp(command, argv) else: os.execv(command, argv) sys.exit(1) (pid, status) = os.waitpid(childpid, 0) return status def execWithCapture(command, argv, searchPath = 0, root = '/', stdin = 0): if not os.access (root + command, os.X_OK): if not os.access (command, os.X_OK): raise RuntimeError, command + " can not be run" else: root = "" (read, write) = os.pipe() childpid = os.fork() if (not childpid): if (root and root != '/'): isys.chroot (root) os.dup2(write, 1) if stdin: os.dup2(stdin, 0) os.close(stdin) if (searchPath): os.execvp(command, argv) else: os.execv(command, argv) sys.exit(1) os.close(write) rc = "" s = "1" while (s): select.select([read], [], []) s = os.read(read, 1000) rc = rc + s os.close(read) os.waitpid(childpid, 0) return rc def copyFile(source, to): f = os.open(source, os.O_RDONLY) t = os.open(to, os.O_RDWR | os.O_TRUNC | os.O_CREAT) count = os.read(f, 16384) while (count): os.write(t, count) count = os.read(f, 16384) os.close(f) os.close(t) def memInstalled(): f = open("/proc/meminfo", "r") mem = f.readlines()[1] del f fields = string.split(mem) return int(fields[1]) / 1024 # this is a mkdir that won't fail if a directory already exists and will # happily make all of the directories leading up to it. def mkdirChain(dir): if (os.path.isdir(dir)): return elements = string.splitfields(dir, "/") if (len(elements[0])): which = 1 path = elements[0] else: which = 2 path = "/" + elements[1] if (not os.path.isdir(path)): os.mkdir(path, 0755) while (which < len(elements)): path = path + "/" + elements[which] which = which + 1 if (not os.path.isdir(path)): os.mkdir(path, 0755) # # get default runlevel - only for use in reconfig mode # def getDefaultRunlevel (): inittab = open ('/etc/inittab', 'r') lines = inittab.readlines () inittab.close () for line in lines: if len (line) > 3 and line[:3] == "id:": fields = string.split (line, ':') return fields[1] return None def makerelname(relpath, filename): if relpath != '': return relpath+'/'+filename else: return filename def findtz(basepath, relpath): tzdata = [] for n in os.listdir(basepath+'/'+relpath): timezone = makerelname(relpath, n) if relpath != '': timezone = relpath+'/'+n else: timezone = n filestat = os.lstat(basepath+'/'+timezone) [filemode] = filestat[:1] if (not (stat.S_ISLNK(filemode) or stat.S_ISREG(filemode) or stat.S_ISDIR(filemode))): continue elif n[:1] >= 'A' and n[:1] <= 'Z': if stat.S_ISDIR(filemode): tmptzdata = findtz(basepath, timezone) else: tmptzdata = [timezone] for m in tmptzdata: if tzdata == []: tzdata = [m] else: tzdata.append(m) tzdata.sort() return tzdata