summaryrefslogtreecommitdiffstats
path: root/scripts/lib
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/lib')
-rw-r--r--scripts/lib/mic/utils/misc.py180
1 files changed, 1 insertions, 179 deletions
diff --git a/scripts/lib/mic/utils/misc.py b/scripts/lib/mic/utils/misc.py
index 8c1f0160b1..010b16ca49 100644
--- a/scripts/lib/mic/utils/misc.py
+++ b/scripts/lib/mic/utils/misc.py
@@ -18,29 +18,9 @@
18import os 18import os
19import sys 19import sys
20import time 20import time
21import tempfile
22import re
23import shutil
24import glob
25import hashlib
26import subprocess
27import platform
28import traceback
29
30
31try:
32 import sqlite3 as sqlite
33except ImportError:
34 import sqlite
35
36try:
37 from xml.etree import cElementTree
38except ImportError:
39 import cElementTree
40xmlparse = cElementTree.parse
41 21
42from mic import msger 22from mic import msger
43from mic.utils.errors import CreatorError, SquashfsError 23from mic.utils.errors import CreatorError
44from mic.utils.fs_related import find_binary_path, makedirs 24from mic.utils.fs_related import find_binary_path, makedirs
45from mic.utils import runner 25from mic.utils import runner
46 26
@@ -82,115 +62,6 @@ def build_name(kscfg, release=None, prefix = None, suffix = None):
82 ret = prefix + name + suffix 62 ret = prefix + name + suffix
83 return ret 63 return ret
84 64
85def get_distro():
86 """Detect linux distribution, support "meego"
87 """
88
89 support_dists = ('SuSE',
90 'debian',
91 'fedora',
92 'redhat',
93 'centos',
94 'meego',
95 'moblin',
96 'tizen')
97 try:
98 (dist, ver, id) = platform.linux_distribution( \
99 supported_dists = support_dists)
100 except:
101 (dist, ver, id) = platform.dist( \
102 supported_dists = support_dists)
103
104 return (dist, ver, id)
105
106def get_distro_str():
107 """Get composited string for current linux distribution
108 """
109 (dist, ver, id) = get_distro()
110
111 if not dist:
112 return 'Unknown Linux Distro'
113 else:
114 distro_str = ' '.join(map(str.strip, (dist, ver, id)))
115 return distro_str.strip()
116
117_LOOP_RULE_PTH = None
118
119def human_size(size):
120 """Return human readable string for Bytes size
121 """
122
123 if size <= 0:
124 return "0M"
125 import math
126 measure = ['B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']
127 expo = int(math.log(size, 1024))
128 mant = float(size/math.pow(1024, expo))
129 return "{0:.1f}{1:s}".format(mant, measure[expo])
130
131def get_block_size(file_obj):
132 """ Returns block size for file object 'file_obj'. Errors are indicated by
133 the 'IOError' exception. """
134
135 from fcntl import ioctl
136 import struct
137
138 # Get the block size of the host file-system for the image file by calling
139 # the FIGETBSZ ioctl (number 2).
140 binary_data = ioctl(file_obj, 2, struct.pack('I', 0))
141 return struct.unpack('I', binary_data)[0]
142
143def check_space_pre_cp(src, dst):
144 """Check whether disk space is enough before 'cp' like
145 operations, else exception will be raised.
146 """
147
148 srcsize = get_file_size(src) * 1024 * 1024
149 freesize = get_filesystem_avail(dst)
150 if srcsize > freesize:
151 raise CreatorError("space on %s(%s) is not enough for about %s files"
152 % (dst, human_size(freesize), human_size(srcsize)))
153
154def calc_hashes(file_path, hash_names, start = 0, end = None):
155 """ Calculate hashes for a file. The 'file_path' argument is the file
156 to calculate hash functions for, 'start' and 'end' are the starting and
157 ending file offset to calculate the has functions for. The 'hash_names'
158 argument is a list of hash names to calculate. Returns the the list
159 of calculated hash values in the hexadecimal form in the same order
160 as 'hash_names'.
161 """
162 if end == None:
163 end = os.path.getsize(file_path)
164
165 chunk_size = 65536
166 to_read = end - start
167 read = 0
168
169 hashes = []
170 for hash_name in hash_names:
171 hashes.append(hashlib.new(hash_name))
172
173 with open(file_path, "rb") as f:
174 f.seek(start)
175
176 while read < to_read:
177 if read + chunk_size > to_read:
178 chunk_size = to_read - read
179 chunk = f.read(chunk_size)
180 for hash_obj in hashes:
181 hash_obj.update(chunk)
182 read += chunk_size
183
184 result = []
185 for hash_obj in hashes:
186 result.append(hash_obj.hexdigest())
187
188 return result
189
190def get_md5sum(fpath):
191 return calc_hashes(fpath, ('md5', ))[0]
192
193
194def normalize_ksfile(ksconf, release, arch): 65def normalize_ksfile(ksconf, release, arch):
195 ''' 66 '''
196 Return the name of a normalized ks file in which macro variables 67 Return the name of a normalized ks file in which macro variables
@@ -232,52 +103,3 @@ def normalize_ksfile(ksconf, release, arch):
232 atexit.register(remove_temp_ks) 103 atexit.register(remove_temp_ks)
233 104
234 return ksconf 105 return ksconf
235
236
237def selinux_check(arch, fstypes):
238 try:
239 getenforce = find_binary_path('getenforce')
240 except CreatorError:
241 return
242
243 selinux_status = runner.outs([getenforce])
244 if arch and arch.startswith("arm") and selinux_status == "Enforcing":
245 raise CreatorError("Can't create arm image if selinux is enabled, "
246 "please run 'setenforce 0' to disable selinux")
247
248 use_btrfs = filter(lambda typ: typ == 'btrfs', fstypes)
249 if use_btrfs and selinux_status == "Enforcing":
250 raise CreatorError("Can't create btrfs image if selinux is enabled,"
251 " please run 'setenforce 0' to disable selinux")
252
253def get_file_size(filename):
254 """ Return size in MB unit """
255 cmd = ['du', "-s", "-b", "-B", "1M", filename]
256 rc, duOutput = runner.runtool(cmd)
257 if rc != 0:
258 raise CreatorError("Failed to run: %s" % ' '.join(cmd))
259 size1 = int(duOutput.split()[0])
260
261 cmd = ['du', "-s", "-B", "1M", filename]
262 rc, duOutput = runner.runtool(cmd)
263 if rc != 0:
264 raise CreatorError("Failed to run: %s" % ' '.join(cmd))
265
266 size2 = int(duOutput.split()[0])
267 return max(size1, size2)
268
269
270def get_filesystem_avail(fs):
271 vfstat = os.statvfs(fs)
272 return vfstat.f_bavail * vfstat.f_bsize
273
274def mkdtemp(dir = "/var/tmp", prefix = "wic-tmp-"):
275 """ FIXME: use the dir in wic.conf instead """
276
277 makedirs(dir)
278 return tempfile.mkdtemp(dir = dir, prefix = prefix)
279
280def strip_end(text, suffix):
281 if not text.endswith(suffix):
282 return text
283 return text[:-len(suffix)]