5 # The contents of this file are subject to the terms of the
6 # Common Development and Distribution License (the "License").
7 # You may not use this file except in compliance with the License.
9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 # or http://www.opensolaris.org/os/licensing.
11 # See the License for the specific language governing permissions
12 # and limitations under the License.
14 # When distributing Covered Code, include this CDDL HEADER in each
15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 # If applicable, add the following below this CDDL HEADER, with the
17 # fields enclosed by brackets "[]" replaced with your own identifying
18 # information: Portions Copyright [yyyy] [name of copyright owner]
31 def run_command(command, raise_on_try=True):
33 Wrapper function around subprocess.Popen
34 Returns a tuple of standard out and stander error.
35 Throws a RunTimeError if the command failed to execute or
36 if the command returns a non-zero exit status.
39 debug("Trying to run command %s" % (command), True)
41 p = subprocess.Popen(command,
42 stdout=subprocess.PIPE,
43 stderr=subprocess.PIPE,
45 outdata,errdata = p.communicate()
47 except OSError, message:
48 raise RuntimeError, "%s subprocess error:\n %s" % \
49 (command, str(message))
50 if err != 0 and raise_on_try:
51 raise RuntimeError, '%s failed with exit code %d\n%s' % \
52 (str(command), err, errdata)
53 return outdata,errdata
55 def debug(message, verbose):
57 Prints message out to standard error and syslog if
59 Note that the caller needs to first establish a syslog
60 context using syslog.openlog()
63 syslog.syslog(syslog.LOG_NOTICE, message + '\n')
64 sys.stderr.write(message + '\n')
66 def log_error(loglevel, message):
68 Trivial syslog wrapper that also outputs to stderr
69 Requires caller to have first opened a syslog session
70 using syslog.openlog()
72 syslog.syslog(loglevel, message + '\n')
73 sys.stderr.write(message + '\n')
75 def get_filesystem_capacity(path):
76 """Returns filesystem space usage of path as an integer percentage of
77 the entire capacity of path.
79 if not os.path.exists(path):
80 raise ValueError("%s is a non-existent path" % path)
83 unavailBlocks = f[statvfs.F_BLOCKS] - f[statvfs.F_BAVAIL]
84 capacity = int(math.ceil(100 * (unavailBlocks / float(f[statvfs.F_BLOCKS]))))
88 def get_available_size(path):
89 """Returns the available space in bytes under path"""
90 if not os.path.exists(path):
91 raise ValueError("%s is a non-existent path" % path)
93 free = long(f[statvfs.F_BAVAIL] * f[statvfs.F_FRSIZE])
97 def get_used_size(path):
98 """Returns the used space in bytes of fileystem associated
100 if not os.path.exists(path):
101 raise ValueError("%s is a non-existent path" % path)
104 unavailBlocks = f[statvfs.F_BLOCKS] - f[statvfs.F_BAVAIL]
105 used = long(unavailBlocks * f[statvfs.F_FRSIZE])
109 def get_total_size(path):
110 """Returns the total storage space in bytes of fileystem
111 associated with path"""
112 if not os.path.exists(path):
113 raise ValueError("%s is a non-existent path" % path)
115 total = long(f[statvfs.F_BLOCKS] * f[statvfs.F_FRSIZE])
119 def path_to_volume(path):
121 Tries to map a given path name to a gio Volume and
122 returns the gio.Volume object the enclosing
124 If it fails to find an enclosing volume it returns
127 gFile = gio.File(path)
129 mount = gFile.find_enclosing_mount()
134 volume = mount.get_volume()