Newer
Older
# -*- coding: utf-8 -*-
# Started 26/05/2011 by Seblu <seblu@seblu.net>
'''
InstallSystems Generic Tools Library
'''
import os
from installsystems.tarball import Tarball
def md5sum(path=None, fileobj=None):
if path is None and fileobj is None:
raise ValueError("No path or fileobj specified")
if fileobj is None:
fileobj = uopen(path)
while True:
buf = fileobj.read(1024 * m.block_size)
if len(buf) == 0:
break
m.update(buf)
def smd5sum(buf):
'''
Compute md5 of a string
'''
m = hashlib.md5()
m.update(buf)
return m.hexdigest()
Copy data from sfile to dfile computing length and md5 on the fly
f_sum = hashlib.md5()
f_len = 0
while True:
buf = sfile.read(1024 * f_sum.block_size)
buf_len = len(buf)
if buf_len == 0:
break
f_len += buf_len
f_sum.update(buf)
def copy(source, destination, uid=None, gid=None, mode=None, timeout=None):
'''
Copy a source to destination. Take care of path type
'''
stype = pathtype(source)
dtype = pathtype(destination)
# ensure destination is not a directory
if dtype == "file" and os.path.isdir(destination):
destination = os.path.join(destination, os.path.basename(source))
# trivial case
if stype == dtype == "file":
shutil.copy(source, destination)
elif (stype == "http" or stype == "ftp") and dtype == "file":
f_dest = open(destination, "w")
f_source = urllib2.urlopen(source, timeout=timeout)
copyfileobj(f_source, f_dest)
raise NotImplementedError
else:
raise NotImplementedError
# setting destination file rights
if dtype == "file":
chrights(destination, uid, gid, mode)
def mkdir(path, uid=None, gid=None, mode=None):
chrights(path, uid, gid, mode)
if uid is not None:
os.chown(path, uid, -1)
if gid is not None:
os.chown(path, -1, gid)
if mode is not None:
os.chmod(path, mode)
'''
Return path type. This is usefull to know what kind of path is given
'''
if path.startswith("http://") or path.startswith("https://"):
return "http"
if path.startswith("ftp://") or path.startswith("ftps://"):
return "ftp"
def isfile(path):
'''
Return True if path is of type file
'''
return pathtype(path) == "file"
return path
elif ptype == "file":
if path.startswith("file://"):
return os.path.abspath(path)
else:
return None
Create a file-like object to a file which can be remote
'''
ftype = pathtype(path)
if ftype == "file":
elif ftype == "http" or ftype == "ftp":
else:
raise NotImplementedError
total_sz = os.path.getsize(path)
if os.path.isdir(path):
for root, dirs, files in os.walk(path):
for filename in dirs + files:
filepath = os.path.join(root, filename)
filestat = os.lstat(filepath)
if stat.S_ISDIR(filestat.st_mode) or stat.S_ISREG(filestat.st_mode):
total_sz += filestat.st_size
return total_sz
def human_size(num):
'''
Return human readable size
'''
for x in ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']:
if num < 1024.0:
return "%3.1f%s" % (num, x)
num /= 1024.0
return "%3.1f%s" % (num, x)